(self, node: nodes.For, frame: Frame)
| 1155 | ) |
| 1156 | |
| 1157 | def visit_For(self, node: nodes.For, frame: Frame) -> None: |
| 1158 | loop_frame = frame.inner() |
| 1159 | loop_frame.loop_frame = True |
| 1160 | test_frame = frame.inner() |
| 1161 | else_frame = frame.inner() |
| 1162 | |
| 1163 | # try to figure out if we have an extended loop. An extended loop |
| 1164 | # is necessary if the loop is in recursive mode if the special loop |
| 1165 | # variable is accessed in the body if the body is a scoped block. |
| 1166 | extended_loop = ( |
| 1167 | node.recursive |
| 1168 | or "loop" |
| 1169 | in find_undeclared(node.iter_child_nodes(only=("body",)), ("loop",)) |
| 1170 | or any(block.scoped for block in node.find_all(nodes.Block)) |
| 1171 | ) |
| 1172 | |
| 1173 | loop_ref = None |
| 1174 | if extended_loop: |
| 1175 | loop_ref = loop_frame.symbols.declare_parameter("loop") |
| 1176 | |
| 1177 | loop_frame.symbols.analyze_node(node, for_branch="body") |
| 1178 | if node.else_: |
| 1179 | else_frame.symbols.analyze_node(node, for_branch="else") |
| 1180 | |
| 1181 | if node.test: |
| 1182 | loop_filter_func = self.temporary_identifier() |
| 1183 | test_frame.symbols.analyze_node(node, for_branch="test") |
| 1184 | self.writeline(f"{self.func(loop_filter_func)}(fiter):", node.test) |
| 1185 | self.indent() |
| 1186 | self.enter_frame(test_frame) |
| 1187 | self.writeline(self.choose_async("async for ", "for ")) |
| 1188 | self.visit(node.target, loop_frame) |
| 1189 | self.write(" in ") |
| 1190 | self.write(self.choose_async("auto_aiter(fiter)", "fiter")) |
| 1191 | self.write(":") |
| 1192 | self.indent() |
| 1193 | self.writeline("if ", node.test) |
| 1194 | self.visit(node.test, test_frame) |
| 1195 | self.write(":") |
| 1196 | self.indent() |
| 1197 | self.writeline("yield ") |
| 1198 | self.visit(node.target, loop_frame) |
| 1199 | self.outdent(3) |
| 1200 | self.leave_frame(test_frame, with_python_scope=True) |
| 1201 | |
| 1202 | # if we don't have an recursive loop we have to find the shadowed |
| 1203 | # variables at that point. Because loops can be nested but the loop |
| 1204 | # variable is a special one we have to enforce aliasing for it. |
| 1205 | if node.recursive: |
| 1206 | self.writeline( |
| 1207 | f"{self.func('loop')}(reciter, loop_render_func, depth=0):", node |
| 1208 | ) |
| 1209 | self.indent() |
| 1210 | self.buffer(loop_frame) |
| 1211 | |
| 1212 | # Use the same buffer for the else frame |
| 1213 | else_frame.buffer = loop_frame.buffer |
| 1214 |
nothing calls this directly
no test coverage detected