(self, node: nodes.For, frame: Frame)
| 1179 | ) |
| 1180 | |
| 1181 | def visit_For(self, node: nodes.For, frame: Frame) -> None: |
| 1182 | loop_frame = frame.inner() |
| 1183 | loop_frame.loop_frame = True |
| 1184 | test_frame = frame.inner() |
| 1185 | else_frame = frame.inner() |
| 1186 | |
| 1187 | class="cm"># try to figure out if we have an extended loop. An extended loop |
| 1188 | class="cm"># is necessary if the loop is in recursive mode if the special loop |
| 1189 | class="cm"># variable is accessed in the body if the body is a scoped block. |
| 1190 | extended_loop = ( |
| 1191 | node.recursive |
| 1192 | or class="st">"loop" |
| 1193 | in find_undeclared(node.iter_child_nodes(only=(class="st">"body",)), (class="st">"loop",)) |
| 1194 | or any(block.scoped for block in node.find_all(nodes.Block)) |
| 1195 | ) |
| 1196 | |
| 1197 | loop_ref = None |
| 1198 | if extended_loop: |
| 1199 | loop_ref = loop_frame.symbols.declare_parameter(class="st">"loop") |
| 1200 | |
| 1201 | loop_frame.symbols.analyze_node(node, for_branch=class="st">"body") |
| 1202 | if node.else_: |
| 1203 | else_frame.symbols.analyze_node(node, for_branch=class="st">"else") |
| 1204 | |
| 1205 | if node.test: |
| 1206 | loop_filter_func = self.temporary_identifier() |
| 1207 | test_frame.symbols.analyze_node(node, for_branch=class="st">"test") |
| 1208 | self.writeline(fclass="st">"{self.func(loop_filter_func)}(fiter):", node.test) |
| 1209 | self.indent() |
| 1210 | self.enter_frame(test_frame) |
| 1211 | self.writeline(self.choose_async(class="st">"async for ", class="st">"for ")) |
| 1212 | self.visit(node.target, loop_frame) |
| 1213 | self.write(class="st">" in ") |
| 1214 | self.write(self.choose_async(class="st">"auto_aiter(fiter)", class="st">"fiter")) |
| 1215 | self.write(class="st">":") |
| 1216 | self.indent() |
| 1217 | self.writeline(class="st">"if ", node.test) |
| 1218 | self.visit(node.test, test_frame) |
| 1219 | self.write(class="st">":") |
| 1220 | self.indent() |
| 1221 | self.writeline(class="st">"yield ") |
| 1222 | self.visit(node.target, loop_frame) |
| 1223 | self.outdent(3) |
| 1224 | self.leave_frame(test_frame, with_python_scope=True) |
| 1225 | |
| 1226 | class="cm"># if we don't have an recursive loop we have to find the shadowed |
| 1227 | class="cm"># variables at that point. Because loops can be nested but the loop |
| 1228 | class="cm"># variable is a special one we have to enforce aliasing for it. |
| 1229 | if node.recursive: |
| 1230 | self.writeline( |
| 1231 | fclass="st">"{self.func(&class="cm">#x27;loop')}(reciter, loop_render_func, depth=0):", node |
| 1232 | ) |
| 1233 | self.indent() |
| 1234 | self.buffer(loop_frame) |
| 1235 | |
| 1236 | class="cm"># Use the same buffer for the else frame |
| 1237 | else_frame.buffer = loop_frame.buffer |
| 1238 |
nothing calls this directly
no test coverage detected