Skip to content

Commit 74a7abb

Browse files
[http-client-csharp] use recursion for statement flattening (microsoft#5268)
contributes to microsoft#5017
1 parent a226a76 commit 74a7abb

File tree

2 files changed

+36
-14
lines changed

2 files changed

+36
-14
lines changed

packages/http-client-csharp/generator/Microsoft.Generator.CSharp/src/Statements/MethodBodyStatement.cs

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -28,24 +28,19 @@ internal override void Write(CodeWriter writer)
2828

2929
public IEnumerable<MethodBodyStatement> Flatten()
3030
{
31-
Queue<MethodBodyStatement> queue = new();
32-
queue.Enqueue(this);
33-
34-
while (queue.Count > 0)
31+
if (this is MethodBodyStatements statements)
3532
{
36-
MethodBodyStatement current = queue.Dequeue();
37-
38-
if (current is MethodBodyStatements statements)
33+
foreach (var statement in statements.Statements)
3934
{
40-
foreach (var subStatement in statements.Statements)
35+
foreach (var subStatement in statement.Flatten())
4136
{
42-
queue.Enqueue(subStatement);
37+
yield return subStatement;
4338
}
4439
}
45-
else
46-
{
47-
yield return current;
48-
}
40+
}
41+
else
42+
{
43+
yield return this;
4944
}
5045
}
5146

packages/http-client-csharp/generator/Microsoft.Generator.CSharp/test/Statements/StatementTests.cs

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -518,6 +518,33 @@ public void TestFlatten()
518518
Assert.AreEqual(ifTrueStatement.Body.ToDisplayString(), body[0].ToDisplayString());
519519
}
520520

521-
521+
[Test]
522+
public void TestFlatten_CorrectNestedOrder()
523+
{
524+
var statement1 = new IfStatement(True) { Return(True) };
525+
var statement2 = new IfStatement(False) { Return(False) };
526+
var nestedStatement1 = new IfStatement(False) { Return(Literal("Foo")) };
527+
var nestedStatement2 = new IfStatement(True) { Return(Literal("Bar")) };
528+
var methodBodyStatements = new MethodBodyStatements(
529+
[
530+
statement1,
531+
new MethodBodyStatements(
532+
[
533+
nestedStatement1,
534+
nestedStatement2
535+
]),
536+
statement2
537+
]);
538+
539+
var result = methodBodyStatements.Flatten();
540+
var expectedOrder = new List<MethodBodyStatement>
541+
{
542+
statement1,
543+
nestedStatement1,
544+
nestedStatement2,
545+
statement2
546+
};
547+
Assert.AreEqual(expectedOrder, result);
548+
}
522549
}
523550
}

0 commit comments

Comments
 (0)