Coverage for /pythoncovmergedfiles/medio/medio/src/underscore/underscore/variable_changer.py: 97%
Shortcuts on this page
r m x toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
Shortcuts on this page
r m x toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
1# Copyright (c) 2013 Huan Do, http://huan.do
3import ast
5from assignment_manager import AssignmentManager
7class VariableChanger(ast.NodeVisitor):
9 def __init__(self, env):
10 self.env = env
11 self.assignment_manager = AssignmentManager()
13 def get_new_name(self, old_name, is_imported=False):
14 assert isinstance(old_name, str), str(old_name)
16 new_name = (self.env.current_frame.get_new_name(old_name) or
17 self.assignment_manager.get_new_name(old_name))
19 if new_name is None and self.env.starred:
20 return old_name
22 if new_name is None:
23 new_name = self.env.generate_new_decl().name
24 if not is_imported:
25 self.assignment_manager.add_assignment(
26 new_name, ast.Name(id=old_name, ctx=ast.Store()))
27 return new_name
29 def scope_generators(self, exprs, generators):
30 if generators:
31 first, rest = generators[0], generators[1:]
32 with self.env.Frame(first):
33 self.generic_visit(first)
34 self.scope_generators(exprs, rest)
35 else:
36 for expr in exprs:
37 self.visit(expr)
39 def visit_Comprehensions(self, node):
40 if hasattr(node, 'elt'):
41 self.scope_generators([node.elt], node.generators)
42 else:
43 self.scope_generators([node.key, node.value], node.generators)
45 visit_SetComp = visit_ListComp = visit_DictComp = visit_Comprehensions
47 def visit_Assign(self, node):
48 for target in node.targets:
49 self.generic_rename(target)
50 self.visit(node.value)
52 def visit_Attribute(self, node):
53 self.generic_rename(node)
55 def visit_Module(self, node):
56 with self.env.Frame(node) as f:
57 self.generic_visit(node)
58 if f.decl_assignment_node:
59 node.body.append(f.decl_assignment_node)
61 def visit_ClassDef(self, node):
62 node.name = self.get_new_name(node.name)
63 with self.env.Frame(node) as f:
64 self.generic_visit(node)
65 if f.decl_assignment_node:
66 node.body.append(f.decl_assignment_node)
68 def visit_Lambda(self, node):
69 with self.env.Frame(node) as f:
70 self.generic_visit(node)
72 def visit_FunctionDef(self, node):
73 node.name = self.get_new_name(node.name)
74 with self.env.Frame(node) as f:
75 self.generic_visit(node)
77 def visit_Call(self, node):
78 self.generic_rename(node.func)
80 for arg in node.args:
81 specific_visit = 'visit_' + type(arg).__name__
82 visit_fn = getattr(self, specific_visit, None)
83 if visit_fn:
84 visit_fn(arg)
85 else:
86 self.generic_visit(arg)
88 def visit_arguments(self, node):
89 self.generic_rename(node)
91 def visit_ImportFrom(self, node):
92 if node.module != '__future__':
93 for alias in node.names:
94 if alias.name != '*':
95 alias.asname = self.get_new_name(alias.asname, is_imported=True)
97 def visit_Import(self, node):
98 for alias in node.names:
99 if '.' in alias.name:
100 continue
101 if alias.name != '*':
102 alias.asname = self.get_new_name(alias.asname, is_imported=True)
104 def visit_Global(self, node):
105 self.generic_rename(node)
107 visit_Name = visit_Global
109 def generic_rename(self, target):
110 specific_rename = 'rename_' + type(target).__name__
111 getattr(self, specific_rename)(target)
113 def rename_arguments(self, node):
114 for arg in node.args:
115 self.generic_rename(arg)
116 if node.vararg:
117 node.vararg = self.get_new_name(node.vararg)
118 if node.kwarg:
119 node.kwarg = self.get_new_name(node.kwarg)
121 def rename_Attribute(self, node):
122 if type(node.value) == ast.Name:
123 self.generic_rename(node.value)
124 else:
125 self.generic_visit(node)
127 def rename_Global(self, node):
128 for i, name in enumerate(node.names):
129 node.names[i] = self.get_new_name(name)
131 def rename_Name(self, node):
132 node.id = self.get_new_name(node.id)
134 def rename_arg(self, node):
135 node.arg = self.get_new_name(node.arg)
137 def rename_Subscript(self, node):
138 ast.NodeVisitor.generic_visit(self, node)
140 def rename_Tuple(self, node):
141 for element in node.elts:
142 self.generic_rename(element)
143 rename_List = rename_Tuple