diff --git a/src/EditorFeatures/VisualBasicTest/Classification/SemanticClassifierTests.vb b/src/EditorFeatures/VisualBasicTest/Classification/SemanticClassifierTests.vb index 9cecc4b998c31eebc67ce6473f21eb51e8a0816f..aeddc8d9debdc6c1fac7f5bdea1d68d5961adb6a 100644 --- a/src/EditorFeatures/VisualBasicTest/Classification/SemanticClassifierTests.vb +++ b/src/EditorFeatures/VisualBasicTest/Classification/SemanticClassifierTests.vb @@ -545,5 +545,16 @@ end sub Await TestInClassAsync(text) End Function + + + + Public Async Function TestAttribute() As Task + Await TestAsync("Imports System + + +Class Program +End Class", + [Class]("AttributeUsage")) + End Function End Class End Namespace diff --git a/src/Workspaces/CSharp/Portable/Classification/SyntaxClassification/NameSyntaxClassifier.cs b/src/Workspaces/CSharp/Portable/Classification/SyntaxClassification/NameSyntaxClassifier.cs index c56c793ddbf32317ad687aa70cdc913c293a4b7e..05e5d2b8431d8b967638f8e5324cd4141986b1ff 100644 --- a/src/Workspaces/CSharp/Portable/Classification/SyntaxClassification/NameSyntaxClassifier.cs +++ b/src/Workspaces/CSharp/Portable/Classification/SyntaxClassification/NameSyntaxClassifier.cs @@ -123,17 +123,11 @@ private static bool IsNamespaceName(NameSyntax name) CancellationToken cancellationToken, out ClassifiedSpan classifiedSpan) { - if (symbol != null) + // Classify a reference to an attribute constructor in an attribute location + // as if we were classifying the attribute type itself. + if (symbol.IsConstructor() && name.IsParentKind(SyntaxKind.Attribute)) { - // see through using aliases - if (symbol.Kind == SymbolKind.Alias) - { - symbol = (symbol as IAliasSymbol).Target; - } - else if (symbol.IsConstructor() && name.IsParentKind(SyntaxKind.Attribute)) - { - symbol = symbol.ContainingType; - } + symbol = symbol.ContainingType; } if (name.IsVar && @@ -153,18 +147,15 @@ private static bool IsNamespaceName(NameSyntax name) } } - if (symbol != null) + // Use .Equals since we can't rely on object identity for constructed types. + if (symbol is ITypeSymbol typeSymbol) { - // Use .Equals since we can't rely on object identity for constructed types. - if (symbol is ITypeSymbol typeSymbol) + var classification = GetClassificationForType(typeSymbol); + if (classification != null) { - var classification = GetClassificationForType(typeSymbol); - if (classification != null) - { - var token = name.GetNameToken(); - classifiedSpan = new ClassifiedSpan(token.Span, classification); - return true; - } + var token = name.GetNameToken(); + classifiedSpan = new ClassifiedSpan(token.Span, classification); + return true; } } diff --git a/src/Workspaces/VisualBasic/Portable/Classification/SyntaxClassification/NameSyntaxClassifier.vb b/src/Workspaces/VisualBasic/Portable/Classification/SyntaxClassification/NameSyntaxClassifier.vb index c2a9b6a29dbc0a2d8f3a6f2d45bb2777c5cb2cda..1102cfb65b96ef9fd94a92e7eb1c70e2103b3a86 100644 --- a/src/Workspaces/VisualBasic/Portable/Classification/SyntaxClassification/NameSyntaxClassifier.vb +++ b/src/Workspaces/VisualBasic/Portable/Classification/SyntaxClassification/NameSyntaxClassifier.vb @@ -64,6 +64,12 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Classification.Classifiers End Select End If + ' Classify a reference to an attribute constructor in an attribute location + ' as if we were classifying the attribute type itself. + If symbol.IsConstructor() AndAlso node.IsParentKind(SyntaxKind.Attribute) Then + symbol = symbol.ContainingType + End If + If symbol IsNot Nothing Then If symbol.Kind = SymbolKind.Method Then Dim method = DirectCast(symbol, IMethodSymbol)