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

105 statements  

1# Copyright (c) 2013 Huan Do, http://huan.do 

2 

3import ast 

4 

5from assignment_manager import AssignmentManager 

6 

7class VariableChanger(ast.NodeVisitor): 

8 

9 def __init__(self, env): 

10 self.env = env 

11 self.assignment_manager = AssignmentManager() 

12 

13 def get_new_name(self, old_name, is_imported=False): 

14 assert isinstance(old_name, str), str(old_name) 

15 

16 new_name = (self.env.current_frame.get_new_name(old_name) or 

17 self.assignment_manager.get_new_name(old_name)) 

18 

19 if new_name is None and self.env.starred: 

20 return old_name 

21 

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 

28 

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) 

38 

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) 

44 

45 visit_SetComp = visit_ListComp = visit_DictComp = visit_Comprehensions 

46 

47 def visit_Assign(self, node): 

48 for target in node.targets: 

49 self.generic_rename(target) 

50 self.visit(node.value) 

51 

52 def visit_Attribute(self, node): 

53 self.generic_rename(node) 

54 

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) 

60 

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) 

67 

68 def visit_Lambda(self, node): 

69 with self.env.Frame(node) as f: 

70 self.generic_visit(node) 

71 

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) 

76 

77 def visit_Call(self, node): 

78 self.generic_rename(node.func) 

79 

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) 

87 

88 def visit_arguments(self, node): 

89 self.generic_rename(node) 

90 

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) 

96 

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) 

103 

104 def visit_Global(self, node): 

105 self.generic_rename(node) 

106 

107 visit_Name = visit_Global 

108 

109 def generic_rename(self, target): 

110 specific_rename = 'rename_' + type(target).__name__ 

111 getattr(self, specific_rename)(target) 

112 

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) 

120 

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) 

126 

127 def rename_Global(self, node): 

128 for i, name in enumerate(node.names): 

129 node.names[i] = self.get_new_name(name) 

130 

131 def rename_Name(self, node): 

132 node.id = self.get_new_name(node.id) 

133 

134 def rename_arg(self, node): 

135 node.arg = self.get_new_name(node.arg) 

136 

137 def rename_Subscript(self, node): 

138 ast.NodeVisitor.generic_visit(self, node) 

139 

140 def rename_Tuple(self, node): 

141 for element in node.elts: 

142 self.generic_rename(element) 

143 rename_List = rename_Tuple