Skip to content

Commit afb6316

Browse files
authored
Cleanup AsyncWithStatement and AsyncForStatement (#2022)
1 parent 6c171a7 commit afb6316

File tree

2 files changed

+37
-68
lines changed

2 files changed

+37
-68
lines changed

src/core/IronPython/Compiler/Ast/AsyncForStatement.cs

Lines changed: 17 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -70,60 +70,44 @@ private Statement BuildDesugared() {
7070
var iterName = $"__asyncfor_iter{id}";
7171
var runningName = $"__asyncfor_running{id}";
7272

73-
// Helper to create nodes with proper parent and span
74-
NameExpression MakeName(string name) {
75-
var n = new NameExpression(name) { Parent = parent };
76-
n.IndexSpan = span;
77-
return n;
78-
}
79-
80-
T WithSpan<T>(T node) where T : Node {
73+
// Helper to assign proper parent and span to nodes
74+
T SetScope<T>(T node) where T : Node {
75+
node.Parent = parent;
8176
node.IndexSpan = span;
8277
return node;
8378
}
8479

8580
// _iter = ITER.__aiter__()
86-
var aiterAttr = WithSpan(new MemberExpression(List, "__aiter__") { Parent = parent });
87-
var aiterCall = WithSpan(new CallExpression(aiterAttr, null, null) { Parent = parent });
88-
var assignIter = WithSpan(new AssignmentStatement(new Expression[] { MakeName(iterName) }, aiterCall) { Parent = parent });
81+
var aiterAttr = SetScope(new MemberExpression(List, "__aiter__"));
82+
var aiterCall = SetScope(new CallExpression(aiterAttr, null, null));
83+
var assignIter = SetScope(new AssignmentStatement([SetScope(new NameExpression(iterName))], aiterCall));
8984

9085
// running = True
91-
var trueConst = new ConstantExpression(true) { Parent = parent }; trueConst.IndexSpan = span;
92-
var assignRunning = WithSpan(new AssignmentStatement(new Expression[] { MakeName(runningName) }, trueConst) { Parent = parent });
86+
var trueConst = SetScope(new ConstantExpression(true));
87+
var assignRunning = SetScope(new AssignmentStatement([SetScope(new NameExpression(runningName))], trueConst));
9388

9489
// TARGET = await __aiter.__anext__()
95-
var anextAttr = WithSpan(new MemberExpression(MakeName(iterName), "__anext__") { Parent = parent });
96-
var anextCall = WithSpan(new CallExpression(anextAttr, null, null) { Parent = parent });
90+
var anextAttr = SetScope(new MemberExpression(SetScope(new NameExpression(iterName)), "__anext__"));
91+
var anextCall = SetScope(new CallExpression(anextAttr, null, null));
9792
var awaitNext = new AwaitExpression(anextCall);
98-
var assignTarget = WithSpan(new AssignmentStatement(new Expression[] { Left }, awaitNext) { Parent = parent });
93+
var assignTarget = SetScope(new AssignmentStatement([Left], awaitNext));
9994

10095
// except StopAsyncIteration: __running = False
101-
var falseConst = new ConstantExpression(false) { Parent = parent }; falseConst.IndexSpan = span;
102-
var stopRunning = WithSpan(new AssignmentStatement(
103-
new Expression[] { MakeName(runningName) }, falseConst) { Parent = parent });
104-
var handler = WithSpan(new TryStatementHandler(
105-
MakeName("StopAsyncIteration"),
106-
null!,
107-
WithSpan(new SuiteStatement(new Statement[] { stopRunning }) { Parent = parent })
108-
) { Parent = parent });
96+
var falseConst = SetScope(new ConstantExpression(false));
97+
var stopRunning = SetScope(new AssignmentStatement([SetScope(new NameExpression(runningName))], falseConst));
98+
var handler = SetScope(new TryStatementHandler(SetScope(new NameExpression("StopAsyncIteration")), null!, SetScope(new SuiteStatement([stopRunning]))));
10999
handler.HeaderIndex = span.End;
110100

111101
// try/except/else block
112-
var tryExcept = WithSpan(new TryStatement(
113-
assignTarget,
114-
new[] { handler },
115-
WithSpan(new SuiteStatement(new Statement[] { Body }) { Parent = parent }),
116-
null!
117-
) { Parent = parent });
102+
var tryExcept = SetScope(new TryStatement(assignTarget, [handler], SetScope(new SuiteStatement([Body])), null));
118103
tryExcept.HeaderIndex = span.End;
119104

120105
// while __running: try/except/else
121-
var whileStmt = new WhileStatement(MakeName(runningName), tryExcept, Else);
106+
var whileStmt = new WhileStatement(SetScope(new NameExpression(runningName)), tryExcept, Else);
122107
whileStmt.SetLoc(GlobalParent, span.Start, span.End, span.End);
123108
whileStmt.Parent = parent;
124109

125-
var suite = WithSpan(new SuiteStatement(new Statement[] { assignIter, assignRunning, whileStmt }) { Parent = parent });
126-
return suite;
110+
return SetScope(new SuiteStatement([assignIter, assignRunning, whileStmt]));
127111
}
128112

129113
public override MSAst.Expression Reduce() {

src/core/IronPython/Compiler/Ast/AsyncWithStatement.cs

Lines changed: 20 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -52,57 +52,42 @@ private Statement BuildDesugared() {
5252
// finally:
5353
// await mgr.__aexit__(None, None, None)
5454

55-
// Helper to create nodes with proper parent and span
56-
NameExpression MakeName(string name) {
57-
var n = new NameExpression(name) { Parent = parent };
58-
n.IndexSpan = span;
59-
return n;
55+
// Helper to assign proper parent and span to nodes
56+
T SetScope<T>(T node) where T : Node {
57+
node.Parent = parent;
58+
node.IndexSpan = span;
59+
return node;
6060
}
6161

6262
// mgr = EXPR
63-
var assignMgr = new AssignmentStatement(new Expression[] { MakeName("__asyncwith_mgr") }, ContextManager) { Parent = parent };
64-
assignMgr.IndexSpan = span;
63+
var assignMgr = SetScope(new AssignmentStatement([SetScope(new NameExpression("__asyncwith_mgr"))], ContextManager));
6564

6665
// await mgr.__aenter__()
67-
var aenterAttr = new MemberExpression(MakeName("__asyncwith_mgr"), "__aenter__") { Parent = parent };
68-
aenterAttr.IndexSpan = span;
69-
var aenterCall = new CallExpression(aenterAttr, null, null) { Parent = parent };
70-
aenterCall.IndexSpan = span;
66+
var aenterAttr = SetScope(new MemberExpression(SetScope(new NameExpression("__asyncwith_mgr")), "__aenter__"));
67+
var aenterCall = SetScope(new CallExpression(aenterAttr, null, null));
7168
var awaitEnter = new AwaitExpression(aenterCall);
7269

7370
Statement bodyStmt;
74-
if (Variable != null) {
71+
if (Variable is not null) {
7572
// VAR = await value; BLOCK
76-
var assignVar = new AssignmentStatement(new Expression[] { Variable }, awaitEnter) { Parent = parent };
77-
assignVar.IndexSpan = span;
78-
bodyStmt = new SuiteStatement(new Statement[] { assignVar, Body }) { Parent = parent };
73+
var assignVar = SetScope(new AssignmentStatement([Variable], awaitEnter));
74+
bodyStmt = new SuiteStatement([assignVar, Body]) { Parent = parent };
7975
} else {
80-
var exprStmt = new ExpressionStatement(awaitEnter) { Parent = parent };
81-
exprStmt.IndexSpan = span;
82-
bodyStmt = new SuiteStatement(new Statement[] { exprStmt, Body }) { Parent = parent };
76+
var exprStmt = SetScope(new ExpressionStatement(awaitEnter));
77+
bodyStmt = new SuiteStatement([exprStmt, Body]) { Parent = parent };
8378
}
8479

8580
// await mgr.__aexit__(None, None, None)
86-
var aexitAttr = new MemberExpression(MakeName("__asyncwith_mgr"), "__aexit__") { Parent = parent };
87-
aexitAttr.IndexSpan = span;
88-
var none1 = new ConstantExpression(null) { Parent = parent }; none1.IndexSpan = span;
89-
var none2 = new ConstantExpression(null) { Parent = parent }; none2.IndexSpan = span;
90-
var none3 = new ConstantExpression(null) { Parent = parent }; none3.IndexSpan = span;
91-
var aexitCallNormal = new CallExpression(aexitAttr,
92-
new Expression[] { none1, none2, none3 }, null) { Parent = parent };
93-
aexitCallNormal.IndexSpan = span;
81+
var aexitAttr = SetScope(new MemberExpression(SetScope(new NameExpression("__asyncwith_mgr")), "__aexit__"));
82+
var none = SetScope(new ConstantExpression(null));
83+
var aexitCallNormal = SetScope(new CallExpression(aexitAttr, [none, none, none], null));
9484
var awaitExitNormal = new AwaitExpression(aexitCallNormal);
9585

9686
// try/finally: await __aexit__ on normal exit
97-
var finallyExprStmt = new ExpressionStatement(awaitExitNormal) { Parent = parent };
98-
finallyExprStmt.IndexSpan = span;
99-
var tryFinally = new TryStatement(bodyStmt, null, null, finallyExprStmt) { Parent = parent };
100-
tryFinally.IndexSpan = span;
101-
tryFinally.HeaderIndex = span.End;
102-
103-
var suite = new SuiteStatement(new Statement[] { assignMgr, tryFinally }) { Parent = parent };
104-
suite.IndexSpan = span;
105-
return suite;
87+
var finallyExprStmt = SetScope(new ExpressionStatement(awaitExitNormal));
88+
var tryFinally = SetScope(new TryStatement(bodyStmt, null, null, finallyExprStmt) { HeaderIndex = span.End });
89+
90+
return SetScope(new SuiteStatement([assignMgr, tryFinally]));
10691
}
10792

10893
public override MSAst.Expression Reduce() {

0 commit comments

Comments
 (0)