def __next__(self): if self.closed: raise common.MultiLevelStopIteration() current = next(self.gen) tok_type = current.type tok_str = current.string if tok_type == ENDMARKER: raise common.MultiLevelStopIteration() self.previous = self.current self.current = current # this is exactly the same check as in fast_parser, but this time with # tokenize and therefore precise. breaks = ['def', 'class', '@'] def close(): if not self.first_stmt: self.closed = True raise common.MultiLevelStopIteration() # ignore comments/ newlines if self.previous.type in (None, NEWLINE) and tok_type not in (COMMENT, NEWLINE): # print c, tok_name[c[0]] indent = current.start_pos[1] if indent < self.parser_indent: # -> dedent self.parser_indent = indent self.new_indent = False if not self.in_flow or indent < self.old_parser_indent: close() self.in_flow = False elif self.new_indent: self.parser_indent = indent self.new_indent = False if not self.in_flow: if tok_str in FLOWS or tok_str in breaks: self.in_flow = tok_str in FLOWS if not self.is_decorator and not self.in_flow: close() self.is_decorator = '@' == tok_str if not self.is_decorator: self.old_parser_indent = self.parser_indent self.parser_indent += 1 # new scope: must be higher self.new_indent = True if tok_str != '@': if self.first_stmt and not self.new_indent: self.parser_indent = indent self.first_stmt = False return current
def close(): if not self.first_stmt: self.closed = True raise common.MultiLevelStopIteration()