111 lines
3.4 KiB
Python
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
|