Beispiel #1
0
def transform_string(source: str, *, m=None):
    from prestring.python.parse import parse_string
    t = parse_string(source)
    return transform(t, m=m)
Beispiel #2
0
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)
Beispiel #3
0
                                          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}")
Beispiel #4
0
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?
Beispiel #5
0
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="")
Beispiel #6
0
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='']