internal override Location? GetLocationOfBaseTypeName()

in src/Microsoft.VisualStudio.Threading.Analyzers.VisualBasic/VisualBasicUtils.cs [20:79]


        internal override Location? GetLocationOfBaseTypeName(INamedTypeSymbol symbol, INamedTypeSymbol baseType, Compilation compilation, CancellationToken cancellationToken)
        {
            foreach (SyntaxReference? syntaxReference in symbol.DeclaringSyntaxReferences)
            {
                SyntaxNode? syntaxNode = syntaxReference.GetSyntax(cancellationToken);
                if (syntaxNode is InterfaceStatementSyntax { Parent: InterfaceBlockSyntax vbInterface })
                {
                    if (compilation.GetSemanticModel(vbInterface.SyntaxTree) is { } semanticModel)
                    {
                        foreach (InheritsStatementSyntax? inheritStatement in vbInterface.Inherits)
                        {
                            foreach (TypeSyntax? typeSyntax in inheritStatement.Types)
                            {
                                SymbolInfo baseTypeSymbolInfo = semanticModel.GetSymbolInfo(typeSyntax, cancellationToken);
                                if (Equals(baseTypeSymbolInfo.Symbol, baseType))
                                {
                                    return typeSyntax.GetLocation();
                                }
                            }
                        }
                    }
                }
                else if (syntaxNode is ClassStatementSyntax { Parent: ClassBlockSyntax vbClass })
                {
                    if (compilation.GetSemanticModel(vbClass.SyntaxTree) is { } semanticModel)
                    {
                        foreach (ImplementsStatementSyntax? implementStatement in vbClass.Implements)
                        {
                            foreach (TypeSyntax? typeSyntax in implementStatement.Types)
                            {
                                SymbolInfo baseTypeSymbolInfo = semanticModel.GetSymbolInfo(typeSyntax, cancellationToken);
                                if (Equals(baseTypeSymbolInfo.Symbol, baseType))
                                {
                                    return typeSyntax.GetLocation();
                                }
                            }
                        }
                    }
                }
                else if (syntaxNode is StructureStatementSyntax { Parent: StructureBlockSyntax vbStruct })
                {
                    if (compilation.GetSemanticModel(vbStruct.SyntaxTree) is { } semanticModel)
                    {
                        foreach (ImplementsStatementSyntax? implementStatement in vbStruct.Implements)
                        {
                            foreach (TypeSyntax? typeSyntax in implementStatement.Types)
                            {
                                SymbolInfo baseTypeSymbolInfo = semanticModel.GetSymbolInfo(typeSyntax, cancellationToken);
                                if (Equals(baseTypeSymbolInfo.Symbol, baseType))
                                {
                                    return typeSyntax.GetLocation();
                                }
                            }
                        }
                    }
                }
            }

            return symbol.DeclaringSyntaxReferences.FirstOrDefault()?.GetSyntax(cancellationToken)?.GetLocation();
        }