private static void AddProperties( InputModelSerializerDescriptor descriptor, ClassBuilder builder) { builder .AddProperty(PropertyBuilder.New() .SetAccessModifier(AccessModifier.Public) .SetType("string") .SetName("Name") .SetGetter(CodeLineBuilder.New() .SetLine($"return \"{descriptor.InputGraphQLTypeName}\";"))) .AddProperty(PropertyBuilder.New() .SetAccessModifier(AccessModifier.Public) .SetType("global::StrawberryShake.ValueKind") .SetName("Kind") .SetGetter(CodeLineBuilder.New() .SetLine($"return global::StrawberryShake.ValueKind.InputObject;"))) .AddProperty(PropertyBuilder.New() .SetAccessModifier(AccessModifier.Public) .SetType("global::System.Type") .SetName("ClrType") .SetGetter(CodeLineBuilder.New() .SetLine($"return typeof({descriptor.InputTypeName});"))) .AddProperty(PropertyBuilder.New() .SetAccessModifier(AccessModifier.Public) .SetType("global::System.Type") .SetName("SerializationType") .SetGetter(CodeLineBuilder.New() .SetLine( "return typeof(global::System.Collections.Generic." + "IReadOnlyDictionary<string, object>);"))); }
protected override Task WriteAsync( CodeWriter writer, OperationModelDescriptor descriptor) { if (writer is null) { throw new ArgumentNullException(nameof(writer)); } if (descriptor is null) { throw new ArgumentNullException(nameof(descriptor)); } ClassBuilder classBuilder = ClassBuilder.New() .SetAccessModifier(AccessModifier.Public) .SetName(descriptor.Name) .AddImplements($"global::StrawberryShake.IOperation<{descriptor.ResultType}>") .AddProperty(PropertyBuilder.New() .SetAccessModifier(AccessModifier.Public) .SetType("string") .SetName("Name") .SetGetter(CodeLineBuilder.New() .SetLine($"return \"{descriptor.GraphQLName}\";"))) .AddProperty(PropertyBuilder.New() .SetAccessModifier(AccessModifier.Public) .SetType("global::StrawberryShake.IDocument") .SetName("Document") .SetGetter(CodeLineBuilder.New() .SetLine($"return {descriptor.DocumentType}.Default;"))) .AddProperty(PropertyBuilder.New() .SetAccessModifier(AccessModifier.Public) .SetType("global::StrawberryShake.OperationKind") .SetName("Kind") .SetGetter(CodeLineBuilder.New() .SetLine($"return OperationKind.{descriptor.OperationKind};"))) .AddProperty(PropertyBuilder.New() .SetAccessModifier(AccessModifier.Public) .SetType("global::System.Type") .SetName("ResultType") .SetGetter(CodeLineBuilder.New() .SetLine($"return typeof({descriptor.ResultType});"))); AddConstructor(classBuilder, descriptor.Arguments); AddArgumentProperties(classBuilder, descriptor.Arguments); AddGetVariableValues(classBuilder, descriptor.Arguments, CodeWriter.Indent); return(CodeFileBuilder.New() .SetNamespace(descriptor.Namespace) .AddType(classBuilder) .BuildAsync(writer)); }
public async Task CreateCodeLine() { // arrange var sb = new StringBuilder(); var writer = new CodeWriter(sb); // act await CodeLineBuilder.New() .SetLine("abcd;") .BuildAsync(writer); // assert sb.ToString().MatchSnapshot(); }
public async Task CreateConstructor() { // arrange var sb = new StringBuilder(); var writer = new CodeWriter(sb); // act await ConstructorBuilder.New() .SetTypeName("GetAbc") .AddCode(CodeLineBuilder.New().SetLine("return;")) .BuildAsync(writer); // assert sb.ToString().MatchSnapshot(); }
public async Task CreateMethod_With_ReturnType() { // arrange var sb = new StringBuilder(); var writer = new CodeWriter(sb); // act await MethodBuilder.New() .SetName("GetAbc") .SetReturnType("Int32") .AddCode(CodeLineBuilder.New().SetLine("return;")) .BuildAsync(writer); // assert sb.ToString().MatchSnapshot(); }
public async Task CreateMethod_With_Two_Parameter() { // arrange var sb = new StringBuilder(); var writer = new CodeWriter(sb); // act await MethodBuilder.New() .SetName("GetAbc") .AddCode(CodeLineBuilder.New().SetLine("return;")) .AddParameter(ParameterBuilder.New().SetName("abc").SetType("String")) .AddParameter(ParameterBuilder.New().SetName("def").SetType("String").SetDefault()) .BuildAsync(writer); // assert sb.ToString().MatchSnapshot(); }
public async Task CreateExtensionMethod() { // arrange var sb = new StringBuilder(); var writer = new CodeWriter(sb); // act await MethodBuilder.New() .SetName("GetAbc") .SetStatic() .AddParameter(ParameterBuilder.New().SetName("abc").SetType("this String")) .AddCode(CodeLineBuilder.New().SetLine("return;")) .BuildAsync(writer); // assert sb.ToString().MatchSnapshot(); }
public async Task CreateConstructor_With_AccessModifier(AccessModifier accessModifier) { // arrange var sb = new StringBuilder(); var writer = new CodeWriter(sb); // act await ConstructorBuilder.New() .SetTypeName("GetAbc") .SetAccessModifier(accessModifier) .AddCode(CodeLineBuilder.New().SetLine("return;")) .BuildAsync(writer); // assert sb.ToString().MatchSnapshot( new SnapshotNameExtension( accessModifier.ToString())); }
public async Task CreateMethod_With_Inheritance(Inheritance inheritance) { // arrange var sb = new StringBuilder(); var writer = new CodeWriter(sb); // act await MethodBuilder.New() .SetName("GetAbc") .SetInheritance(inheritance) .AddCode(CodeLineBuilder.New().SetLine("return;")) .BuildAsync(writer); // assert sb.ToString().MatchSnapshot( new SnapshotNameExtension( inheritance.ToString())); }
public async Task CreateProperty_With_Custom_Getter_And_Custom_Setter() { // arrange var sb = new StringBuilder(); var writer = new CodeWriter(sb); // act await PropertyBuilder.New() .SetName("Foo") .SetType("Bar") .SetGetter(CodeLineBuilder.New().SetLine("return _value;")) .SetSetterAccessModifier(AccessModifier.Private) .SetSetter(CodeLineBuilder.New().SetLine("_value = value;")) .MakeSettable() .BuildAsync(writer); // assert sb.ToString().MatchSnapshot(); }
private void AddDeserializeMethod( ITypeDescriptor typeReference, ClassBuilder classBuilder, HashSet <string> processed) { string methodName = DeserializerMethodNameFromTypeName(typeReference); if (processed.Add(methodName)) { MethodBuilder methodBuilder = classBuilder .AddMethod() .SetPrivate() .SetReturnType(typeReference.ToEntityIdBuilder()) .SetName(methodName); methodBuilder .AddParameter(_obj) .SetType(TypeNames.JsonElement.MakeNullable()); if (typeReference.IsEntityType() || typeReference.ContainsEntity()) { methodBuilder .AddParameter(_entityIds) .SetType(TypeNames.ISet.WithGeneric(TypeNames.EntityId)); } IfBuilder jsonElementNullCheck = IfBuilder .New() .SetCondition($"!{_obj}.HasValue") .AddCode( typeReference.IsNonNullableType() ? ExceptionBuilder.New(TypeNames.ArgumentNullException) : CodeLineBuilder.From("return null;")); methodBuilder .AddCode(jsonElementNullCheck) .AddEmptyLine(); AddDeserializeMethodBody(classBuilder, methodBuilder, typeReference, processed); } }
public static CodeBlockBuilder AddLine( this CodeBlockBuilder builder, string code) { return(builder.AddCode(CodeLineBuilder.From(code))); }
public MethodBuilder AddCode(string value) { _lines.Add(CodeLineBuilder.New().SetLine(value)); return(this); }
protected override Task WriteAsync( CodeWriter writer, EnumValueSerializerDescriptor descriptor) { if (writer is null) { throw new ArgumentNullException(nameof(writer)); } if (descriptor is null) { throw new ArgumentNullException(nameof(descriptor)); } return(ClassBuilder.New() .SetAccessModifier(AccessModifier.Public) .SetSealed() .SetName(descriptor.Name) .AddImplements("global::StrawberryShake.IValueSerializer") .AddProperty(PropertyBuilder.New() .SetAccessModifier(AccessModifier.Public) .SetType("string") .SetName("Name") .SetGetter(CodeLineBuilder.New() .SetLine($"return \"{descriptor.EnumGraphQLTypeName}\";"))) .AddProperty(PropertyBuilder.New() .SetAccessModifier(AccessModifier.Public) .SetType("global::StrawberryShake.ValueKind") .SetName("Kind") .SetGetter(CodeLineBuilder.New() .SetLine($"return global::StrawberryShake.ValueKind.Enum;"))) .AddProperty(PropertyBuilder.New() .SetAccessModifier(AccessModifier.Public) .SetType("global::System.Type") .SetName("ClrType") .SetGetter(CodeLineBuilder.New() .SetLine($"return typeof({descriptor.EnumTypeName});"))) .AddProperty(PropertyBuilder.New() .SetAccessModifier(AccessModifier.Public) .SetType("global::System.Type") .SetName("SerializationType") .SetGetter(CodeLineBuilder.New() .SetLine($"return typeof(string);"))) .AddMethod(MethodBuilder.New() .SetAccessModifier(AccessModifier.Public) .SetReturnType("object?", NullableRefTypes) .SetReturnType("object", !NullableRefTypes) .SetName("Serialize") .AddParameter(ParameterBuilder.New() .SetType("object?", NullableRefTypes) .SetType("object", !NullableRefTypes) .SetName("value")) .AddCode(CreateSerializerMethodBody(descriptor, CodeWriter.Indent))) .AddMethod(MethodBuilder.New() .SetAccessModifier(AccessModifier.Public) .SetReturnType("object?", NullableRefTypes) .SetReturnType("object", !NullableRefTypes) .SetName("Deserialize") .AddParameter(ParameterBuilder.New() .SetType("object?", NullableRefTypes) .SetType("object", !NullableRefTypes) .SetName("serialized")) .AddCode(CreateDeserializerMethodBody(descriptor, CodeWriter.Indent))) .BuildAsync(writer)); }
public ConstructorBuilder AddCode(string value) { _lines.Add(CodeLineBuilder.New().SetLine(value)); return(this); }
private void AddBuildDataMethod( NamedTypeDescriptor resultNamedType, ClassBuilder classBuilder) { var objParameter = "obj"; var buildDataMethod = MethodBuilder.New() .SetAccessModifier(AccessModifier.Private) .SetName("BuildData") .SetReturnType( $"({resultNamedType.Name}, " + $"{ResultInfoNameFromTypeName(resultNamedType.ImplementedBy[0].Name)})") .AddParameter( ParameterBuilder.New() .SetType(TypeNames.JsonElement) .SetName(objParameter)); var sessionName = "session"; buildDataMethod.AddCode( CodeLineBuilder.New() .SetLine( CodeBlockBuilder.New() .AddCode( $"using {TypeNames.IEntityUpdateSession} {sessionName} = ") .AddCode(_entityStoreFieldName + ".BeginUpdate();"))); var entityIdsName = "entityIds"; buildDataMethod.AddCode( CodeLineBuilder.New() .SetLine( $"var {entityIdsName} = new {TypeNames.HashSet}<{TypeNames.EntityId}>();")); buildDataMethod.AddEmptyLine(); foreach (PropertyDescriptor property in resultNamedType.Properties.Where(prop => prop.Type.IsEntityType())) { buildDataMethod.AddCode( AssignmentBuilder.New() .SetLefthandSide(CodeBlockBuilder.New() .AddCode(property.Type.ToEntityIdBuilder()) .AddCode($"{property.Name.WithLowerFirstChar()}Id")) .SetRighthandSide(BuildUpdateMethodCall(property, ""))); } var resultInfoConstructor = MethodCallBuilder.New() .SetMethodName( $"new {ResultInfoNameFromTypeName(resultNamedType.ImplementedBy[0].Name)}") .SetDetermineStatement(false); foreach (PropertyDescriptor property in resultNamedType.Properties) { if (property.Type.IsEntityType()) { resultInfoConstructor.AddArgument($"{property.Name.WithLowerFirstChar()}Id"); } else { resultInfoConstructor.AddArgument(BuildUpdateMethodCall(property, "")); } } resultInfoConstructor.AddArgument(entityIdsName); resultInfoConstructor.AddArgument( $"{sessionName}.{TypeNames.IEntityUpdateSession_Version}"); buildDataMethod.AddEmptyLine(); var resultInfoName = "resultInfo"; buildDataMethod.AddCode( AssignmentBuilder.New() .SetLefthandSide($"var {resultInfoName}") .SetRighthandSide(resultInfoConstructor)); buildDataMethod.AddEmptyLine(); buildDataMethod.AddCode( $"return ({_resultDataFactoryFieldName}" + $".Create({resultInfoName}), {resultInfoName});"); classBuilder.AddMethod(buildDataMethod); }