Exemplo n.º 1
0
        public IEnumerable <CSharpDocument> Generate(
            ClientModel clientModel,
            string ns,
            string clientName)
        {
            if (clientModel is null)
            {
                throw new ArgumentNullException(nameof(clientModel));
            }

            var context = new MapperContext(ns, clientName);

            EnumDescriptorMapper.Map(clientModel, context);
            EntityIdFactoryDescriptorMapper.Map(clientModel, context);
            TypeDescriptorMapper.Map(clientModel, context);
            EntityTypeDescriptorMapper.Map(clientModel, context);
            OperationDescriptorMapper.Map(clientModel, context);
            ClientDescriptorMapper.Map(clientModel, context);
            ResultBuilderDescriptorMapper.Map(clientModel, context);
            DependencyInjectionMapper.Map(clientModel, context);
            DataTypeDescriptorMapper.Map(clientModel, context);

            var code = new StringBuilder();

            foreach (var descriptor in context.GetAllDescriptors())
            {
                foreach (var generator in _generators)
                {
                    if (generator.CanHandle(descriptor))
                    {
                        yield return(WriteDocument(generator, descriptor, code));
                    }
                }
            }
        }
Exemplo n.º 2
0
        private static IReadOnlyList <GeneratorResult> GenerateCSharpDocuments(
            MapperContext context,
            CSharpGeneratorSettings settings)
        {
            var generatorSettings = new CSharpSyntaxGeneratorSettings(
                settings.NoStore,
                settings.InputRecords,
                settings.EntityRecords,
                settings.RazorComponents);

            var results = new List <GeneratorResult>();

            foreach (var descriptor in context.GetAllDescriptors())
            {
                foreach (var generator in _generators)
                {
                    if (generator.CanHandle(descriptor, generatorSettings))
                    {
                        CSharpSyntaxGeneratorResult result =
                            generator.Generate(descriptor, generatorSettings);
                        results.Add(new(generator.GetType(), result));
                    }
                }
            }

            return(results);
        }
Exemplo n.º 3
0
        public IEnumerable <CSharpDocument> Generate(
            ClientModel clientModel,
            string ns,
            string clientName)
        {
            if (clientModel is null)
            {
                throw new ArgumentNullException(nameof(clientModel));
            }

            var context = new MapperContext(ns, clientName);

            // First we run all mappers that do not have any dependencies on others.
            EntityIdFactoryDescriptorMapper.Map(clientModel, context);

            // Second we start with the type descriptor mapper which creates
            // the type structure for the generators.
            // The following mappers can depend on this foundational data.
            TypeDescriptorMapper.Map(clientModel, context);

            // now we execute all mappers that depend on the previous type mappers.
            OperationDescriptorMapper.Map(clientModel, context);
            DependencyInjectionMapper.Map(clientModel, context);
            DataTypeDescriptorMapper.Map(clientModel, context);
            EntityTypeDescriptorMapper.Map(clientModel, context);
            ResultBuilderDescriptorMapper.Map(clientModel, context);

            // Lastly we generate the client mapper
            ClientDescriptorMapper.Map(clientModel, context);

            // Last we execute all our generators with the descriptiptors.
            var code = new StringBuilder();

            foreach (var descriptor in context.GetAllDescriptors())
            {
                foreach (var generator in _generators)
                {
                    if (generator.CanHandle(descriptor))
                    {
                        yield return(WriteDocument(generator, descriptor, code));
                    }
                }
            }
        }
Exemplo n.º 4
0
        public static CSharpGeneratorResult Generate(
            ClientModel clientModel,
            CSharpGeneratorSettings settings)
        {
            if (clientModel is null)
            {
                throw new ArgumentNullException(nameof(clientModel));
            }

            if (string.IsNullOrEmpty(settings.ClientName))
            {
                throw new ArgumentException(
                          string.Format(
                              Resources.CSharpGenerator_Generate_ArgumentCannotBeNull,
                              nameof(settings.ClientName)),
                          nameof(settings));
            }

            if (string.IsNullOrEmpty(settings.Namespace))
            {
                throw new ArgumentException(
                          string.Format(
                              Resources.CSharpGenerator_Generate_ArgumentCannotBeNull,
                              nameof(settings.Namespace)),
                          nameof(settings));
            }

            var context = new MapperContext(
                settings.Namespace,
                settings.ClientName,
                settings.HashProvider,
                settings.RequestStrategy,
                settings.TransportProfiles);

            // First we run all mappers that do not have any dependencies on others.
            EntityIdFactoryDescriptorMapper.Map(clientModel, context);

            // Second we start with the type descriptor mapper which creates
            // the type structure for the generators.
            // The following mappers can depend on this foundational data.
            TypeDescriptorMapper.Map(clientModel, context);

            // now we execute all mappers that depend on the previous type mappers.
            OperationDescriptorMapper.Map(clientModel, context);
            StoreAccessorMapper.Map(clientModel, context);
            DataTypeDescriptorMapper.Map(clientModel, context);
            EntityTypeDescriptorMapper.Map(clientModel, context);
            ResultBuilderDescriptorMapper.Map(clientModel, context);

            // We generate the client mapper next as we have all components of the client generated
            ClientDescriptorMapper.Map(clientModel, context);

            // Lastly we generate the DI code, as we now have collected everything
            DependencyInjectionMapper.Map(clientModel, context);

            // Last we execute all our generators with the descriptors.
            var code      = new StringBuilder();
            var documents = new List <SourceDocument>();

            foreach (var descriptor in context.GetAllDescriptors())
            {
                foreach (var generator in _generators)
                {
                    if (generator.CanHandle(descriptor))
                    {
                        documents.Add(WriteDocument(generator, descriptor, code));
                    }
                }
            }

            if (settings.RequestStrategy == RequestStrategy.PersistedQuery)
            {
                foreach (var operation in context.Operations)
                {
                    documents.Add(new SourceDocument(
                                      operation.Name,
                                      Encoding.UTF8.GetString(operation.Body),
                                      SourceDocumentKind.GraphQL,
                                      operation.HashValue));
                }
            }

            return(new(documents));
        }
Exemplo n.º 5
0
        private static void GenerateMultipleCSharpDocuments(
            MapperContext context,
            CSharpGeneratorSettings settings,
            ICollection <SourceDocument> documents)
        {
            var generatorSettings = new CSharpSyntaxGeneratorSettings(
                settings.NoStore,
                settings.InputRecords,
                settings.EntityRecords);

            var results = new List <(Type Generator, CSharpSyntaxGeneratorResult Result)>();

            foreach (var descriptor in context.GetAllDescriptors())
            {
                foreach (var generator in _generators)
                {
                    if (generator.CanHandle(descriptor, generatorSettings))
                    {
                        CSharpSyntaxGeneratorResult result =
                            generator.Generate(descriptor, generatorSettings);
                        results.Add((generator.GetType(), result));
                    }
                }
            }

            foreach (var group in results.GroupBy(t => t.Result.Namespace).OrderBy(t => t.Key))
            {
                foreach ((Type generator, CSharpSyntaxGeneratorResult result) in group)
                {
                    BaseTypeDeclarationSyntax typeDeclaration = result.TypeDeclaration;
#if DEBUG
                    SyntaxTriviaList trivia = typeDeclaration
                                              .GetLeadingTrivia()
                                              .Insert(0, Comment("// " + generator.FullName));

                    typeDeclaration = typeDeclaration.WithLeadingTrivia(trivia);
#endif
                    CompilationUnitSyntax compilationUnit =
                        CompilationUnit().AddMembers(
                            NamespaceDeclaration(IdentifierName(group.Key)).AddMembers(
                                typeDeclaration));

                    compilationUnit = compilationUnit.NormalizeWhitespace(elasticTrivia: true);

                    var code = new StringBuilder();

                    // marker for style cop to ignore this code
                    code.AppendLine("// <auto-generated/>");

                    // enable nullability settings
                    code.AppendLine("#nullable enable");

                    code.AppendLine();
                    code.AppendLine(compilationUnit.ToFullString());

                    documents.Add(new(
                                      result.FileName,
                                      code.ToString(),
                                      SourceDocumentKind.CSharp,
                                      path: result.Path));
                }
            }
        }
Exemplo n.º 6
0
        public static CSharpGeneratorResult Generate(
            ClientModel clientModel,
            string clientName = "GraphQLClient",
            string @namespace = "StrawberryShake.GraphQL")
        {
            if (clientModel is null)
            {
                throw new ArgumentNullException(nameof(clientModel));
            }

            if (string.IsNullOrEmpty(clientName))
            {
                throw new ArgumentException(
                          string.Format(
                              Resources.CSharpGenerator_Generate_ArgumentCannotBeNull,
                              nameof(clientName)),
                          nameof(clientName));
            }

            if (string.IsNullOrEmpty(@namespace))
            {
                throw new ArgumentException(
                          string.Format(
                              Resources.CSharpGenerator_Generate_ArgumentCannotBeNull,
                              nameof(@namespace)),
                          nameof(@namespace));
            }

            var context = new MapperContext(@namespace, clientName);

            // First we run all mappers that do not have any dependencies on others.
            EntityIdFactoryDescriptorMapper.Map(clientModel, context);

            // Second we start with the type descriptor mapper which creates
            // the type structure for the generators.
            // The following mappers can depend on this foundational data.
            TypeDescriptorMapper.Map(clientModel, context);

            // now we execute all mappers that depend on the previous type mappers.
            OperationDescriptorMapper.Map(clientModel, context);
            DependencyInjectionMapper.Map(clientModel, context);
            DataTypeDescriptorMapper.Map(clientModel, context);
            EntityTypeDescriptorMapper.Map(clientModel, context);
            ResultBuilderDescriptorMapper.Map(clientModel, context);

            // Lastly we generate the client mapper
            ClientDescriptorMapper.Map(clientModel, context);

            // Last we execute all our generators with the descriptiptors.
            var code      = new StringBuilder();
            var documents = new List <CSharpDocument>();

            foreach (var descriptor in context.GetAllDescriptors())
            {
                foreach (var generator in _generators)
                {
                    if (generator.CanHandle(descriptor))
                    {
                        documents.Add(WriteDocument(generator, descriptor, code));
                    }
                }
            }

            return(new(documents));
        }