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
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
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}"
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})"
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
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
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
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
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
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}"
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
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}"
def test_is_list(): source = parse("list1 = []", "list2 = list1") add_list_calls(source) list2 = source.body[1] assert is_list(list2)
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))