Skip to content

Commit 8b0e657

Browse files
committed
for statement increment as postfix added
1 parent 9e428fe commit 8b0e657

5 files changed

Lines changed: 51 additions & 3 deletions

File tree

src/Analyzers/CSharp/Tests/UseCompoundAssignment/UseCompoundAssignmentTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1087,7 +1087,7 @@ void M()
10871087
{
10881088
void M()
10891089
{
1090-
for (int i = 0; i < 10; ++i)
1090+
for (int i = 0; i < 10; i++)
10911091
{
10921092
}
10931093
}

src/Analyzers/Core/CodeFixes/UseCompoundAssignment/AbstractUseCompoundAssignmentCodeFixProvider.cs

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,12 +81,12 @@ protected override Task FixAllAsync(
8181

8282
if (diagnostic.Properties.ContainsKey(UseCompoundAssignmentUtilities.Increment))
8383
{
84-
return Increment((TExpressionSyntax)leftOfAssign.WithTriviaFrom(currentAssignment), postfix: syntaxFacts.IsSimpleAssignmentStatement(currentAssignment.Parent));
84+
return IncrementOrDecrement(Increment, currentAssignment, leftOfAssign);
8585
}
8686

8787
if (diagnostic.Properties.ContainsKey(UseCompoundAssignmentUtilities.Decrement))
8888
{
89-
return Decrement((TExpressionSyntax)leftOfAssign.WithTriviaFrom(currentAssignment), postfix: syntaxFacts.IsSimpleAssignmentStatement(currentAssignment.Parent));
89+
return IncrementOrDecrement(Decrement, currentAssignment, leftOfAssign);
9090
}
9191

9292
var assignmentOpKind = _binaryToAssignmentMap[syntaxKinds.Convert<TSyntaxKind>(rightOfAssign.RawKind)];
@@ -100,6 +100,20 @@ protected override Task FixAllAsync(
100100
}
101101

102102
return Task.CompletedTask;
103+
104+
SyntaxNode IncrementOrDecrement(Func<TExpressionSyntax, bool, TExpressionSyntax> incrementOrDecrementFactory, SyntaxNode currentAssignment, SyntaxNode leftOfAssignment)
105+
{
106+
var postfix = syntaxFacts.IsSimpleAssignmentStatement(currentAssignment.Parent);
107+
if (!postfix)
108+
{
109+
syntaxFacts.GetPartsOfForStatement(currentAssignment.Parent, out _, out _, out _, out var increments);
110+
if (increments.Contains(currentAssignment))
111+
{
112+
postfix = true;
113+
}
114+
}
115+
return incrementOrDecrementFactory((TExpressionSyntax)leftOfAssignment.WithTriviaFrom(currentAssignment), postfix);
116+
}
103117
}
104118

105119
private class MyCodeAction : CustomCodeActions.DocumentChangeAction

src/Workspaces/SharedUtilitiesAndExtensions/Compiler/CSharp/Services/SyntaxFacts/CSharpSyntaxFacts.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1453,6 +1453,21 @@ public SyntaxNode GetExpressionOfAwaitExpression(SyntaxNode node)
14531453
public bool IsExpressionOfForeach([NotNullWhen(true)] SyntaxNode? node)
14541454
=> node?.Parent is ForEachStatementSyntax foreachStatement && foreachStatement.Expression == node;
14551455

1456+
public void GetPartsOfForStatement(SyntaxNode? node, out SyntaxNode? variableDeclaration, out SyntaxNode? startvalue, out SyntaxNode? endCondition, out ImmutableArray<SyntaxNode> increments)
1457+
{
1458+
variableDeclaration = null;
1459+
startvalue = null;
1460+
endCondition = null;
1461+
increments = ImmutableArray<SyntaxNode>.Empty;
1462+
1463+
if (node is ForStatementSyntax forStatement)
1464+
{
1465+
variableDeclaration = forStatement.Declaration;
1466+
endCondition = forStatement.Condition;
1467+
increments = forStatement.Incrementors.ToImmutableArray<SyntaxNode>();
1468+
}
1469+
}
1470+
14561471
public SyntaxNode GetExpressionOfExpressionStatement(SyntaxNode node)
14571472
=> ((ExpressionStatementSyntax)node).Expression;
14581473

src/Workspaces/SharedUtilitiesAndExtensions/Compiler/Core/Services/SyntaxFacts/ISyntaxFacts.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,15 @@ internal interface ISyntaxFacts
143143
bool IsExpressionOfAwaitExpression([NotNullWhen(true)] SyntaxNode? node);
144144
SyntaxNode GetExpressionOfAwaitExpression(SyntaxNode node);
145145
bool IsExpressionOfForeach([NotNullWhen(true)] SyntaxNode? node);
146+
/// <summary>
147+
/// Returns the parts of a for loop. C#: for(var i = 0; i &lt; 10; i++) VB: For i = 0 To 10 Step 1
148+
/// </summary>
149+
/// <param name="node">The for loop statement</param>
150+
/// <param name="variableDeclaration">C#: var i = 0 | VB: i</param>
151+
/// <param name="startValue">C#: null | VB: 0</param>
152+
/// <param name="endCondition">C#: i &lt; 10 | VB: 10</param>
153+
/// <param name="increments">C#: i++ | VB: Step 1</param>
154+
void GetPartsOfForStatement(SyntaxNode? node, out SyntaxNode? variableDeclaration, out SyntaxNode? startValue, out SyntaxNode? endCondition, out ImmutableArray<SyntaxNode> increments);
146155

147156
void GetPartsOfTupleExpression<TArgumentSyntax>(SyntaxNode node,
148157
out SyntaxToken openParen, out SeparatedSyntaxList<TArgumentSyntax> arguments, out SyntaxToken closeParen) where TArgumentSyntax : SyntaxNode;

src/Workspaces/SharedUtilitiesAndExtensions/Compiler/VisualBasic/Services/SyntaxFacts/VisualBasicSyntaxFacts.vb

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1515,6 +1515,16 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.LanguageServices
15151515
Return node IsNot Nothing AndAlso TryCast(node.Parent, ForEachStatementSyntax)?.Expression Is node
15161516
End Function
15171517

1518+
Public Sub GetPartsOfForStatement(node As SyntaxNode, ByRef variableDeclaration As SyntaxNode, ByRef startValue As SyntaxNode, ByRef endCondition As SyntaxNode, ByRef increments As ImmutableArray(Of SyntaxNode)) Implements ISyntaxFacts.GetPartsOfForStatement
1519+
If TypeOf node Is ForStatementSyntax Then
1520+
Dim forStatement = DirectCast(node, ForStatementSyntax)
1521+
variableDeclaration = forStatement.ControlVariable
1522+
startValue = forStatement.FromValue
1523+
endCondition = forStatement.ToValue
1524+
increments = ImmutableArray.Create(Of SyntaxNode)(forStatement.StepClause)
1525+
End If
1526+
End Sub
1527+
15181528
Public Function GetExpressionOfExpressionStatement(node As SyntaxNode) As SyntaxNode Implements ISyntaxFacts.GetExpressionOfExpressionStatement
15191529
Return DirectCast(node, ExpressionStatementSyntax).Expression
15201530
End Function

0 commit comments

Comments
 (0)