コード例 #1
0
 /// <summary>
 /// Adds an <see cref="ISyntaxReceiver"/> to this generator state
 /// </summary>
 internal GeneratorState WithReceiver(ISyntaxReceiver syntaxReceiver)
 {
     Debug.Assert(this.Exception is null);
     return(new GeneratorState(this.Info,
                               sourceTexts: this.SourceTexts,
                               trees: this.Trees,
                               diagnostics: this.Diagnostics,
                               syntaxReceiver: syntaxReceiver,
                               exception: null));
 }
コード例 #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);
        }
コード例 #3
0
 internal GeneratorSyntaxWalker(ISyntaxReceiver syntaxReceiver)
 {
     _syntaxReceiver = syntaxReceiver;
 }
コード例 #4
0
 private SyntaxContextReceiverAdaptor(ISyntaxReceiver receiver)
 {
     Receiver = receiver ?? throw new ArgumentNullException(nameof(receiver));
 }
コード例 #5
0
 public NotSureWhatToCallYou(ISyntaxReceiver syntaxReceiver)
 {
     _syntaxReceiver = syntaxReceiver;
 }