|
1 | 1 | using Microsoft.CodeAnalysis; |
| 2 | +using Microsoft.CodeAnalysis.CSharp; |
2 | 3 | using Microsoft.CodeAnalysis.CSharp.Syntax; |
3 | 4 | using Microsoft.CodeAnalysis.Operations; |
4 | 5 | using System; |
@@ -97,7 +98,7 @@ CancellationToken cancellationToken |
97 | 98 | { |
98 | 99 | var symbol = syntaxNode switch |
99 | 100 | { |
100 | | - GenericNameSyntax => semanticModel.GetSymbolInfo(syntaxNode, cancellationToken).Symbol, |
| 101 | + GenericNameSyntax genericNameSyntax => GetSymbol(genericNameSyntax, semanticModel, cancellationToken), |
101 | 102 | IdentifierNameSyntax or InvocationExpressionSyntax => GetSymbol(syntaxNode, semanticModel, cancellationToken), |
102 | 103 | _ => null |
103 | 104 | }; |
@@ -139,6 +140,24 @@ CancellationToken cancellationToken |
139 | 140 | return FromSyntaxNodeInternal(syntaxNode, semanticModel, cancellationToken); |
140 | 141 | } |
141 | 142 |
|
| 143 | + private static ISymbol? GetSymbol |
| 144 | + ( |
| 145 | + GenericNameSyntax genericNameSyntax, |
| 146 | + SemanticModel semanticModel, |
| 147 | + CancellationToken cancellationToken |
| 148 | + ) |
| 149 | + { |
| 150 | + if ((genericNameSyntax.Parent is InvocationExpressionSyntax) || |
| 151 | + ((genericNameSyntax.Parent is MemberAccessExpressionSyntax memberAccessExpressionSyntax) && |
| 152 | + (memberAccessExpressionSyntax.Parent is InvocationExpressionSyntax))) |
| 153 | + { |
| 154 | + // generic method invocations with an explicit type argument list produce a GenericNameSyntax node |
| 155 | + // this node is already added to the tree via the (grand)parent InvocationExpressionSyntax node |
| 156 | + return null; |
| 157 | + } |
| 158 | + return semanticModel.GetSymbolInfo(genericNameSyntax, cancellationToken).Symbol; |
| 159 | + } |
| 160 | + |
142 | 161 | private static ISymbol? GetSymbol |
143 | 162 | ( |
144 | 163 | SyntaxNode syntaxNode, |
|
0 commit comments