sdk/Sdk.Generators/FunctionMetadataProviderGenerator/ReferencedAssemblyMethodVisitor.cs (55 lines of code) (raw):

// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the MIT License. See License.txt in the project root for license information. using System; using System.Collections.Generic; using System.Linq; using Microsoft.CodeAnalysis; namespace Microsoft.Azure.Functions.Worker.Sdk.Generators { /// <summary> /// Visits all symbols from referenced assemblies and returns all methods which are valid Azure Functions. /// </summary> internal sealed class ReferencedAssemblyMethodVisitor : SymbolVisitor { private readonly Compilation _compilation; /// <summary> /// Gets all methods which are valid Azure Functions. /// </summary> internal readonly List<IMethodSymbol> FunctionMethods = new(); internal ReferencedAssemblyMethodVisitor(Compilation compilation) { _compilation = compilation ?? throw new ArgumentNullException(nameof(compilation)); } public override void VisitModule(IModuleSymbol moduleSymbol) { foreach (var assemblySymbol in moduleSymbol.ReferencedAssemblySymbols) { assemblySymbol.Accept(this); } } public override void VisitAssembly(IAssemblySymbol symbol) { var namespaceSymbol = symbol.GlobalNamespace; namespaceSymbol.Accept(this); } public override void VisitNamespace(INamespaceSymbol symbol) { // Get classes in this namespace or child namespaces var classesOrNamespaces = symbol.GetMembers() .Where(a => a.Kind is SymbolKind.Namespace or SymbolKind.NamedType); foreach (var childSymbol in classesOrNamespaces) { childSymbol.Accept(this); } } public override void VisitNamedType(INamedTypeSymbol symbol) { // Get methods in this class or nested child classes var methodsOrClasses = symbol.GetMembers() .Where(a => a.Kind is SymbolKind.NamedType or SymbolKind.Method); foreach (var childSymbol in methodsOrClasses) { childSymbol.Accept(this); } } public override void VisitMethod(IMethodSymbol methodSymbol) { if (methodSymbol.MethodKind == MethodKind.Ordinary && FunctionsUtil.IsFunctionSymbol(methodSymbol, _compilation)) { FunctionMethods.Add(methodSymbol); } } } }