Skip to content

Commit e2340ef

Browse files
Fix varaible designation
1 parent dce3c8e commit e2340ef

File tree

1 file changed

+23
-4
lines changed

1 file changed

+23
-4
lines changed

analyzers/src/SonarAnalyzer.CSharp/Rules/CastShouldNotBeDuplicated.cs

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
1919
*/
2020

21+
using System.Linq.Expressions;
22+
2123
namespace SonarAnalyzer.Rules.CSharp;
2224

2325
[DiagnosticAnalyzer(LanguageNames.CSharp)]
@@ -107,11 +109,8 @@ bool IsDuplicatedCastOnSameSymbol(ExpressionSyntax expression, SyntaxNode type)
107109
&& !CSharpFacade.Instance.Syntax.IsInExpressionTree(context.SemanticModel, expression); // see https://github.com/SonarSource/sonar-dotnet/issues/8735#issuecomment-1943419398
108110

109111
bool IsCastOnSameSymbol(ExpressionSyntax expression) =>
110-
RemoveThisExpression(typedVariable).WithoutTrivia().IsEquivalentTo(RemoveThisExpression(expression).WithoutTrivia())
112+
IsEquivalentVariable(expression, typedVariable)
111113
&& Equals(context.SemanticModel.GetSymbolInfo(expression).Symbol, typeExpressionSymbol);
112-
113-
static SyntaxNode RemoveThisExpression(SyntaxNode node) =>
114-
node is MemberAccessExpressionSyntax { Expression: ThisExpressionSyntax } memberAccess ? memberAccess.Name : node;
115114
}
116115

117116
private static void ProcessPatternExpression(SonarSyntaxNodeReportingContext analysisContext, SyntaxNode isPattern, SyntaxNode mainVariableExpression, SyntaxNode parentStatement)
@@ -232,4 +231,24 @@ private static void ReportPatternAtCastLocation(SonarSyntaxNodeReportingContext
232231
context.ReportIssue(Rule, castLocation, [patternLocation.ToSecondary()], message);
233232
}
234233
}
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+
}
235254
}

0 commit comments

Comments
 (0)