111 lines
3.4 KiB
Python

import ast
from .. import flags
ELIF = 2
PASS = 4
def If(self, cmtor, state=0):
if state & PASS:
test = False
test_comment = "skipped"
else:
test = cmtor.eval(self.test, format=False)
test_comment = test
if test:
state = state | PASS
if state & ELIF:
cmtor.append_source(f"elif {cmtor.to_source(self.test)}: # {test_comment}")
else:
cmtor.append_source(f"if {cmtor.to_source(self.test)}: # {test_comment}")
cmtor.indent += flags.INDENT
for stmt in self.body:
if type(stmt) not in flags.APPEND_SOURCE_BY_THEMSELVES:
cmtor.append_source(cmtor.to_source(stmt))
if test:
cmtor.process(stmt)
test = cmtor._stack_event == flags.NORMAL
else:
cmtor._lines[-1] += " # skipped"
cmtor.append_source("")
cmtor.indent -= flags.INDENT
if self.orelse:
if type(self.orelse[0]) == ast.If:
cmtor.process(self.orelse[0], state=state | ELIF)
else:
test = not (state & PASS)
test_comment = True if test else "skipped"
cmtor.append_source(f"else: # {test_comment}")
cmtor.indent += flags.INDENT
for stmt in self.orelse:
if type(stmt) not in flags.APPEND_SOURCE_BY_THEMSELVES:
cmtor.append_source(cmtor.to_source(stmt))
if test:
cmtor.process(stmt)
test = cmtor._stack_event == flags.NORMAL
cmtor.append_source("")
cmtor.indent -= flags.INDENT
def For(self, cmtor):
cmtor.append_source(cmtor.to_source(ast.For(self.target, self.iter, [], [])))
loop_start: int = cmtor.next_line()
cmtor.indent += flags.INDENT
self_indent = cmtor.indent
REG_it = flags.REG("__for_loop_iter_once")
iter_obj = cmtor.eval(self.iter, format=False)
for it in iter_obj:
last_iter_start: int = cmtor.next_line()
# enter new iteration (mantain locals())
cmtor.append_source("")
# cmtor.append_source("###### !new iteration! ######")
cmtor._locals[REG_it] = it
stmt = ast.Assign([self.target], ast.Name(REG_it, ast.Load()))
cmtor.exec(stmt)
# process body
for stmt in self.body:
if type(stmt) not in flags.APPEND_SOURCE_BY_THEMSELVES:
cmtor.append_source(cmtor.to_source(stmt))
if cmtor._stack_event == flags.NORMAL:
cmtor.process(stmt)
else:
cmtor._lines[-1] += " # skipped"
cmtor.append_source()
if cmtor._stack_event == flags.BREAK:
cmtor._stack_event = flags.NORMAL
break
if cmtor._stack_event == flags.CONTINUE:
cmtor._stack_event = flags.NORMAL
continue
cmtor.indent -= flags.INDENT
# delete all code except for the last iter
for lineno in range(loop_start, last_iter_start):
cmtor._lines[lineno] = None
# if cmtor._lines_category[lineno][0] == flags.SOURCE:
# line: str = cmtor._lines[lineno]
# if line.lstrip() and line.lstrip()[0] != "#":
# cmtor._lines[lineno] = " " * self_indent + "# " + line[self_indent:]
def Break(self, cmtor):
cmtor._lines[-1] += " # True"
cmtor._stack_event = flags.BREAK
def Continue(self, cmtor):
cmtor._lines[-1] += " # True"
cmtor._stack_event = flags.CONTINUE