Skip to content

Commit

Permalink
Refactor AssignedExpressionWalker.
Browse files Browse the repository at this point in the history
  • Loading branch information
josefpihrt committed Nov 7, 2017
1 parent 845ef35 commit 9747ac6
Show file tree
Hide file tree
Showing 2 changed files with 76 additions and 48 deletions.
73 changes: 26 additions & 47 deletions source/Core/CSharp/SyntaxWalkers/AssignedExpressionWalker.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,62 +12,40 @@ public virtual void VisitAssignedExpression(ExpressionSyntax expression)
{
}

private void VisitAssignedExpressionCore(ExpressionSyntax expression)
public override void VisitAssignmentExpression(AssignmentExpressionSyntax node)
{
if (expression == null)
return;
ExpressionSyntax left = node.Left;

if (expression is TupleExpressionSyntax tupleExpression)
if (node.Kind() == SyntaxKind.SimpleAssignmentExpression
&& (left is TupleExpressionSyntax tupleExpression))
{
foreach (ArgumentSyntax argument in tupleExpression.Arguments)
{
ExpressionSyntax argumentExpression = argument.Expression;
ExpressionSyntax expression = argument.Expression;

if (expression?.IsKind(SyntaxKind.DeclarationExpression) == false)
VisitAssignedExpression(expression);

if (argumentExpression?.IsKind(SyntaxKind.DeclarationExpression) == false)
VisitAssignedExpression(argumentExpression);
VisitArgument(argument);
}
}
else
{
VisitAssignedExpression(expression);
VisitAssignedExpression(left);
Visit(left);
}
}

public override void VisitAssignmentExpression(AssignmentExpressionSyntax node)
{
switch (node.Kind())
{
case SyntaxKind.SimpleAssignmentExpression:
case SyntaxKind.AddAssignmentExpression:
case SyntaxKind.SubtractAssignmentExpression:
case SyntaxKind.MultiplyAssignmentExpression:
case SyntaxKind.DivideAssignmentExpression:
case SyntaxKind.ModuloAssignmentExpression:
case SyntaxKind.AndAssignmentExpression:
case SyntaxKind.ExclusiveOrAssignmentExpression:
case SyntaxKind.OrAssignmentExpression:
case SyntaxKind.LeftShiftAssignmentExpression:
case SyntaxKind.RightShiftAssignmentExpression:
{
VisitAssignedExpressionCore(node.Left);
VisitToken(node.OperatorToken);
Visit(node.Right);
break;
}
default:
{
base.VisitAssignmentExpression(node);
break;
}
}
Visit(node.Right);
}

public override void VisitPrefixUnaryExpression(PrefixUnaryExpressionSyntax node)
{
if (node.IsKind(SyntaxKind.PreIncrementExpression, SyntaxKind.PreDecrementExpression))
{
VisitToken(node.OperatorToken);
VisitAssignedExpressionCore(node.Operand);
ExpressionSyntax operand = node.Operand;

VisitAssignedExpression(operand);
Visit(operand);
}
else
{
Expand All @@ -79,8 +57,10 @@ public override void VisitPostfixUnaryExpression(PostfixUnaryExpressionSyntax no
{
if (node.IsKind(SyntaxKind.PostIncrementExpression, SyntaxKind.PostDecrementExpression))
{
VisitAssignedExpressionCore(node.Operand);
VisitToken(node.OperatorToken);
ExpressionSyntax operand = node.Operand;

VisitAssignedExpression(operand);
Visit(operand);
}
else
{
Expand All @@ -92,14 +72,13 @@ public override void VisitArgument(ArgumentSyntax node)
{
if (node.RefOrOutKeyword.IsKind(SyntaxKind.RefKeyword, SyntaxKind.OutKeyword))
{
VisitToken(node.RefOrOutKeyword);
Visit(node.NameColon);
VisitAssignedExpressionCore(node.Expression);
}
else
{
base.VisitArgument(node);
ExpressionSyntax expression = node.Expression;

if (expression?.IsKind(SyntaxKind.DeclarationExpression) == false)
VisitAssignedExpression(expression);
}

base.VisitArgument(node);
}
}
}
51 changes: 50 additions & 1 deletion source/Tests/AnalyzersTests/MarkLocalVariableAsConst.cs
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,12 @@ public static void Foo()

var options = StringSplitOptions.None;
StringSplitOptions options2 = options;
}

// n
//n

public static void Foo2()
{
string s6 = "", s7 = string.Empty;
string x6 = s6;
string x7 = s7;
Expand All @@ -51,6 +54,52 @@ public static void Foo()
string tuple2 = null;

(tuple1, tuple2) = default((string, string));

var a = new int[] { 0 };

int i1 = 0;
int i2 = 0;
(a[i1++], a[i2--]) = default((int, int));

int i3 = 0;
int i4 = 0;
(a[++i3], a[--i4]) = default((int, int));

int i5 = 0;
a[i5++] = 0;

int i6 = 0;
a[i6--] = 0;

int i7 = 0;
a[++i7] = 0;

int i8 = 0;
a[--i8] = 0;

int i9 = 0;
i = (a[i9++])++;

int i10 = 0;
i = (a[i10--])--;

int i11 = 0;
i = ++(a[++i11]);

int i12 = 0;
i = --(a[--i12]);

int i13 = 0;
int.TryParse("", out a[i13++]);

int i14 = 0;
int.TryParse("", out a[i14--]);

int i15 = 0;
int.TryParse("", out a[++i15]);

int i16 = 0;
int.TryParse("", out a[--i16]);
}
}
}

0 comments on commit 9747ac6

Please sign in to comment.