(self, node, frame)
| 1022 | 'update((%s))' % ', '.join(imap(repr, discarded_names))) |
| 1023 | |
| 1024 | def visit_For(self, node, frame): |
| 1025 | loop_frame = frame.inner() |
| 1026 | test_frame = frame.inner() |
| 1027 | else_frame = frame.inner() |
| 1028 | |
| 1029 | # try to figure out if we have an extended loop. An extended loop |
| 1030 | # is necessary if the loop is in recursive mode if the special loop |
| 1031 | # variable is accessed in the body. |
| 1032 | extended_loop = node.recursive or 'loop' in \ |
| 1033 | find_undeclared(node.iter_child_nodes( |
| 1034 | only=('body',)), ('loop',)) |
| 1035 | |
| 1036 | loop_ref = None |
| 1037 | if extended_loop: |
| 1038 | loop_ref = loop_frame.symbols.declare_parameter('loop') |
| 1039 | |
| 1040 | loop_frame.symbols.analyze_node(node, for_branch='body') |
| 1041 | if node.else_: |
| 1042 | else_frame.symbols.analyze_node(node, for_branch='else') |
| 1043 | |
| 1044 | if node.test: |
| 1045 | loop_filter_func = self.temporary_identifier() |
| 1046 | test_frame.symbols.analyze_node(node, for_branch='test') |
| 1047 | self.writeline('%s(fiter):' % self.func(loop_filter_func), node.test) |
| 1048 | self.indent() |
| 1049 | self.enter_frame(test_frame) |
| 1050 | self.writeline(self.environment.is_async and 'async for ' or 'for ') |
| 1051 | self.visit(node.target, loop_frame) |
| 1052 | self.write(' in ') |
| 1053 | self.write(self.environment.is_async and 'auto_aiter(fiter)' or 'fiter') |
| 1054 | self.write(':') |
| 1055 | self.indent() |
| 1056 | self.writeline('if ', node.test) |
| 1057 | self.visit(node.test, test_frame) |
| 1058 | self.write(':') |
| 1059 | self.indent() |
| 1060 | self.writeline('yield ') |
| 1061 | self.visit(node.target, loop_frame) |
| 1062 | self.outdent(3) |
| 1063 | self.leave_frame(test_frame, with_python_scope=True) |
| 1064 | |
| 1065 | # if we don't have an recursive loop we have to find the shadowed |
| 1066 | # variables at that point. Because loops can be nested but the loop |
| 1067 | # variable is a special one we have to enforce aliasing for it. |
| 1068 | if node.recursive: |
| 1069 | self.writeline('%s(reciter, loop_render_func, depth=0):' % |
| 1070 | self.func('loop'), node) |
| 1071 | self.indent() |
| 1072 | self.buffer(loop_frame) |
| 1073 | |
| 1074 | # Use the same buffer for the else frame |
| 1075 | else_frame.buffer = loop_frame.buffer |
| 1076 | |
| 1077 | # make sure the loop variable is a special one and raise a template |
| 1078 | # assertion error if a loop tries to write to loop |
| 1079 | if extended_loop: |
| 1080 | self.writeline('%s = missing' % loop_ref) |
| 1081 |
nothing calls this directly
no test coverage detected