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