MCPcopy
hub / github.com/pallets/jinja / visit_For

Method visit_For

src/jinja2/compiler.py:1181–1318  ·  src/jinja2/compiler.py::CodeGenerator.visit_For
(self, node: nodes.For, frame: Frame)

Source from the content-addressed store, hash-verified

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

Callers

nothing calls this directly

Calls 15

temporary_identifierMethod · 0.95
writelineMethod · 0.95
funcMethod · 0.95
indentMethod · 0.95
enter_frameMethod · 0.95
choose_asyncMethod · 0.95
writeMethod · 0.95
outdentMethod · 0.95
leave_frameMethod · 0.95
bufferMethod · 0.95
failMethod · 0.95
blockvisitMethod · 0.95

Tested by

no test coverage detected