|
18 | 18 | * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
19 | 19 | */ |
20 | 20 |
|
| 21 | +using System.Linq.Expressions; |
| 22 | + |
21 | 23 | namespace SonarAnalyzer.Rules.CSharp; |
22 | 24 |
|
23 | 25 | [DiagnosticAnalyzer(LanguageNames.CSharp)] |
@@ -107,11 +109,8 @@ bool IsDuplicatedCastOnSameSymbol(ExpressionSyntax expression, SyntaxNode type) |
107 | 109 | && !CSharpFacade.Instance.Syntax.IsInExpressionTree(context.SemanticModel, expression); // see https://github.com/SonarSource/sonar-dotnet/issues/8735#issuecomment-1943419398 |
108 | 110 |
|
109 | 111 | bool IsCastOnSameSymbol(ExpressionSyntax expression) => |
110 | | - RemoveThisExpression(typedVariable).WithoutTrivia().IsEquivalentTo(RemoveThisExpression(expression).WithoutTrivia()) |
| 112 | + IsEquivalentVariable(expression, typedVariable) |
111 | 113 | && Equals(context.SemanticModel.GetSymbolInfo(expression).Symbol, typeExpressionSymbol); |
112 | | - |
113 | | - static SyntaxNode RemoveThisExpression(SyntaxNode node) => |
114 | | - node is MemberAccessExpressionSyntax { Expression: ThisExpressionSyntax } memberAccess ? memberAccess.Name : node; |
115 | 114 | } |
116 | 115 |
|
117 | 116 | private static void ProcessPatternExpression(SonarSyntaxNodeReportingContext analysisContext, SyntaxNode isPattern, SyntaxNode mainVariableExpression, SyntaxNode parentStatement) |
@@ -232,4 +231,24 @@ private static void ReportPatternAtCastLocation(SonarSyntaxNodeReportingContext |
232 | 231 | context.ReportIssue(Rule, castLocation, [patternLocation.ToSecondary()], message); |
233 | 232 | } |
234 | 233 | } |
| 234 | + |
| 235 | + private static bool IsEquivalentVariable(ExpressionSyntax expression, SyntaxNode typedVariable) |
| 236 | + { |
| 237 | + var left = RemoveThisExpression(typedVariable).WithoutTrivia(); |
| 238 | + var right = RemoveThisExpression(expression).WithoutTrivia(); |
| 239 | + |
| 240 | + return left.IsEquivalentTo(right) |
| 241 | + || (StandaloneIdentifier(left) is { } leftIdentifier && leftIdentifier == StandaloneIdentifier(right)); |
| 242 | + |
| 243 | + static string StandaloneIdentifier(SyntaxNode node) => |
| 244 | + node switch |
| 245 | + { |
| 246 | + IdentifierNameSyntax name => name.Identifier.ValueText, |
| 247 | + _ when node.IsKind(SyntaxKindEx.SingleVariableDesignation) => ((SingleVariableDesignationSyntaxWrapper)node).Identifier.ValueText, |
| 248 | + _ => null |
| 249 | + }; |
| 250 | + |
| 251 | + static SyntaxNode RemoveThisExpression(SyntaxNode node) => |
| 252 | + node is MemberAccessExpressionSyntax { Expression: ThisExpressionSyntax } memberAccess ? memberAccess.Name : node; |
| 253 | + } |
235 | 254 | } |
0 commit comments