private static Dictionary <string, InterfaceSymbolDeclaration> GetInterfaceTypeDictionary(GeneratorExecutionContext context, CustomAspectInterfaceReceiver customAspectReceiver) { Dictionary <string, InterfaceSymbolDeclaration> interfaceSymbols = new(); foreach (var interf in customAspectReceiver.CustomAspectInterfaces) { var root = interf.Interface.SyntaxTree.GetRoot().SyntaxTree; var model = context.Compilation.GetSemanticModel(root); var symb = model.GetDeclaredSymbol(interf.Interface) as ITypeSymbol; if (symb == null) { continue; } interfaceSymbols[$"{symb.ContainingNamespace}.{symb.Name}"] = new( interf.Interface, symb, interf.Types.Select(t => { ITypeSymbol?typeSymbol = null; if (t.Type is IdentifierNameSyntax ident) { typeSymbol = model.GetTypeInfo(ident).Type; } return(new TypeDeclaration(t, typeSymbol)); }).ToArray()); } return(interfaceSymbols); }
private static Dictionary <string, MethodUsageInformation> GetInterfaceUsageDeclarations(GeneratorExecutionContext context, CustomAspectInterfaceReceiver customAspectReceiver, Dictionary <string, InterfaceSymbolDeclaration> interfaceSymbols) { var interfaceUsageDeclarations = new Dictionary <string, MethodUsageInformation>(); foreach (var methodDeclaration in customAspectReceiver.MethodDeclarations) { var model = context.Compilation.GetSemanticModel(methodDeclaration.SyntaxTree.GetRoot().SyntaxTree); var modelSymbol = new Lazy <ISymbol?>(() => model.GetDeclaredSymbol(methodDeclaration)); foreach (var parameter in methodDeclaration.ParameterList.Parameters) { var pSymbol = model.GetDeclaredSymbol(parameter) as IParameterSymbol; if (pSymbol == null) { continue; } var str = $"{pSymbol.Type.ContainingNamespace}.{pSymbol.Type.Name}"; if (!interfaceSymbols.TryGetValue(str, out var interf)) { continue; } var modelSymb = modelSymbol.Value; if (modelSymb == null) { continue; } interfaceUsageDeclarations .GetOrAdd(methodDeclaration.Identifier.Text, () => new MethodUsageInformation(methodDeclaration, modelSymb, new())) .InterfaceUsages.Add(new(interf, pSymbol.Type, parameter.Identifier.Text)); } } return(interfaceUsageDeclarations); }