From 36749e8e50e8fc1c6eb686f72e17a7eda543153a Mon Sep 17 00:00:00 2001 From: Cristian Ambrosini Date: Thu, 2 Feb 2023 15:15:02 +0100 Subject: [PATCH] Semplifications --- .../Rules/UnusedStringBuilder.cs | 22 +++++++------------ .../Rules/UnusedStringBuilderBase.cs | 4 ++-- .../Rules/UnusedStringBuilder.cs | 11 ++++------ 3 files changed, 14 insertions(+), 23 deletions(-) diff --git a/analyzers/src/SonarAnalyzer.CSharp/Rules/UnusedStringBuilder.cs b/analyzers/src/SonarAnalyzer.CSharp/Rules/UnusedStringBuilder.cs index d6c6203a63d..0bb7c77668e 100644 --- a/analyzers/src/SonarAnalyzer.CSharp/Rules/UnusedStringBuilder.cs +++ b/analyzers/src/SonarAnalyzer.CSharp/Rules/UnusedStringBuilder.cs @@ -25,30 +25,20 @@ public sealed class UnusedStringBuilder : UnusedStringBuilderBase Language => CSharpFacade.Instance; - private const string StringBuilderToString = "System.Text.StringBuilder.ToString()"; - - protected override string GetVariableName(VariableDeclaratorSyntax declaration) => - declaration.GetName(); + protected override string GetVariableName(VariableDeclaratorSyntax declaration) => declaration.GetName(); protected override bool NeedsToTrack(VariableDeclaratorSyntax declaration, SemanticModel semanticModel) => declaration.Initializer is not null && declaration.Initializer.Value is { } expression - && expression switch - { - ObjectCreationExpressionSyntax => ObjectCreationFactory.Create(expression).IsKnownType(KnownType.System_Text_StringBuilder, semanticModel), - _ when ImplicitObjectCreationExpressionSyntaxWrapper.IsInstance(expression) => ObjectCreationFactory.Create(expression).IsKnownType(KnownType.System_Text_StringBuilder, semanticModel), - _ => false - }; + && IsStringBuilderObjectCreation(expression, semanticModel); protected override SyntaxNode GetAncestorBlock(VariableDeclaratorSyntax declaration) => declaration.Ancestors().OfType().FirstOrDefault(); - protected override bool IsIsStringInvoked(string variableName, IList invocations, SemanticModel semanticModel) => + protected override bool IsIsStringInvoked(string variableName, IList invocations) => invocations.Any(x => x.Expression is MemberAccessExpressionSyntax { } member && IsSameVariable(member.Expression, variableName) - && member.NameIs(nameof(ToString)) - && semanticModel.GetSymbolInfo(x).Symbol is IMethodSymbol symbol - && symbol.OriginalDefinition.ToString().Equals(StringBuilderToString)); + && member.NameIs(nameof(ToString))); protected override bool IsPassedToMethod(string variableName, IList invocations) => invocations.Any(x => x.ArgumentList.Arguments.Any(y => IsSameVariable(y.Expression, variableName))); @@ -56,6 +46,10 @@ public sealed class UnusedStringBuilder : UnusedStringBuilderBase returnStatements) => returnStatements.Any(x => IsSameVariable(x.Expression, variableName)); + private static bool IsStringBuilderObjectCreation(ExpressionSyntax expression, SemanticModel semanticModel) => + (expression is ObjectCreationExpressionSyntax || ImplicitObjectCreationExpressionSyntaxWrapper.IsInstance(expression)) + && ObjectCreationFactory.Create(expression).IsKnownType(KnownType.System_Text_StringBuilder, semanticModel); + private static bool IsSameVariable(ExpressionSyntax expression, string variableName) => expression.DescendantNodesAndSelf().OfType().Any(p => p.NameIs(variableName)); } diff --git a/analyzers/src/SonarAnalyzer.Common/Rules/UnusedStringBuilderBase.cs b/analyzers/src/SonarAnalyzer.Common/Rules/UnusedStringBuilderBase.cs index 99551cdb288..9572b88fa5e 100644 --- a/analyzers/src/SonarAnalyzer.Common/Rules/UnusedStringBuilderBase.cs +++ b/analyzers/src/SonarAnalyzer.Common/Rules/UnusedStringBuilderBase.cs @@ -32,7 +32,7 @@ public abstract class UnusedStringBuilderBase invocations, SemanticModel semanticModel); + protected abstract bool IsIsStringInvoked(string variableName, IList invocations); protected abstract bool IsPassedToMethod(string variableName, IList invocations); protected abstract bool IsReturned(string variableName, IList returnStatements); @@ -53,7 +53,7 @@ public abstract class UnusedStringBuilderBase().ToList(); - if (IsIsStringInvoked(variableName, invocations, c.SemanticModel) + if (IsIsStringInvoked(variableName, invocations) || IsPassedToMethod(variableName, invocations) || IsReturned(variableName, block.DescendantNodes().OfType().ToList())) { diff --git a/analyzers/src/SonarAnalyzer.VisualBasic/Rules/UnusedStringBuilder.cs b/analyzers/src/SonarAnalyzer.VisualBasic/Rules/UnusedStringBuilder.cs index ee7f936fa73..19f2be69a72 100644 --- a/analyzers/src/SonarAnalyzer.VisualBasic/Rules/UnusedStringBuilder.cs +++ b/analyzers/src/SonarAnalyzer.VisualBasic/Rules/UnusedStringBuilder.cs @@ -27,8 +27,7 @@ public sealed class UnusedStringBuilder : UnusedStringBuilderBase Language => VisualBasicFacade.Instance; - protected override string GetVariableName(VariableDeclaratorSyntax declaration) => - declaration.Names.FirstOrDefault().ToString(); + protected override string GetVariableName(VariableDeclaratorSyntax declaration) => declaration.Names.FirstOrDefault().ToString(); protected override bool NeedsToTrack(VariableDeclaratorSyntax expression, SemanticModel semanticModel) => expression.Initializer is not null @@ -36,14 +35,12 @@ public sealed class UnusedStringBuilder : UnusedStringBuilderBase - declaration.Ancestors().OfType().Any() - ? declaration.Ancestors().OfType().First() - : declaration.Ancestors().OfType().FirstOrDefault(); + declaration.Ancestors().OfType().First(); - protected override bool IsIsStringInvoked(string variableName, IList invocations, SemanticModel semanticModel) => + protected override bool IsIsStringInvoked(string variableName, IList invocations) => invocations.Any(x => x.Expression is MemberAccessExpressionSyntax { } member && IsSameVariable(member.Expression, variableName) - && member.IsMemberAccessOnKnownType(nameof(ToString), KnownType.System_Text_StringBuilder, semanticModel)); + && member.NameIs(nameof(ToString))); protected override bool IsPassedToMethod(string variableName, IList invocations) => invocations.Any(x => x.ArgumentList.Arguments.Any(y => IsSameVariable(y.GetExpression(), variableName)));