示例#1
0
 def visit_Call(self, node):
     needs_assign = False
     fname = node.func
     if isinstance(fname, ast.Attribute):
         if is_list(node.func.value) and fname.attr == "append":
             needs_assign = True
         value_id = get_id(fname.value)
         if value_id not in IGNORED_MODULE_SET:
             if value_id:
                 node0 = ast.Name(id=get_id(fname.value),
                                  lineno=node.lineno)
             else:
                 node0 = fname.value
             node.args = [node0] + node.args
             node.func = ast.Name(id=fname.attr,
                                  lineno=node.lineno,
                                  ctx=fname.ctx)
     if needs_assign:
         ret = ast.Assign(
             targets=[ast.Name(id=fname.value.id, lineno=node.lineno)],
             value=node,
             lineno=node.lineno,
             scopes=node.scopes,
         )
         return ret
     return node
示例#2
0
    def visit_Attribute(self, node):
        attr = node.attr
        if attr in self._keywords:
            attr = attr + "_"

        value_id = self.visit(node.value)

        if value_id == "sys":
            if attr == "argv":
                self._usings.add("std::env")
                return "env::args().map(|s| &*Box::leak(s.into_boxed_str())).collect()"

        if is_list(node.value):
            if node.attr == "append":
                attr = "push"
        if not value_id:
            value_id = ""

        if is_class_or_module(value_id, node.scopes):
            return "{0}::{1}".format(value_id, attr)

        ret = f"{value_id}.{attr}"
        if ret in self._attr_dispatch_table:
            ret = self._attr_dispatch_table[ret]
            return ret(self, node, value_id, attr)
        return ret
示例#3
0
    def visit_Attribute(self, node):
        attr = node.attr
        value_id = get_id(node.value)
        if is_builtin_import(value_id):
            return "py14::" + value_id + "::" + attr
        elif value_id == "math":
            if node.attr == "asin":
                return "std::asin"
            elif node.attr == "atan":
                return "std::atan"
            elif node.attr == "acos":
                return "std::acos"

        if is_list(node.value):
            if node.attr == "append":
                attr = "push_back"

        if is_enum(value_id, node.scopes):
            return f"{value_id}::{attr}"

        if is_class_or_module(value_id, node.scopes):
            return f"{value_id}.{attr}"

        if is_self_arg(value_id, node.scopes):
            return f"this->{attr}"

        return f"{value_id}.{attr}"
示例#4
0
    def visit_Call(self, node):
        fname = self.visit(node.func)
        vargs = []

        if (hasattr(node.func, "value") and is_list(node.func.value)
                and fname.endswith(".append")):
            fname = fname.replace(".append", " +=")

        if node.args:
            vargs += [self.visit(a) for a in node.args]
        if node.keywords:
            vargs += [self.visit(kw.value) for kw in node.keywords]

        ret = self._dispatch(node, fname, vargs)
        if ret is not None:
            return ret
        if vargs:
            args = ", ".join(vargs)
        else:
            args = ""

        if fname.endswith("+="):
            return f"{fname} {args}"

        return f"{fname}({args})"
示例#5
0
    def visit_Attribute(self, node):
        attr = node.attr
        value_id = self.visit(node.value)

        if is_list(node.value):
            if node.attr == "append":
                attr = "push_back"

        if value_id in {"string"}:
            return f"std::{value_id}::{attr}"

        if is_enum(value_id, node.scopes):
            return f"{value_id}::{attr}"

        if is_class_or_module(value_id, node.scopes):
            return f"{value_id}.{attr}"

        if is_self_arg(value_id, node.scopes):
            return f"this->{attr}"

        ret = f"{value_id}.{attr}"
        if ret in self._attr_dispatch_table:
            ret = self._attr_dispatch_table[ret]
            return ret(self, node, value_id, attr)

        return ret
示例#6
0
    def visit_Attribute(self, node):
        attr = node.attr

        value_id = self.visit(node.value)

        if is_list(node.value):
            if node.attr == "append":
                attr = "add"
        if not value_id:
            value_id = ""

        return value_id + "." + attr
示例#7
0
    def visit_Attribute(self, node: ast.Attribute) -> str:
        attr: str = node.attr

        value_id: str = self.visit(node.value)

        if is_list(node.value):
            if node.attr == "append":
                return f"{value_id} <<"
        if not value_id:
            value_id: str = ""
        ret: str = f"{value_id}.{attr}"
        if ret in self._attr_dispatch_table:
            return self._attr_dispatch_table[ret](self, node)
        return value_id + "." + attr
示例#8
0
    def visit_Attribute(self, node):
        attr = node.attr

        value_id = self.visit(node.value)

        if is_list(node.value):
            if node.attr == "append":
                attr = "push"
        if not value_id:
            value_id = ""

        if is_class_or_module(value_id, node.scopes):
            return "{0}::{1}".format(value_id, attr)

        return value_id + "." + attr
示例#9
0
 def visit_Call(self, node):
     fname = node.func
     if isinstance(fname, ast.Attribute):
         if is_list(node.func.value) and fname.attr == "append":
             new_func_name = "push!"
         else:
             new_func_name = fname.attr
         if get_id(fname.value):
             node0 = ast.Name(id=get_id(fname.value), lineno=node.lineno)
         else:
             node0 = fname.value
         node.args = [node0] + node.args
         node.func = ast.Name(id=new_func_name,
                              lineno=node.lineno,
                              ctx=fname.ctx)
     return node
示例#10
0
    def visit_Attribute(self, node):
        attr = node.attr

        value_id = self.visit(node.value)

        if is_list(node.value):
            if node.attr == "append":
                attr = "add"
        if not value_id:
            value_id = ""

        if is_class_or_module(value_id, node.scopes):
            return f"{value_id}.{attr}"

        if is_self_arg(value_id, node.scopes):
            return attr

        return f"{value_id}.{attr}"
示例#11
0
    def visit_Attribute(self, node) -> str:
        attr = node.attr

        value_id = self.visit(node.value)

        if value_id == "sys":
            if attr == "argv":
                self._usings.add("os")
                return "(@[getAppFilename()] & commandLineParams())"

        if is_list(node.value):
            if node.attr == "append":
                attr = "add"
        if not value_id:
            value_id = ""

        ret = f"{value_id}.{attr}"
        if ret in self._attr_dispatch_table:
            ret = self._attr_dispatch_table[ret]
            return ret(self, node, value_id, attr)
        return ret
示例#12
0
    def visit_Attribute(self, node):
        attr = node.attr

        value_id = self.visit(node.value)

        if value_id == "sys":
            if attr == "argv":
                self._usings.add("dart:io")
                return "(new List<String>.from([Platform.executable])..addAll(argv))"

        if is_list(node.value):
            if node.attr == "append":
                attr = "add"
        if not value_id:
            value_id = ""

        if is_class_or_module(value_id, node.scopes):
            return f"{value_id}.{attr}"

        if is_self_arg(value_id, node.scopes):
            return attr

        return f"{value_id}.{attr}"
示例#13
0
def test_is_list():
    source = parse("list1 = []", "list2 = list1")
    add_list_calls(source)
    list2 = source.body[1]
    assert is_list(list2)
示例#14
0
def decltype(node):
    """Create C++ decltype statement"""
    if is_list(node):
        return "std::vector<decltype({0})>".format(value_type(node))
    else:
        return "decltype({0})".format(value_type(node))