Exemple #1
0
 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));
        }
Exemple #3
0
        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();
        }
Exemple #4
0
        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();
        }
Exemple #5
0
        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();
        }
Exemple #6
0
        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();
        }
Exemple #7
0
        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();
        }
Exemple #8
0
        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()));
        }
Exemple #9
0
        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);
            }
        }
Exemple #12
0
 public static CodeBlockBuilder AddLine(
     this CodeBlockBuilder builder,
     string code)
 {
     return(builder.AddCode(CodeLineBuilder.From(code)));
 }
Exemple #13
0
 public MethodBuilder AddCode(string value)
 {
     _lines.Add(CodeLineBuilder.New().SetLine(value));
     return(this);
 }
Exemple #14
0
        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);
 }
Exemple #16
0
        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);
        }