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);
        }