Skip to content

Commit

Permalink
Add support for indexer access
Browse files Browse the repository at this point in the history
  • Loading branch information
CristianAmbrosini committed Feb 7, 2023
1 parent 38a68cb commit 7257579
Show file tree
Hide file tree
Showing 4 changed files with 19 additions and 4 deletions.
Expand Up @@ -60,6 +60,9 @@ public sealed class UnusedStringBuilder : UnusedStringBuilderBase<SyntaxKind, Va
protected override bool IsWithinInterpolatedString(IList<InterpolationSyntax> interpolations, ISymbol variableSymbol, SemanticModel semanticModel) =>
interpolations.Any(x => IsSameVariable(x.Expression, variableSymbol, semanticModel));

protected override bool IsPropertyReferenced(VariableDeclaratorSyntax declaration, IList<InvocationExpressionSyntax> invocations, ISymbol variableSymbol, SemanticModel semanticModel) =>
GetElementAccessExpressions(declaration).Any(x => IsSameVariable(x.Expression, variableSymbol, semanticModel));

private static bool IsStringBuilderObjectCreation(ExpressionSyntax expression, SemanticModel semanticModel) =>
(expression is ObjectCreationExpressionSyntax || ImplicitObjectCreationExpressionSyntaxWrapper.IsInstance(expression))
&& ObjectCreationFactory.Create(expression).IsKnownType(KnownType.System_Text_StringBuilder, semanticModel);
Expand All @@ -72,6 +75,11 @@ public sealed class UnusedStringBuilder : UnusedStringBuilderBase<SyntaxKind, Va
private static bool IsSameVariable(IdentifierNameSyntax identifier, ISymbol variableSymbol, SemanticModel semanticModel) =>
variableSymbol.Equals(semanticModel.GetSymbolInfo(identifier).Symbol);

private static IList<ElementAccessExpressionSyntax> GetElementAccessExpressions(VariableDeclaratorSyntax declaration) =>
declaration.IsTopLevel()
? GetTopLevelStatementSyntax<ElementAccessExpressionSyntax>(declaration)
: declaration.Parent.Parent.Parent.DescendantNodes().OfType<ElementAccessExpressionSyntax>().ToList();

private static IList<T> GetTopLevelStatementSyntax<T>(VariableDeclaratorSyntax declaration)
{
List<T> list = new();
Expand Down
Expand Up @@ -41,6 +41,7 @@ public abstract class UnusedStringBuilderBase<TSyntaxKind, TVariableDeclarator,
protected abstract bool IsPassedToMethod(IList<TInvocationExpression> invocations, ISymbol variableSymbol, SemanticModel semanticModel);
protected abstract bool IsReturned(IList<TReturnStatement> returnStatements, ISymbol variableSymbol, SemanticModel semanticModel);
protected abstract bool IsWithinInterpolatedString(IList<TInterpolatedString> interpolations, ISymbol variableSymbol, SemanticModel semanticModel);
protected abstract bool IsPropertyReferenced(TVariableDeclarator declaration, IList<TInvocationExpression> invocations, ISymbol variableSymbol, SemanticModel semanticModel);

protected UnusedStringBuilderBase() : base(DiagnosticId) { }

Expand All @@ -57,7 +58,8 @@ public abstract class UnusedStringBuilderBase<TSyntaxKind, TVariableDeclarator,
if (IsStringBuilderContentRead(invocations, variableSymbol, c.SemanticModel)
|| IsPassedToMethod(invocations, variableSymbol, c.SemanticModel)
|| IsReturned(GetReturnStatements(variableDeclaration), variableSymbol, c.SemanticModel)
|| IsWithinInterpolatedString(GetInterpolatedStrings(variableDeclaration), variableSymbol, c.SemanticModel))
|| IsWithinInterpolatedString(GetInterpolatedStrings(variableDeclaration), variableSymbol, c.SemanticModel)
|| IsPropertyReferenced(variableDeclaration, invocations, variableSymbol, c.SemanticModel))
{
return;
}
Expand Down
Expand Up @@ -18,6 +18,8 @@
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/

using StyleCop.Analyzers.Lightup;

namespace SonarAnalyzer.Rules.VisualBasic;

[DiagnosticAnalyzer(LanguageNames.VisualBasic)]
Expand Down Expand Up @@ -54,6 +56,9 @@ public sealed class UnusedStringBuilder : UnusedStringBuilderBase<SyntaxKind, Va
protected override bool IsWithinInterpolatedString(IList<InterpolationSyntax> interpolations, ISymbol variableSymbol, SemanticModel semanticModel) =>
interpolations.Any(x => IsSameVariable(x.Expression, variableSymbol, semanticModel));

protected override bool IsPropertyReferenced(VariableDeclaratorSyntax declaration, IList<InvocationExpressionSyntax> invocations, ISymbol variableSymbol, SemanticModel semanticModel) =>
invocations.Any(x => IsSameVariable(x.Expression, variableSymbol, semanticModel) && semanticModel.GetOperation(x).Kind is OperationKindEx.PropertyReference);

private static bool IsSameVariable(ExpressionSyntax expression, ISymbol variableSymbol, SemanticModel semanticModel) =>
expression.DescendantNodesAndSelf().OfType<IdentifierNameSyntax>().Any(p => IsSameVariable(p, variableSymbol, semanticModel))
|| (expression.Ancestors().OfType<ConditionalAccessExpressionSyntax>().Any() && expression.Ancestors().OfType<ConditionalAccessExpressionSyntax>().First()
Expand Down
Expand Up @@ -39,7 +39,7 @@ public class UnusedStringBuilderTest
[DataRow("""var a = sb.Append("").Append("").Append("").Append("").ToString().ToLower();""", true)]
[DataRow("sb.CopyTo(0, new char[1], 0, 1);", true)]
[DataRow("sb.GetChunks();", true)]
[DataRow("var a = sb[0];", false)] // FP
[DataRow("var a = sb[0];", true)]
[DataRow("""sb?.Append("").ToString().ToLower();""", true)]
[DataRow("""@sb.Append("").ToString();""", true)]
[DataRow("sb.Remove(sb.Length - 1, 1);", true)]
Expand Down Expand Up @@ -83,7 +83,7 @@ public void MyMethod()
[DataRow("""var a = sb.Append("").Append("").Append("").Append("").ToString().ToLower();""", true)]
[DataRow("sb.CopyTo(0, new char[1], 0, 1);", true)]
[DataRow("sb.GetChunks();", true)]
[DataRow("var a = sb[0];", false)] // FP
[DataRow("var a = sb[0];", true)]
[DataRow("""sb?.Append("").ToString().ToLower();""", true)]
[DataRow("""@sb.Append("").ToString();""", true)]
[DataRow("sb.Remove(sb.Length - 1, 1);", true)]
Expand Down Expand Up @@ -115,7 +115,7 @@ public void UnusedStringBuilder_TopLevelStatements(string expression, bool compl
[DataRow("""Dim a = sb.Append("").Append("").Append("").Append("").ToString().ToLower()""", true)]
[DataRow("sb.CopyTo(0, New Char(0) {}, 0, 1)", true)]
[DataRow("sb.GetChunks()", true)]
[DataRow("Dim a = sb(0)", false)] // FP
[DataRow("Dim a = sb(0)", true)]
[DataRow("""sb?.Append("").ToString().ToLower()""", true)]
[DataRow("""sb.Append("").ToString()""", true)]
[DataRow("sb.Remove(sb.Length - 1, 1)", true)]
Expand Down

0 comments on commit 7257579

Please sign in to comment.