/// <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)); }
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); }
internal GeneratorSyntaxWalker(ISyntaxReceiver syntaxReceiver) { _syntaxReceiver = syntaxReceiver; }
private SyntaxContextReceiverAdaptor(ISyntaxReceiver receiver) { Receiver = receiver ?? throw new ArgumentNullException(nameof(receiver)); }
public NotSureWhatToCallYou(ISyntaxReceiver syntaxReceiver) { _syntaxReceiver = syntaxReceiver; }