Skip to content

Commit

Permalink
Semplifications
Browse files Browse the repository at this point in the history
  • Loading branch information
CristianAmbrosini committed Feb 2, 2023
1 parent b9f2741 commit 063dfb2
Show file tree
Hide file tree
Showing 3 changed files with 14 additions and 23 deletions.
22 changes: 8 additions & 14 deletions analyzers/src/SonarAnalyzer.CSharp/Rules/UnusedStringBuilder.cs
Expand Up @@ -25,37 +25,31 @@ public sealed class UnusedStringBuilder : UnusedStringBuilderBase<SyntaxKind, Va
{
protected override ILanguageFacade<SyntaxKind> 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<BlockSyntax>().FirstOrDefault();

protected override bool IsIsStringInvoked(string variableName, IList<InvocationExpressionSyntax> invocations, SemanticModel semanticModel) =>
protected override bool IsIsStringInvoked(string variableName, IList<InvocationExpressionSyntax> 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<InvocationExpressionSyntax> invocations) =>
invocations.Any(x => x.ArgumentList.Arguments.Any(y => IsSameVariable(y.Expression, variableName)));

protected override bool IsReturned(string variableName, IList<ReturnStatementSyntax> 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<IdentifierNameSyntax>().Any(p => p.NameIs(variableName));
}
Expand Up @@ -32,7 +32,7 @@ public abstract class UnusedStringBuilderBase<TSyntaxKind, TVariableDeclarator,
protected abstract string GetVariableName(TVariableDeclarator declaration);
protected abstract bool NeedsToTrack(TVariableDeclarator declaration, SemanticModel semanticModel);
protected abstract SyntaxNode GetAncestorBlock(TVariableDeclarator declaration);
protected abstract bool IsIsStringInvoked(string variableName, IList<TInvocationExpression> invocations, SemanticModel semanticModel);
protected abstract bool IsIsStringInvoked(string variableName, IList<TInvocationExpression> invocations);
protected abstract bool IsPassedToMethod(string variableName, IList<TInvocationExpression> invocations);
protected abstract bool IsReturned(string variableName, IList<TReturnStatement> returnStatements);

Expand All @@ -53,7 +53,7 @@ public abstract class UnusedStringBuilderBase<TSyntaxKind, TVariableDeclarator,
return;
}
var invocations = block.DescendantNodes().OfType<TInvocationExpression>().ToList();
if (IsIsStringInvoked(variableName, invocations, c.SemanticModel)
if (IsIsStringInvoked(variableName, invocations)
|| IsPassedToMethod(variableName, invocations)
|| IsReturned(variableName, block.DescendantNodes().OfType<TReturnStatement>().ToList()))
{
Expand Down
Expand Up @@ -27,23 +27,20 @@ public sealed class UnusedStringBuilder : UnusedStringBuilderBase<SyntaxKind, Va
{
protected override ILanguageFacade<SyntaxKind> 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
&& expression.Initializer.Value is ObjectCreationExpressionSyntax objectCreation
&& objectCreation.Type.ToString().Equals(nameof(StringBuilder));

protected override SyntaxNode GetAncestorBlock(VariableDeclaratorSyntax declaration) =>
declaration.Ancestors().OfType<MethodBlockSyntax>().Any()
? declaration.Ancestors().OfType<MethodBlockSyntax>().First()
: declaration.Ancestors().OfType<AccessorBlockSyntax>().FirstOrDefault();
declaration.Ancestors().OfType<MethodBlockBaseSyntax>().First();

protected override bool IsIsStringInvoked(string variableName, IList<InvocationExpressionSyntax> invocations, SemanticModel semanticModel) =>
protected override bool IsIsStringInvoked(string variableName, IList<InvocationExpressionSyntax> 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<InvocationExpressionSyntax> invocations) =>
invocations.Any(x => x.ArgumentList.Arguments.Any(y => IsSameVariable(y.GetExpression(), variableName)));
Expand Down

0 comments on commit 063dfb2

Please sign in to comment.