def transform_string(source: str, *, m=None): from prestring.python.parse import parse_string t = parse_string(source) return transform(t, m=m)
from prestring.python.parse import parse_string, dump_tree from lib2to3.fixer_util import Name, Assign t = parse_string(""" 1 + 2 + 3 + 4 # => xxx """.lstrip()) expr = t.children[0].children[0] print(repr(expr)) xx = expr.clone() xx.parent = None expr.replace(Assign(Name("foo"), xx)) print(t) dump_tree(t)
id=id(node), from_=type_repr(node.type)) sym_list.append(sym) # todo: relative for sym in sym_list: self.symbols[sym.name] = sym return True # stop def parse_imported_symbols(t: Node) -> t.Dict[str, Symbol]: v = CollectSymbolVisitor() v.visit(t) return v.symbols t = parse_string(""" from handofcats import as_subcommand from handofcats import as_subcommand as register """) D = parse_imported_symbols(t) for name, sym in D.items(): print(f"{name} -- {sym}") print("\n--\n") t = parse_file("_11parse_target.py") D = parse_imported_symbols(t) for name, sym in D.items(): print(f"{name} -- {sym}")
import inspect from lib2to3.pytree import Node from lib2to3.pgen2 import token import textwrap from prestring.python.parse import parse_string, PyTreeVisitor from prestring.python.parse import PyTreeDumper from handofcats import customize class FuncBodyPrinter(PyTreeVisitor): def visit_funcdef(self, node: Node): for i, child in enumerate(node.children): if child.type == token.COLON: break assert len(node.children) == i + 2 print(textwrap.dedent(str(node.children[i + 1]))) source = inspect.getsource(customize.logging_activate) t = parse_string(source) # print(t) # PyTreeDumper().visit(t) FuncBodyPrinter().visit(t) # TODO: args?
def main(): code = inspect.getsource(hello) code = inspect.getsource(sys.modules[__name__]) t = parse_string(code) print("# before\n", t, sep="") v = Visitor() v.visit(t) for kind, node in changes: if kind == "args": assert node.children[0].type == token.LPAR assert node.children[-1].type == token.RPAR node.children.insert(1, fixer_util.Name("m")) elif kind == "stmt": # TODO: support ";" # <stmt> # ↓ # m.stmt(<stmt>) node.prefix = f"{node.prefix}m.stmt(" assert node.children[-1].value == "\n" node.children[-1].prefix = f"){node.children[-1].prefix}" elif kind == "let": if type_repr(node.children[0].type) == "power": # TODO: foo.bar.boo = v => setattr(getattr(foo, "bar"), "boo", v) # <recv>.<attr> = <val> # ↓ # m.setattr(<recv>, "<attr>", <val>) # todo: recursive assert type_repr(node.children[0].type) == "power" power = node.children[0] name = power.children[0].value assert type_repr(power.children[1].type) == "trailer" trailer = power.children[1] assert trailer.children[0].type == token.DOT trailer.children[0] = fixer_util.Comma() attr = trailer.children[1] node.prefix = f"{node.prefix}m.setattr(" attr.prefix = f'{attr.prefix} "' assert node.children[1].type == token.EQUAL eq_node = node.children[1] node.children[1] = fixer_util.Comma() node.children[1].prefix = f'"{eq_node.prefix}' node.parent.children[-1].prefix = f"){node.parent.children[-1].prefix}" # attr_next.prefix = f'"){attr_next.prefix}' continue # <var> = <val> # ↓ # <var> = m.let("<var>", <val>) name = node.children[0].value assert node.children[1].value == "=" node.children[2].prefix = f"{node.children[2].prefix}m.let({name!r}, " next_sibling = node.next_sibling assert next_sibling is not None next_sibling.prefix = f"){next_sibling}" print("") print("# after\n", t, sep="")
from prestring.python.parse import parse_string, PyTreeDumper, PyTreeVisitor, type_repr t = parse_string(""" aaa = bbb() ccc.ddd = eee() fff = ggg.hhh() if __name__ == "__main__": main() """) PyTreeDumper().visit(t) class Visitor(PyTreeVisitor): def visit_expr_stmt(self, node): print("@", node.children, len(node.children)) print(node, "--", str(node.children[0]), "--") Visitor().visit(t) # file_input [4 children] # simple_stmt [2 children] # expr_stmt [3 children] # NAME('aaa') [lineno=2, column=0, prefix='\n'] # EQUAL('=') [lineno=2, column=4, prefix=' '] # power [2 children] # NAME('bbb') [lineno=2, column=6, prefix=' '] # trailer [2 children] # LPAR('(') [lineno=2, column=9, prefix=''] # RPAR(')') [lineno=2, column=10, prefix='']