Exemple #1
0
 public override void Visit(SyntaxNode?node)
 {
     if (node == null)
     {
         return;
     }
     _syntaxReceiver.OnVisitSyntaxNode(node);
     base.Visit(node);
 }
Exemple #2
0
        public static async Task <Project> RunSourceGenerator <TGenerator>(this Project project, TGenerator generator,
                                                                           ISyntaxReceiver syntaxReceiver)
            where TGenerator : ISourceGenerator
        {
            if (syntaxReceiver != null)
            {
                var nodes = project.Documents
                            .Select(o => o.GetSyntaxTreeAsync().Result)
                            .SelectMany(o => o.GetRoot().DescendantNodes());

                foreach (var syntaxNode in nodes)
                {
                    syntaxReceiver.OnVisitSyntaxNode(syntaxNode);
                }
            }

            var nonPublic   = BindingFlags.Instance | BindingFlags.NonPublic;
            var compilation = await project.GetCompilationAsync();

            var context = (GeneratorExecutionContext)Activator.CreateInstance(
                type: typeof(GeneratorExecutionContext), nonPublic | BindingFlags.CreateInstance, null, new object[]
            {
                compilation,
                project.ParseOptions,
                ImmutableArray.Create <AdditionalText>(),
                null,
                syntaxReceiver,
                CancellationToken.None
            }, null) !;

            generator.Execute(context);

            var files = context
                        .ReflectionGetValue("_additionalSources")
                        .ReflectionGetValue("_sourcesAdded") as IEnumerable;

            foreach (var file in files)
            {
                project = project.AddDocument((string)file.ReflectionGetValue("HintName"),
                                              (SourceText)file.ReflectionGetValue("Text")).Project;
            }

            return(project);
        }
 public override void Visit(SyntaxNode node)
 {
     _syntaxReceiver.OnVisitSyntaxNode(node);
     base.Visit(node);
 }