private CSharpCompilation Enrich(CSharpCompilation compilation, IOpenApiSyntaxNodeEnricher enricher) { foreach (Type interfaceType in enricher.GetType().GetInterfaces() .Where(p => p.IsGenericType && p.GetGenericTypeDefinition() == typeof(IOpenApiSyntaxNodeEnricher <,>))) { var enrichMethod = _genericEnrichCompilationMethod.MakeGenericMethod(interfaceType.GetGenericArguments()); compilation = (CSharpCompilation)enrichMethod.Invoke(this, new object[] { compilation, enricher }) !; } return(compilation); }
private CSharpCompilation Enrich <TSyntaxNode, TElement>(CSharpCompilation compilation, IOpenApiSyntaxNodeEnricher <TSyntaxNode, TElement> enricher) where TSyntaxNode : SyntaxNode where TElement : IOpenApiElement { foreach (var syntaxTree in compilation.SyntaxTrees) { SyntaxTree newSyntaxTree = Enrich(syntaxTree, compilation, enricher); if (syntaxTree != newSyntaxTree) { compilation = compilation.ReplaceSyntaxTree(syntaxTree, newSyntaxTree); } } return(compilation); }
private SyntaxTree Enrich <TSyntaxNode, TElement>(SyntaxTree syntaxTree, CSharpCompilation compilation, IOpenApiSyntaxNodeEnricher <TSyntaxNode, TElement> enricher) where TSyntaxNode : SyntaxNode where TElement : IOpenApiElement { var rootNode = syntaxTree.GetRoot(); var newRootNode = rootNode.ReplaceNodes( rootNode.GetAnnotatedNodes(typeof(TElement).Name).OfType <TSyntaxNode>(), (_, node) => { var schema = node.GetElementAnnotation <TElement>(_elementRegistry); return(schema != null ? enricher.Enrich(node, new OpenApiEnrichmentContext <TElement>(compilation, syntaxTree, schema)) : node); }); return(rootNode != newRootNode ? syntaxTree.WithRootAndOptions(newRootNode, syntaxTree.Options) : syntaxTree); }