|
6 | 6 |
|
7 | 7 | using System.Threading; |
8 | 8 |
|
9 | | -using Microsoft.Scripting; |
| 9 | +using IronPython.Runtime.Binding; |
| 10 | +using IronPython.Runtime.Exceptions; |
| 11 | + |
10 | 12 | using MSAst = System.Linq.Expressions; |
11 | 13 |
|
12 | 14 | namespace IronPython.Compiler.Ast { |
@@ -70,60 +72,42 @@ private Statement BuildDesugared() { |
70 | 72 | var iterName = $"__asyncfor_iter{id}"; |
71 | 73 | var runningName = $"__asyncfor_running{id}"; |
72 | 74 |
|
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 { |
| 75 | + // Helper to assign proper parent and span to nodes |
| 76 | + T SetScope<T>(T node) where T : Node { |
| 77 | + node.Parent = parent; |
81 | 78 | node.IndexSpan = span; |
82 | 79 | return node; |
83 | 80 | } |
84 | 81 |
|
85 | 82 | // _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 }); |
| 83 | + var aiterCall = SetScope(new UnaryExpression(PythonOperationKind.AIter, List)); |
| 84 | + var assignIter = SetScope(new AssignmentStatement([SetScope(new NameExpression(iterName))], aiterCall)); |
89 | 85 |
|
90 | 86 | // 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 }); |
| 87 | + var trueConst = SetScope(new ConstantExpression(true)); |
| 88 | + var assignRunning = SetScope(new AssignmentStatement([SetScope(new NameExpression(runningName))], trueConst)); |
93 | 89 |
|
94 | 90 | // 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 }); |
| 91 | + var anextCall = SetScope(new UnaryExpression(PythonOperationKind.ANext, SetScope(new NameExpression(iterName)))); |
97 | 92 | 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)); |
99 | 94 |
|
100 | 95 | // 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(nameof(PythonExceptions.StopAsyncIteration))), null!, SetScope(new SuiteStatement([stopRunning])))); |
109 | 99 | handler.HeaderIndex = span.End; |
110 | 100 |
|
111 | 101 | // 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)); |
118 | 103 | tryExcept.HeaderIndex = span.End; |
119 | 104 |
|
120 | 105 | // 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); |
122 | 107 | whileStmt.SetLoc(GlobalParent, span.Start, span.End, span.End); |
123 | 108 | whileStmt.Parent = parent; |
124 | 109 |
|
125 | | - var suite = WithSpan(new SuiteStatement(new Statement[] { assignIter, assignRunning, whileStmt }) { Parent = parent }); |
126 | | - return suite; |
| 110 | + return SetScope(new SuiteStatement([assignIter, assignRunning, whileStmt])); |
127 | 111 | } |
128 | 112 |
|
129 | 113 | public override MSAst.Expression Reduce() { |
|
0 commit comments