protected override async Task WriteAsync(
            CodeWriter writer,
            IEnumDescriptor descriptor,
            ITypeLookup typeLookup)
        {
            await writer.WriteIndentedLineAsync("public enum {0}", descriptor.Name);

            await writer.WriteIndentedLineAsync("{");

            using (writer.IncreaseIndent())
            {
                for (int i = 0; i < descriptor.Values.Count; i++)
                {
                    await writer.WriteIndentAsync();

                    await writer.WriteAsync(descriptor.Values[i].Name);

                    if (i < descriptor.Values.Count - 1)
                    {
                        await writer.WriteAsync(",");
                    }

                    await writer.WriteLineAsync();
                }
            }

            await writer.WriteIndentedLineAsync("}");
        }
        private async Task WriteObjectPropertyDeserializationAsync(
            CodeWriter writer,
            IResultParserTypeDescriptor possibleType,
            string jsonElement,
            ITypeLookup typeLookup)
        {
            for (int i = 0; i < possibleType.ResultDescriptor.Fields.Count; i++)
            {
                IFieldDescriptor fieldDescriptor = possibleType.ResultDescriptor.Fields[i];

                await writer.WriteIndentAsync().ConfigureAwait(false);

                if (fieldDescriptor.Type.NamedType().IsLeafType())
                {
                    ITypeInfo typeInfo = typeLookup.GetTypeInfo(
                        fieldDescriptor.Type,
                        true);

                    string deserializeMethod =
                        SerializerNameUtils.CreateDeserializerName(
                            fieldDescriptor.Type);

                    await writer.WriteAsync(deserializeMethod).ConfigureAwait(false);

                    await writer.WriteAsync('(').ConfigureAwait(false);

                    await writer.WriteAsync(jsonElement).ConfigureAwait(false);

                    await writer.WriteAsync(", \"").ConfigureAwait(false);

                    await writer.WriteAsync(fieldDescriptor.ResponseName).ConfigureAwait(false);

                    await writer.WriteAsync("\")").ConfigureAwait(false);
                }
                else
                {
                    await writer.WriteAsync("Parse").ConfigureAwait(false);

                    await writer.WriteAsync(GetPathName(fieldDescriptor.Path))
                    .ConfigureAwait(false);

                    await writer.WriteAsync('(').ConfigureAwait(false);

                    await writer.WriteAsync(jsonElement).ConfigureAwait(false);

                    await writer.WriteAsync(", \"").ConfigureAwait(false);

                    await writer.WriteAsync(fieldDescriptor.ResponseName).ConfigureAwait(false);

                    await writer.WriteAsync("\")").ConfigureAwait(false);
                }

                if (i < possibleType.ResultDescriptor.Fields.Count - 1)
                {
                    await writer.WriteAsync(',').ConfigureAwait(false);
                }

                await writer.WriteLineAsync().ConfigureAwait(false);
            }
        }
Exemple #3
0
        protected override async Task WriteAsync(
            CodeWriter writer,
            IEnumDescriptor descriptor,
            ITypeLookup typeLookup)
        {
            await writer.WriteIndentedLineAsync(
                $"{ModelAccessModifier} partial enum {descriptor.Name}")
            .ConfigureAwait(false);

            await writer.WriteIndentedLineAsync("{")
            .ConfigureAwait(false);

            using (writer.IncreaseIndent())
            {
                for (int i = 0; i < descriptor.Values.Count; i++)
                {
                    await writer.WriteIndentAsync().ConfigureAwait(false);

                    await writer.WriteAsync(descriptor.Values[i].Name).ConfigureAwait(false);

                    if (i < descriptor.Values.Count - 1)
                    {
                        await writer.WriteAsync(",").ConfigureAwait(false);
                    }

                    await writer.WriteLineAsync().ConfigureAwait(false);
                }
            }

            await writer.WriteIndentedLineAsync("}").ConfigureAwait(false);
        }
        private async Task WriteDeserializeLeafListAsync(
            CodeWriter writer,
            ITypeLookup typeLookup,
            string methodName,
            IType type,
            string schemaTypeName,
            string serializerMethod)
        {
            IType  elementType        = type.ElementType();
            string clrTypeName        = typeLookup.GetLeafClrTypeName(type);
            string clrElementTypeName = typeLookup.GetLeafClrTypeName(elementType);

            await WriteDeserializerMethodAsync(
                writer, methodName, clrTypeName, async() =>
            {
                await WriteNullHandlingAsync(
                    writer, "obj", "list", type.IsNonNullType())
                .ConfigureAwait(false);
                await WriteDeserializeListAsync(
                    writer, "list", "i", "element",
                    clrElementTypeName, elementType.IsNonNullType(),
                    () => WriteAddElementAsync(
                        writer, clrElementTypeName, schemaTypeName,
                        "list", "i", "element", serializerMethod))
                .ConfigureAwait(false);
            }).ConfigureAwait(false);

            ;
        }
        protected static async Task <string> WriteAllAsync(
            IReadOnlyCollection <ICodeDescriptor> descriptors,
            ITypeLookup typeLookup)
        {
            var generators = new ICodeGenerator[]
            {
                new InterfaceGenerator(),
                new ClassGenerator()
            };

            using (var stream = new MemoryStream())
            {
                using (var sw = new StreamWriter(stream, Encoding.UTF8))
                {
                    using (var cw = new CodeWriter(sw))
                    {
                        foreach (ICodeGenerator generator in generators)
                        {
                            foreach (ICodeDescriptor descriptor in descriptors)
                            {
                                if (generator.CanHandle(descriptor))
                                {
                                    await generator.WriteAsync(
                                        cw, descriptor, typeLookup);

                                    await cw.WriteLineAsync();
                                }
                            }
                        }
                    }
                }
                return(Encoding.UTF8.GetString(stream.ToArray()));
            }
        }
Exemple #6
0
            public async Task WriteAllAsync(ITypeLookup typeLookup)
            {
                var usedNames = new HashSet <string>();

                using (var stream = new MemoryStream())
                {
                    using (var sw = new StreamWriter(stream, Encoding.UTF8))
                    {
                        using (var cw = new CodeWriter(sw))
                        {
                            foreach (GeneratorTask task in _tasks)
                            {
                                if (task.Descriptor.GetType() != typeof(QueryDescriptor))
                                {
                                    await task.Generator.WriteAsync(
                                        cw, task.Descriptor, typeLookup);

                                    await cw.WriteLineAsync();

                                    await cw.WriteLineAsync();
                                }
                            }
                        }
                    }

                    Content = Encoding.UTF8.GetString(stream.ToArray());
                }
            }
        private async Task WriteParserForSingleResultType(
            CodeWriter writer,
            IResultParserMethodDescriptor methodDescriptor,
            IResultParserTypeDescriptor possibleType,
            ITypeLookup typeLookup)
        {
            if (methodDescriptor.ResultType.IsListType())
            {
                await WriteListAsync(
                    writer,
                    methodDescriptor,
                    possibleType,
                    "obj",
                    "element",
                    "list",
                    "entity",
                    typeLookup);
            }
            else
            {
                await WriteCreateObjectAsync(
                    writer,
                    methodDescriptor,
                    possibleType,
                    "obj",
                    typeLookup);
            }

            await writer.WriteLineAsync();
        }
Exemple #8
0
        protected override Task WriteAsync(
            CodeWriter writer,
            IServicesDescriptor descriptor,
            ITypeLookup typeLookup) =>
        WriteStaticClassAsync(writer, descriptor.Name, async() =>
        {
            await WriteAddClientAsync(writer, descriptor).ConfigureAwait(false);
            await writer.WriteLineAsync().ConfigureAwait(false);

            await WriteAddSerializersAsync(writer, descriptor.Client).ConfigureAwait(false);
            await writer.WriteLineAsync().ConfigureAwait(false);

            await WriteAddEnumSerializersAsync(writer, descriptor).ConfigureAwait(false);
            await writer.WriteLineAsync().ConfigureAwait(false);

            await WriteAddInputSerializersAsync(writer, descriptor).ConfigureAwait(false);
            await writer.WriteLineAsync().ConfigureAwait(false);

            await WriteAddResultParsersAsync(writer, descriptor).ConfigureAwait(false);
            await writer.WriteLineAsync().ConfigureAwait(false);

            await WriteTryAddDefaultOperationSerializerAsync(writer).ConfigureAwait(false);
            await writer.WriteLineAsync().ConfigureAwait(false);

            await WriteTryAddDefaultHttpPipelineAsync(writer).ConfigureAwait(false);
            await writer.WriteLineAsync().ConfigureAwait(false);

            await WriteClientFactoryAsync(writer, descriptor.Client).ConfigureAwait(false);
            await writer.WriteLineAsync().ConfigureAwait(false);

            await WritePipelineFactoryAsync(writer, descriptor.Client).ConfigureAwait(false);
        });
        private async Task WriteParserForSingleResultType(
            CodeWriter writer,
            IResultParserMethodDescriptor methodDescriptor,
            IResultParserTypeDescriptor possibleType,
            ITypeLookup typeLookup)
        {
            if (methodDescriptor.ResultType.IsListType())
            {
                await WriteListAsync(
                    writer,
                    methodDescriptor,
                    "obj",
                    "element",
                    "list",
                    typeLookup)
                .ConfigureAwait(false);
            }
            else
            {
                await writer.WriteIndentAsync().ConfigureAwait(false);

                await writer.WriteAsync("return ").ConfigureAwait(false);
                await WriteCreateObjectAsync(
                    writer,
                    methodDescriptor,
                    possibleType,
                    "obj",
                    typeLookup)
                .ConfigureAwait(false);
            }
        }
        public async Task WriteAsync(
            CodeWriter writer,
            ICodeDescriptor descriptor,
            ITypeLookup typeLookup)
        {
            await WriteUsings(writer, _innerGenerator).ConfigureAwait(false);

            await writer.WriteLineAsync().ConfigureAwait(false);

            await writer.WriteAsync($"namespace {_namespace}").ConfigureAwait(false);

            await writer.WriteLineAsync().ConfigureAwait(false);

            await writer.WriteAsync('{').ConfigureAwait(false);

            await writer.WriteLineAsync().ConfigureAwait(false);

            using (writer.IncreaseIndent())
            {
                await _innerGenerator.WriteAsync(
                    writer, descriptor, typeLookup)
                .ConfigureAwait(false);
            }

            await writer.WriteAsync('}').ConfigureAwait(false);

            await writer.WriteLineAsync().ConfigureAwait(false);
        }
Exemple #11
0
 private async Task WriteParserForMultipleResultTypes(
     CodeWriter writer,
     IResultParserMethodDescriptor methodDescriptor,
     ITypeLookup typeLookup)
 {
     if (methodDescriptor.ResultType.IsListType())
     {
         await WriteListAsync(
             writer,
             methodDescriptor,
             "obj",
             "element",
             "list",
             typeLookup);
     }
     else
     {
         await WriteAbstractTypeHandlingAsync(
             writer,
             methodDescriptor,
             typeLookup,
             "obj",
             async m =>
         {
             await writer.WriteIndentAsync();
             await writer.WriteAsync("return ");
             await WriteCreateObjectAsync(
                 writer,
                 methodDescriptor,
                 m,
                 "obj",
                 typeLookup);
         });
     }
 }
        public Task WriteAsync(
            CodeWriter writer,
            ICodeDescriptor descriptor,
            ITypeLookup typeLookup)
        {
            if (writer is null)
            {
                throw new ArgumentNullException(nameof(writer));
            }

            if (descriptor is null)
            {
                throw new ArgumentNullException(nameof(descriptor));
            }

            if (typeLookup is null)
            {
                throw new ArgumentNullException(nameof(typeLookup));
            }

            if (descriptor is T t)
            {
                return(WriteAsync(writer, t, typeLookup));
            }

            throw new ArgumentException(
                      "The code generator expected " +
                      $"descriptor type `{typeof(T).FullName}`.");
        }
        private async Task ExecuteGeneratorAsync(
            GeneratorTask task,
            ITypeLookup typeLookup,
            ISet <string> usedNames)
        {
            string fileName = task.Generator.CreateFileName(task.Descriptor);

            fileName = Path.Combine(_directoryName, fileName);

            lock (usedNames)
            {
                if (!usedNames.Add(fileName))
                {
                    throw new InvalidOperationException(
                              $"The file name `{fileName}` was already used.");
                }
            }

            using (FileStream stream = File.Create(fileName))
            {
                using (var sw = new StreamWriter(stream, Encoding.UTF8))
                {
                    using (var cw = new CodeWriter(sw))
                    {
                        await task.Generator.WriteAsync(
                            cw, task.Descriptor, typeLookup);
                    }
                }
            }
        }
Exemple #14
0
        protected override async Task WriteAsync(
            CodeWriter writer,
            IOperationDescriptor descriptor,
            ITypeLookup typeLookup)
        {
            await writer.WriteIndentAsync().ConfigureAwait(false);

            await writer.WriteAsync(
                $"{ModelAccessModifier} partial class ")
            .ConfigureAwait(false);

            await writer.WriteAsync(descriptor.Name).ConfigureAwait(false);

            await writer.WriteLineAsync().ConfigureAwait(false);

            using (writer.IncreaseIndent())
            {
                await writer.WriteIndentAsync().ConfigureAwait(false);

                await writer.WriteAsync(
                    $": IOperation<{descriptor.ResultType.Name}>")
                .ConfigureAwait(false);

                await writer.WriteLineAsync().ConfigureAwait(false);
            }

            await writer.WriteIndentAsync().ConfigureAwait(false);

            await writer.WriteLeftBraceAsync().ConfigureAwait(false);

            await writer.WriteLineAsync().ConfigureAwait(false);

            using (writer.IncreaseIndent())
            {
                await WriteOperationPropertiesAsync(
                    writer, descriptor, typeLookup)
                .ConfigureAwait(false);

                await writer.WriteLineAsync().ConfigureAwait(false);

                if (descriptor.Arguments.Count > 0)
                {
                    await WriteArgumentsAsync(
                        writer, descriptor, typeLookup)
                    .ConfigureAwait(false);

                    await writer.WriteLineAsync().ConfigureAwait(false);
                }

                await WriteVariablesAsync(
                    writer, descriptor, typeLookup)
                .ConfigureAwait(false);
            }

            await writer.WriteIndentAsync().ConfigureAwait(false);

            await writer.WriteRightBraceAsync().ConfigureAwait(false);

            await writer.WriteLineAsync().ConfigureAwait(false);
        }
        private async Task WriteCreateListElementAsync(
            CodeWriter writer,
            IResultParserMethodDescriptor methodDescriptor,
            IResultParserTypeDescriptor possibleType,
            string jsonElement,
            string listField,
            string indexField,
            ITypeLookup typeLookup)
        {
            await writer.WriteIndentAsync().ConfigureAwait(false);

            await writer.WriteAsync(string.Format(
                                        "{0}[{1}] = ",
                                        listField,
                                        indexField))
            .ConfigureAwait(false);

            await WriteCreateObjectAsync(
                writer,
                methodDescriptor,
                possibleType,
                jsonElement,
                typeLookup)
            .ConfigureAwait(false);
        }
        protected override async Task WriteAsync(
            CodeWriter writer,
            IInputClassDescriptor descriptor,
            ITypeLookup typeLookup)
        {
            await writer.WriteIndentAsync().ConfigureAwait(false);

            await writer.WriteAsync("public class ").ConfigureAwait(false);

            await writer.WriteAsync(descriptor.Name).ConfigureAwait(false);

            await writer.WriteLineAsync().ConfigureAwait(false);

            await writer.WriteIndentAsync().ConfigureAwait(false);

            await writer.WriteLeftBraceAsync().ConfigureAwait(false);

            await writer.WriteLineAsync().ConfigureAwait(false);

            using (writer.IncreaseIndent())
            {
                for (int i = 0; i < descriptor.Fields.Count; i++)
                {
                    IInputFieldDescriptor fieldDescriptor = descriptor.Fields[i];

                    string typeName = typeLookup.GetTypeName(
                        fieldDescriptor.Type,
                        fieldDescriptor.InputObjectType?.Name,
                        false);

                    if (i > 0)
                    {
                        await writer.WriteLineAsync().ConfigureAwait(false);
                    }

                    await writer.WriteIndentAsync().ConfigureAwait(false);

                    await writer.WriteAsync($"public Optional<{typeName}>")
                    .ConfigureAwait(false);

                    await writer.WriteSpaceAsync().ConfigureAwait(false);

                    await writer.WriteAsync(GetPropertyName(fieldDescriptor.Name))
                    .ConfigureAwait(false);

                    await writer.WriteSpaceAsync().ConfigureAwait(false);

                    await writer.WriteAsync("{ get; set; }").ConfigureAwait(false);

                    await writer.WriteLineAsync().ConfigureAwait(false);
                }
            }

            await writer.WriteIndentAsync().ConfigureAwait(false);

            await writer.WriteRightBraceAsync().ConfigureAwait(false);

            await writer.WriteLineAsync().ConfigureAwait(false);
        }
        private async Task WriteDeserializeMethodAsync(
            CodeWriter writer,
            IResultParserTypeDescriptor possibleType,
            ITypeLookup typeLookup,
            ISet <string> generatedMethods)
        {
            bool first = true;

            foreach (IFieldDescriptor fieldDescriptor in possibleType.ResultDescriptor.Fields)
            {
                if (fieldDescriptor.Type.NamedType().IsLeafType())
                {
                    ITypeInfo typeInfo = typeLookup.GetTypeInfo(
                        fieldDescriptor.Type,
                        false);

                    string methodName = CreateDeserializerName(typeInfo);

                    if (generatedMethods.Add(methodName))
                    {
                        string serializerMethod = _jsonMethod[typeInfo.SerializationType];

                        if (fieldDescriptor.Type.IsListType() &&
                            fieldDescriptor.Type.ListType().ElementType.IsListType())
                        {
                            if (!first)
                            {
                                await writer.WriteLineAsync();
                            }
                            first = false;
                            await WriteDeserializeNestedLeafList(
                                writer, methodName, typeInfo, serializerMethod);
                        }
                        else if (fieldDescriptor.Type.IsListType() &&
                                 fieldDescriptor.Type.ListType().ElementType.IsLeafType())
                        {
                            if (!first)
                            {
                                await writer.WriteLineAsync();
                            }
                            first = false;
                            await WriteDeserializeLeafList(
                                writer, methodName, typeInfo, serializerMethod);
                        }
                        else
                        {
                            if (!first)
                            {
                                await writer.WriteLineAsync();
                            }
                            first = false;
                            await WriteDeserializeLeaf(
                                writer, methodName, typeInfo, serializerMethod);
                        }
                    }
                }
            }
        }
        protected override async Task WriteAsync(
            CodeWriter writer,
            IInputClassDescriptor descriptor,
            ITypeLookup typeLookup)
        {
            await writer.WriteIndentAsync().ConfigureAwait(false);

            await writer.WriteAsync("public class ").ConfigureAwait(false);

            await writer.WriteAsync(descriptor.Name).ConfigureAwait(false);

            await writer.WriteAsync("Serializer").ConfigureAwait(false);

            await writer.WriteLineAsync().ConfigureAwait(false);

            using (writer.IncreaseIndent())
            {
                await writer.WriteIndentAsync().ConfigureAwait(false);

                await writer.WriteAsync(": IValueSerializer").ConfigureAwait(false);

                await writer.WriteLineAsync().ConfigureAwait(false);
            }

            await writer.WriteIndentAsync().ConfigureAwait(false);

            await writer.WriteLeftBraceAsync().ConfigureAwait(false);

            await writer.WriteLineAsync().ConfigureAwait(false);

            using (writer.IncreaseIndent())
            {
                await WriteSerializerFieldsAsync(writer, descriptor)
                .ConfigureAwait(false);

                await writer.WriteLineAsync().ConfigureAwait(false);

                await WriteConstructorAsync(writer, descriptor).ConfigureAwait(false);

                await writer.WriteLineAsync().ConfigureAwait(false);

                await WriteProperties(writer, descriptor).ConfigureAwait(false);

                await writer.WriteLineAsync().ConfigureAwait(false);

                await WriteSerializeMethod(writer, descriptor).ConfigureAwait(false);

                await writer.WriteLineAsync().ConfigureAwait(false);

                await WriteDeserializeMethod(writer, descriptor).ConfigureAwait(false);
            }

            await writer.WriteIndentAsync().ConfigureAwait(false);

            await writer.WriteRightBraceAsync().ConfigureAwait(false);

            await writer.WriteLineAsync().ConfigureAwait(false);
        }
Exemple #19
0
        protected override async Task WriteAsync(
            CodeWriter writer,
            IInputClassDescriptor descriptor,
            ITypeLookup typeLookup)
        {
            await writer.WriteIndentAsync().ConfigureAwait(false);

            await writer.WriteAsync($"{ModelAccessModifier} partial class ").ConfigureAwait(false);

            await writer.WriteAsync(descriptor.Name).ConfigureAwait(false);

            await writer.WriteAsync("Serializer").ConfigureAwait(false);

            await writer.WriteLineAsync().ConfigureAwait(false);

            using (writer.IncreaseIndent())
            {
                await writer.WriteIndentAsync().ConfigureAwait(false);

                await writer.WriteAsync(": IInputSerializer").ConfigureAwait(false);

                await writer.WriteLineAsync().ConfigureAwait(false);
            }

            await writer.WriteIndentAsync().ConfigureAwait(false);

            await writer.WriteLeftBraceAsync().ConfigureAwait(false);

            await writer.WriteLineAsync().ConfigureAwait(false);

            using (writer.IncreaseIndent())
            {
                await WriteSerializerFieldsAsync(writer, descriptor)
                .ConfigureAwait(false);

                await writer.WriteLineAsync().ConfigureAwait(false);

                await WritePropertiesAsync(writer, descriptor).ConfigureAwait(false);

                await writer.WriteLineAsync().ConfigureAwait(false);

                await WriteInitializationAsync(writer, descriptor).ConfigureAwait(false);

                await writer.WriteLineAsync().ConfigureAwait(false);

                await WriteSerializeMethodAsync(writer, descriptor).ConfigureAwait(false);

                await writer.WriteLineAsync().ConfigureAwait(false);

                await WriteDeserializeMethodAsync(writer, descriptor).ConfigureAwait(false);
            }

            await writer.WriteIndentAsync().ConfigureAwait(false);

            await writer.WriteRightBraceAsync().ConfigureAwait(false);

            await writer.WriteLineAsync().ConfigureAwait(false);
        }
        private async Task WriteOperationAsync(
            CodeWriter writer,
            IOperationDescriptor operation,
            string operationTypeName,
            ITypeLookup typeLookup)
        {
            await WriteOperationSignature(
                writer, operation, operationTypeName, true, typeLookup)
            .ConfigureAwait(false);

            await writer.WriteIndentAsync().ConfigureAwait(false);

            await writer.WriteAsync('{').ConfigureAwait(false);

            await writer.WriteLineAsync().ConfigureAwait(false);

            using (writer.IncreaseIndent())
            {
                await WriteOperationNullChecksAsync(
                    writer, operation, typeLookup)
                .ConfigureAwait(false);

                await writer.WriteLineAsync().ConfigureAwait(false);

                await writer.WriteIndentAsync().ConfigureAwait(false);

                if (operation.Operation.Operation == OperationType.Subscription)
                {
                    await writer.WriteAsync("return _streamExecutor.ExecuteAsync(")
                    .ConfigureAwait(false);
                }
                else
                {
                    await writer.WriteAsync("return _executor.ExecuteAsync(")
                    .ConfigureAwait(false);
                }
                await writer.WriteLineAsync().ConfigureAwait(false);

                using (writer.IncreaseIndent())
                {
                    await WriteCreateOperationAsync(
                        writer, operation, typeLookup)
                    .ConfigureAwait(false);

                    await writer.WriteIndentAsync().ConfigureAwait(false);

                    await writer.WriteAsync("cancellationToken);").ConfigureAwait(false);

                    await writer.WriteLineAsync().ConfigureAwait(false);
                }
            }

            await writer.WriteIndentAsync().ConfigureAwait(false);

            await writer.WriteAsync('}').ConfigureAwait(false);

            await writer.WriteLineAsync().ConfigureAwait(false);
        }
 private Task WriteParserForSingleResultType(
     CodeWriter writer,
     IResultParserMethodDescriptor methodDescriptor,
     ITypeLookup typeLookup) =>
 WriteParserForSingleResultType(
     writer,
     methodDescriptor,
     methodDescriptor.PossibleTypes[0],
     typeLookup);
        protected override async Task WriteAsync(
            CodeWriter writer,
            IEnumDescriptor descriptor,
            ITypeLookup typeLookup)
        {
            await writer.WriteIndentedLineAsync(
                $"{ModelAccessModifier} partial class {descriptor.Name}ValueSerializer")
            .ConfigureAwait(false);

            using (writer.IncreaseIndent())
            {
                await writer.WriteIndentedLineAsync(": IValueSerializer").ConfigureAwait(false);
            }

            await writer.WriteIndentedLineAsync("{").ConfigureAwait(false);

            using (writer.IncreaseIndent())
            {
                await writer.WriteIndentedLineAsync(
                    "public string Name => \"{0}\";",
                    descriptor.Name)
                .ConfigureAwait(false);

                await writer.WriteLineAsync().ConfigureAwait(false);

                await writer.WriteIndentedLineAsync(
                    "public ValueKind Kind => ValueKind.Enum;")
                .ConfigureAwait(false);

                await writer.WriteLineAsync().ConfigureAwait(false);

                await writer.WriteIndentedLineAsync(
                    "public Type ClrType => typeof({0});",
                    descriptor.Name)
                .ConfigureAwait(false);

                await writer.WriteLineAsync().ConfigureAwait(false);

                await writer.WriteIndentedLineAsync(
                    "public Type SerializationType => typeof(string);")
                .ConfigureAwait(false);

                await writer.WriteLineAsync().ConfigureAwait(false);

                await WriteSerializeMethodAsync(writer, descriptor, typeLookup)
                .ConfigureAwait(false);

                await writer.WriteLineAsync().ConfigureAwait(false);

                await WriteDeserializeMethodAsync(writer, descriptor, typeLookup)
                .ConfigureAwait(false);

                await writer.WriteLineAsync().ConfigureAwait(false);
            }

            await writer.WriteIndentedLineAsync("}").ConfigureAwait(false);
        }
        private async Task WriteDeserializeMethodAsync(
            CodeWriter writer,
            IResultParserTypeDescriptor possibleType,
            ITypeLookup typeLookup,
            ISet <string> generatedMethods)
        {
            bool first = true;

            foreach (IType type in possibleType.ResultDescriptor.Fields
                     .Where(t => t.Type.NamedType().IsLeafType())
                     .Select(t => t.Type))
            {
                string methodName = SerializerNameUtils.CreateDeserializerName(type);

                if (generatedMethods.Add(methodName))
                {
                    Type   serializationType = typeLookup.GetSerializationType(type);
                    string serializerMethod  = _jsonMethod[serializationType];

                    if (!first)
                    {
                        await writer.WriteLineAsync().ConfigureAwait(false);
                    }
                    first = false;

                    if (type.IsListType() && type.ListType().ElementType.IsListType())
                    {
                        // TODO : implement this
                        throw new NotImplementedException();
                    }
                    else if (type.IsListType() &&
                             type.ListType().ElementType.IsLeafType())
                    {
                        await WriteDeserializeLeafListAsync(
                            writer,
                            typeLookup,
                            methodName,
                            type,
                            type.NamedType().Name,
                            serializerMethod)
                        .ConfigureAwait(false);
                    }
                    else
                    {
                        await WriteDeserializeLeafAsync(
                            writer,
                            methodName,
                            typeLookup.GetLeafClrTypeName(type),
                            type.NamedType().Name,
                            serializerMethod,
                            type.IsNonNullType())
                        .ConfigureAwait(false);
                    }
                }
            }
        }
Exemple #24
0
        /// <summary>
        /// Initializes a new instance of the <see cref="FieldDeclarationSyntaxFactory"/> class.
        /// </summary>
        /// <param name="fieldInfo"></param>
        /// <param name="typeLookup"></param>
        public FieldDeclarationSyntaxFactory(IFieldInfoProxy fieldInfo, ITypeLookup typeLookup)
            : base(fieldInfo)
        {
            if (typeLookup == null)
            {
                throw new ArgumentNullException(nameof(typeLookup));
            }

            this.typeLookup = typeLookup;
        }
        /// <summary>
        /// Initializes a new instance of the <see cref="MethodDeclarationSyntaxFactory"/> class.
        /// </summary>
        /// <param name="methodInfo"></param>
        /// <param name="typeLookup"></param>
        /// <param name="withBody"></param>
        public MethodDeclarationSyntaxFactory(IMethodInfoProxy methodInfo, ITypeLookup typeLookup, bool withBody = true)
            : base(methodInfo, withBody)
        {
            if (typeLookup == null)
            {
                throw new ArgumentNullException(nameof(typeLookup));
            }

            this.typeLookup = typeLookup;
        }
Exemple #26
0
        /// <summary>
        /// Initializes a new instance of the <see cref="ConstructorDeclarationSyntaxFactory"/> class.
        /// </summary>
        /// <param name="ctorInfo"></param>
        /// <param name="classInfo"></param>
        /// <param name="typeLookup"></param>
        public ConstructorDeclarationSyntaxFactory(IConstructorInfoProxy ctorInfo, ITypeInfoProxy classInfo, ITypeLookup typeLookup)
            : base(ctorInfo, classInfo)
        {
            if (typeLookup == null)
            {
                throw new ArgumentNullException(nameof(typeLookup));
            }

            this.typeLookup = typeLookup;
        }
        /// <summary>
        /// Initializes a new instance of the <see cref="InterfaceDeclarationSyntaxFactory"/> class.
        /// </summary>
        /// <param name="interfaceInfo"></param>
        /// <param name="typeLookup"></param>
        public InterfaceDeclarationSyntaxFactory(ITypeInfoProxy interfaceInfo, ITypeLookup typeLookup)
            : base(interfaceInfo)
        {
            if (typeLookup == null)
            {
                throw new ArgumentNullException(nameof(typeLookup));
            }

            this.typeLookup = typeLookup;
        }
        protected override async Task WriteAsync(
            CodeWriter writer,
            IClientDescriptor descriptor,
            ITypeLookup typeLookup)
        {
            await writer.WriteIndentAsync().ConfigureAwait(false);

            await writer.WriteAsync(
                $"{ClientAccessModifier} partial interface ")
            .ConfigureAwait(false);

            await writer.WriteAsync(GetInterfaceName(descriptor.Name)).ConfigureAwait(false);

            await writer.WriteLineAsync().ConfigureAwait(false);

            await writer.WriteIndentAsync().ConfigureAwait(false);

            await writer.WriteAsync("{").ConfigureAwait(false);

            await writer.WriteLineAsync().ConfigureAwait(false);

            using (writer.IncreaseIndent())
            {
                for (int i = 0; i < descriptor.Operations.Count; i++)
                {
                    IOperationDescriptor operation = descriptor.Operations[i];

                    string typeName = typeLookup.GetTypeName(
                        new NonNullType(operation.OperationType),
                        operation.ResultType.Name,
                        true);

                    if (i > 0)
                    {
                        await writer.WriteLineAsync().ConfigureAwait(false);
                    }

                    await WriteOperationAsync(
                        writer, operation, typeName, true, typeLookup)
                    .ConfigureAwait(false);

                    await writer.WriteLineAsync().ConfigureAwait(false);

                    await WriteOperationRequestAsync(
                        writer, operation, typeName, true)
                    .ConfigureAwait(false);
                }
            }

            await writer.WriteIndentAsync().ConfigureAwait(false);

            await writer.WriteAsync("}").ConfigureAwait(false);

            await writer.WriteLineAsync().ConfigureAwait(false);
        }
        private async Task WriteVariableAsync(
            CodeWriter writer,
            Descriptors.IArgumentDescriptor argument,
            ITypeLookup typeLookup)
        {
            await writer.WriteIndentAsync().ConfigureAwait(false);

            await writer.WriteAsync("if(_modified_").ConfigureAwait(false);

            await writer.WriteAsync(GetFieldName(argument.Name)).ConfigureAwait(false);

            await writer.WriteAsync(')').ConfigureAwait(false);

            await writer.WriteLineAsync().ConfigureAwait(false);

            await writer.WriteIndentAsync().ConfigureAwait(false);

            await writer.WriteAsync('{').ConfigureAwait(false);

            await writer.WriteLineAsync().ConfigureAwait(false);

            using (writer.IncreaseIndent())
            {
                await writer.WriteIndentAsync().ConfigureAwait(false);

                await writer.WriteAsync("variables.Add(new VariableValue(").ConfigureAwait(false);

                await writer.WriteStringValueAsync(argument.Name).ConfigureAwait(false);

                await writer.WriteAsync(", ").ConfigureAwait(false);

                await writer.WriteStringValueAsync(
                    argument.Type.NamedType().Name)
                .ConfigureAwait(false);

                await writer.WriteAsync(", ").ConfigureAwait(false);

                await writer.WriteAsync(GetPropertyName(argument.Name)).ConfigureAwait(false);

                await writer.WriteAsync(')').ConfigureAwait(false);

                await writer.WriteAsync(')').ConfigureAwait(false);

                await writer.WriteAsync(';').ConfigureAwait(false);

                await writer.WriteLineAsync().ConfigureAwait(false);
            }

            await writer.WriteIndentAsync().ConfigureAwait(false);

            await writer.WriteAsync('}').ConfigureAwait(false);

            await writer.WriteLineAsync().ConfigureAwait(false);
        }
        private async Task WriteFieldsAsync(
            CodeWriter writer,
            IOperationDescriptor descriptor,
            ITypeLookup typeLookup)
        {
            if (descriptor.Arguments.Count > 0)
            {
                for (int i = 0; i < descriptor.Arguments.Count; i++)
                {
                    Descriptors.IArgumentDescriptor argument =
                        descriptor.Arguments[i];

                    await writer.WriteIndentAsync().ConfigureAwait(false);

                    await writer.WriteAsync("private bool _modified_").ConfigureAwait(false);

                    await writer.WriteAsync(GetFieldName(argument.Name)).ConfigureAwait(false);

                    await writer.WriteAsync(';').ConfigureAwait(false);

                    await writer.WriteLineAsync().ConfigureAwait(false);
                }

                await writer.WriteLineAsync().ConfigureAwait(false);

                for (int i = 0; i < descriptor.Arguments.Count; i++)
                {
                    Descriptors.IArgumentDescriptor argument =
                        descriptor.Arguments[i];

                    string typeName = typeLookup.GetTypeName(
                        argument.Type,
                        argument.Type.NamedType().Name,
                        true);

                    await writer.WriteIndentAsync().ConfigureAwait(false);

                    await writer.WriteAsync("private ").ConfigureAwait(false);

                    await writer.WriteAsync(typeName).ConfigureAwait(false);

                    await writer.WriteSpaceAsync().ConfigureAwait(false);

                    await writer.WriteAsync("_value_").ConfigureAwait(false);

                    await writer.WriteAsync(GetFieldName(argument.Name)).ConfigureAwait(false);

                    await writer.WriteAsync(';').ConfigureAwait(false);

                    await writer.WriteLineAsync().ConfigureAwait(false);
                }
            }
        }