Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(9)

Side by Side Diff: third_party/logilab/astng/rebuilder.py

Issue 719313003: Revert "pylint: upgrade to 1.3.1" (Closed) Base URL: https://chromium.googlesource.com/chromium/tools/depot_tools.git@master
Patch Set: Created 6 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « third_party/logilab/astng/raw_building.py ('k') | third_party/logilab/astng/scoped_nodes.py » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 # copyright 2003-2013 LOGILAB S.A. (Paris, FRANCE), all rights reserved. 1 # copyright 2003-2010 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
2 # contact http://www.logilab.fr/ -- mailto:contact@logilab.fr 2 # contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
3 # copyright 2003-2010 Sylvain Thenault, all rights reserved.
4 # contact mailto:thenault@gmail.com
3 # 5 #
4 # This file is part of astroid. 6 # This file is part of logilab-astng.
5 # 7 #
6 # astroid is free software: you can redistribute it and/or modify it 8 # logilab-astng is free software: you can redistribute it and/or modify it
7 # under the terms of the GNU Lesser General Public License as published by the 9 # under the terms of the GNU Lesser General Public License as published by the
8 # Free Software Foundation, either version 2.1 of the License, or (at your 10 # Free Software Foundation, either version 2.1 of the License, or (at your
9 # option) any later version. 11 # option) any later version.
10 # 12 #
11 # astroid is distributed in the hope that it will be useful, but 13 # logilab-astng is distributed in the hope that it will be useful, but
12 # WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 14 # WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License 15 # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
14 # for more details. 16 # for more details.
15 # 17 #
16 # You should have received a copy of the GNU Lesser General Public License along 18 # You should have received a copy of the GNU Lesser General Public License along
17 # with astroid. If not, see <http://www.gnu.org/licenses/>. 19 # with logilab-astng. If not, see <http://www.gnu.org/licenses/>.
18 """this module contains utilities for rebuilding a _ast tree in 20 """this module contains utilities for rebuilding a _ast tree in
19 order to get a single Astroid representation 21 order to get a single ASTNG representation
20 """ 22 """
21 23
22 import sys 24 import sys
23 from _ast import ( 25 from _ast import (Expr as Discard, Str,
24 Expr as Discard, Str,
25 # binary operators 26 # binary operators
26 Add, Div, FloorDiv, Mod, Mult, Pow, Sub, BitAnd, BitOr, BitXor, 27 Add, Div, FloorDiv, Mod, Mult, Pow, Sub, BitAnd, BitOr, BitXor,
27 LShift, RShift, 28 LShift, RShift,
28 # logical operators 29 # logical operators
29 And, Or, 30 And, Or,
30 # unary operators 31 # unary operators
31 UAdd, USub, Not, Invert, 32 UAdd, USub, Not, Invert,
32 # comparison operators 33 # comparison operators
33 Eq, Gt, GtE, In, Is, IsNot, Lt, LtE, NotEq, NotIn, 34 Eq, Gt, GtE, In, Is, IsNot, Lt, LtE, NotEq, NotIn,
34 ) 35 )
35 36
36 from astroid import nodes as new 37 from logilab.astng.exceptions import ASTNGBuildingException
38 from logilab.astng import nodes as new
37 39
38 40
39 _BIN_OP_CLASSES = {Add: '+', 41 _BIN_OP_CLASSES = {Add: '+',
40 BitAnd: '&', 42 BitAnd: '&',
41 BitOr: '|', 43 BitOr: '|',
42 BitXor: '^', 44 BitXor: '^',
43 Div: '/', 45 Div: '/',
44 FloorDiv: '//', 46 FloorDiv: '//',
45 Mod: '%', 47 Mod: '%',
46 Mult: '*', 48 Mult: '*',
47 Pow: '**', 49 Pow: '**',
48 Sub: '-', 50 Sub: '-',
49 LShift: '<<', 51 LShift: '<<',
50 RShift: '>>', 52 RShift: '>>'}
51 }
52 53
53 _BOOL_OP_CLASSES = {And: 'and', 54 _BOOL_OP_CLASSES = {And: 'and',
54 Or: 'or', 55 Or: 'or'}
55 }
56 56
57 _UNARY_OP_CLASSES = {UAdd: '+', 57 _UNARY_OP_CLASSES = {UAdd: '+',
58 USub: '-', 58 USub: '-',
59 Not: 'not', 59 Not: 'not',
60 Invert: '~', 60 Invert: '~'}
61 }
62 61
63 _CMP_OP_CLASSES = {Eq: '==', 62 _CMP_OP_CLASSES = {Eq: '==',
64 Gt: '>', 63 Gt: '>',
65 GtE: '>=', 64 GtE: '>=',
66 In: 'in', 65 In: 'in',
67 Is: 'is', 66 Is: 'is',
68 IsNot: 'is not', 67 IsNot: 'is not',
69 Lt: '<', 68 Lt: '<',
70 LtE: '<=', 69 LtE: '<=',
71 NotEq: '!=', 70 NotEq: '!=',
72 NotIn: 'not in', 71 NotIn: 'not in'}
73 }
74 72
75 CONST_NAME_TRANSFORMS = {'None': None, 73 CONST_NAME_TRANSFORMS = {'None': None,
76 'True': True, 74 'True': True,
77 'False': False, 75 'False': False}
78 }
79 76
80 REDIRECT = {'arguments': 'Arguments', 77 REDIRECT = {'arguments': 'Arguments',
81 'Attribute': 'Getattr', 78 'Attribute': 'Getattr',
82 'comprehension': 'Comprehension', 79 'comprehension': 'Comprehension',
83 'Call': 'CallFunc', 80 'Call': 'CallFunc',
84 'ClassDef': 'Class', 81 'ClassDef': 'Class',
85 "ListCompFor": 'Comprehension', 82 "ListCompFor": 'Comprehension',
86 "GenExprFor": 'Comprehension', 83 "GenExprFor": 'Comprehension',
87 'excepthandler': 'ExceptHandler', 84 'excepthandler': 'ExceptHandler',
88 'Expr': 'Discard', 85 'Expr': 'Discard',
89 'FunctionDef': 'Function', 86 'FunctionDef': 'Function',
90 'GeneratorExp': 'GenExpr', 87 'GeneratorExp': 'GenExpr',
91 'ImportFrom': 'From', 88 'ImportFrom': 'From',
92 'keyword': 'Keyword', 89 'keyword': 'Keyword',
93 'Repr': 'Backquote', 90 'Repr': 'Backquote',
94 } 91 }
95 PY3K = sys.version_info >= (3, 0)
96 PY34 = sys.version_info >= (3, 4)
97 92
98 def _init_set_doc(node, newnode): 93 def _init_set_doc(node, newnode):
99 newnode.doc = None 94 newnode.doc = None
100 try: 95 try:
101 if isinstance(node.body[0], Discard) and isinstance(node.body[0].value, Str): 96 if isinstance(node.body[0], Discard) and isinstance(node.body[0].value, Str):
102 newnode.tolineno = node.body[0].lineno 97 newnode.tolineno = node.body[0].lineno
103 newnode.doc = node.body[0].value.s 98 newnode.doc = node.body[0].value.s
104 node.body = node.body[1:] 99 node.body = node.body[1:]
105 100
106 except IndexError: 101 except IndexError:
107 pass # ast built from scratch 102 pass # ast built from scratch
108 103
109 def _lineno_parent(oldnode, newnode, parent): 104 def _lineno_parent(oldnode, newnode, parent):
110 newnode.parent = parent 105 newnode.parent = parent
111 if hasattr(oldnode, 'lineno'): 106 if hasattr(oldnode, 'lineno'):
112 newnode.lineno = oldnode.lineno 107 newnode.lineno = oldnode.lineno
113 if hasattr(oldnode, 'col_offset'): 108 if hasattr(oldnode, 'col_offset'):
114 newnode.col_offset = oldnode.col_offset 109 newnode.col_offset = oldnode.col_offset
115 110
116 def _set_infos(oldnode, newnode, parent): 111 def _set_infos(oldnode, newnode, parent):
117 newnode.parent = parent 112 newnode.parent = parent
118 if hasattr(oldnode, 'lineno'): 113 if hasattr(oldnode, 'lineno'):
119 newnode.lineno = oldnode.lineno 114 newnode.lineno = oldnode.lineno
120 if hasattr(oldnode, 'col_offset'): 115 if hasattr(oldnode, 'col_offset'):
121 newnode.col_offset = oldnode.col_offset 116 newnode.col_offset = oldnode.col_offset
122 newnode.set_line_info(newnode.last_child()) # set_line_info accepts None 117 newnode.set_line_info(newnode.last_child()) # set_line_info accepts None
123 118
124 def _create_yield_node(node, parent, rebuilder, factory): 119
125 newnode = factory()
126 _lineno_parent(node, newnode, parent)
127 if node.value is not None:
128 newnode.value = rebuilder.visit(node.value, newnode)
129 newnode.set_line_info(newnode.last_child())
130 return newnode
131 120
132 121
133 class TreeRebuilder(object): 122 class TreeRebuilder(object):
134 """Rebuilds the _ast tree to become an Astroid tree""" 123 """Rebuilds the _ast tree to become an ASTNG tree"""
135 124
136 def __init__(self, manager): 125 _visit_meths = {}
137 self._manager = manager 126 def __init__(self):
127 self.init()
128
129 def init(self):
138 self.asscontext = None 130 self.asscontext = None
131 self._metaclass = ['']
139 self._global_names = [] 132 self._global_names = []
140 self._from_nodes = [] 133 self._from_nodes = []
141 self._delayed_assattr = [] 134 self._delayed_assattr = []
142 self._visit_meths = {}
143 self._transform = manager.transform
144
145 def visit_module(self, node, modname, package):
146 """visit a Module node by returning a fresh instance of it"""
147 newnode = new.Module(modname, None)
148 newnode.package = package
149 _lineno_parent(node, newnode, parent=None)
150 _init_set_doc(node, newnode)
151 newnode.body = [self.visit(child, newnode) for child in node.body]
152 newnode.set_line_info(newnode.last_child())
153 return self._transform(newnode)
154 135
155 def visit(self, node, parent): 136 def visit(self, node, parent):
156 cls = node.__class__ 137 cls = node.__class__
157 if cls in self._visit_meths: 138 if cls in self._visit_meths:
158 visit_method = self._visit_meths[cls] 139 return self._visit_meths[cls](node, parent)
159 else: 140 else:
160 cls_name = cls.__name__ 141 cls_name = cls.__name__
161 visit_name = 'visit_' + REDIRECT.get(cls_name, cls_name).lower() 142 visit_name = 'visit_' + REDIRECT.get(cls_name, cls_name).lower()
162 visit_method = getattr(self, visit_name) 143 visit_method = getattr(self, visit_name)
163 self._visit_meths[cls] = visit_method 144 self._visit_meths[cls] = visit_method
164 return self._transform(visit_method(node, parent)) 145 return visit_method(node, parent)
165 146
166 def _save_assignment(self, node, name=None): 147 def _save_assignment(self, node, name=None):
167 """save assignement situation since node.parent is not available yet""" 148 """save assignement situation since node.parent is not available yet"""
168 if self._global_names and node.name in self._global_names[-1]: 149 if self._global_names and node.name in self._global_names[-1]:
169 node.root().set_local(node.name, node) 150 node.root().set_local(node.name, node)
170 else: 151 else:
171 node.parent.set_local(node.name, node) 152 node.parent.set_local(node.name, node)
172 153
173 154
174 def visit_arguments(self, node, parent): 155 def visit_arguments(self, node, parent):
175 """visit a Arguments node by returning a fresh instance of it""" 156 """visit a Arguments node by returning a fresh instance of it"""
176 newnode = new.Arguments() 157 newnode = new.Arguments()
177 _lineno_parent(node, newnode, parent) 158 _lineno_parent(node, newnode, parent)
178 self.asscontext = "Ass" 159 self.asscontext = "Ass"
179 newnode.args = [self.visit(child, newnode) for child in node.args] 160 newnode.args = [self.visit(child, newnode) for child in node.args]
180 self.asscontext = None 161 self.asscontext = None
181 newnode.defaults = [self.visit(child, newnode) for child in node.default s] 162 newnode.defaults = [self.visit(child, newnode) for child in node.default s]
182 newnode.kwonlyargs = [] 163 newnode.vararg = node.vararg
183 newnode.kw_defaults = [] 164 newnode.kwarg = node.kwarg
184 vararg, kwarg = node.vararg, node.kwarg
185 # change added in 82732 (7c5c678e4164), vararg and kwarg
186 # are instances of `_ast.arg`, not strings
187 if vararg:
188 if PY34:
189 if vararg.annotation:
190 newnode.varargannotation = self.visit(vararg.annotation,
191 newnode)
192 vararg = vararg.arg
193 elif PY3K and node.varargannotation:
194 newnode.varargannotation = self.visit(node.varargannotation,
195 newnode)
196 if kwarg:
197 if PY34:
198 if kwarg.annotation:
199 newnode.kwargannotation = self.visit(kwarg.annotation,
200 newnode)
201 kwarg = kwarg.arg
202 elif PY3K:
203 if node.kwargannotation:
204 newnode.kwargannotation = self.visit(node.kwargannotation,
205 newnode)
206 newnode.vararg = vararg
207 newnode.kwarg = kwarg
208 # save argument names in locals: 165 # save argument names in locals:
209 if vararg: 166 if node.vararg:
210 newnode.parent.set_local(vararg, newnode) 167 newnode.parent.set_local(newnode.vararg, newnode)
211 if kwarg: 168 if node.kwarg:
212 newnode.parent.set_local(kwarg, newnode) 169 newnode.parent.set_local(newnode.kwarg, newnode)
213 newnode.set_line_info(newnode.last_child()) 170 newnode.set_line_info(newnode.last_child())
214 return newnode 171 return newnode
215 172
216 def visit_assattr(self, node, parent): 173 def visit_assattr(self, node, parent):
217 """visit a AssAttr node by returning a fresh instance of it""" 174 """visit a AssAttr node by returning a fresh instance of it"""
218 assc, self.asscontext = self.asscontext, None 175 assc, self.asscontext = self.asscontext, None
219 newnode = new.AssAttr() 176 newnode = new.AssAttr()
220 _lineno_parent(node, newnode, parent) 177 _lineno_parent(node, newnode, parent)
221 newnode.expr = self.visit(node.expr, newnode) 178 newnode.expr = self.visit(node.expr, newnode)
222 self.asscontext = assc 179 self.asscontext = assc
(...skipping 15 matching lines...) Expand all
238 """visit a Assign node by returning a fresh instance of it""" 195 """visit a Assign node by returning a fresh instance of it"""
239 newnode = new.Assign() 196 newnode = new.Assign()
240 _lineno_parent(node, newnode, parent) 197 _lineno_parent(node, newnode, parent)
241 self.asscontext = "Ass" 198 self.asscontext = "Ass"
242 newnode.targets = [self.visit(child, newnode) for child in node.targets] 199 newnode.targets = [self.visit(child, newnode) for child in node.targets]
243 self.asscontext = None 200 self.asscontext = None
244 newnode.value = self.visit(node.value, newnode) 201 newnode.value = self.visit(node.value, newnode)
245 # set some function or metaclass infos XXX explain ? 202 # set some function or metaclass infos XXX explain ?
246 klass = newnode.parent.frame() 203 klass = newnode.parent.frame()
247 if (isinstance(klass, new.Class) 204 if (isinstance(klass, new.Class)
248 and isinstance(newnode.value, new.CallFunc) 205 and isinstance(newnode.value, new.CallFunc)
249 and isinstance(newnode.value.func, new.Name)): 206 and isinstance(newnode.value.func, new.Name)):
250 func_name = newnode.value.func.name 207 func_name = newnode.value.func.name
251 for ass_node in newnode.targets: 208 for ass_node in newnode.targets:
252 try: 209 try:
253 meth = klass[ass_node.name] 210 meth = klass[ass_node.name]
254 if isinstance(meth, new.Function): 211 if isinstance(meth, new.Function):
255 if func_name in ('classmethod', 'staticmethod'): 212 if func_name in ('classmethod', 'staticmethod'):
256 meth.type = func_name 213 meth.type = func_name
257 elif func_name == 'classproperty': # see lgc.decorators 214 elif func_name == 'classproperty': # see lgc.decorators
258 meth.type = 'classmethod' 215 meth.type = 'classmethod'
259 meth.extra_decorators.append(newnode.value) 216 meth.extra_decorators.append(newnode.value)
260 except (AttributeError, KeyError): 217 except (AttributeError, KeyError):
261 continue 218 continue
219 elif getattr(newnode.targets[0], 'name', None) == '__metaclass__':
220 # XXX check more...
221 self._metaclass[-1] = 'type' # XXX get the actual metaclass
262 newnode.set_line_info(newnode.last_child()) 222 newnode.set_line_info(newnode.last_child())
263 return newnode 223 return newnode
264 224
265 def visit_assname(self, node, parent, node_name=None): 225 def visit_assname(self, node, parent, node_name=None):
266 '''visit a node and return a AssName node''' 226 '''visit a node and return a AssName node'''
267 newnode = new.AssName() 227 newnode = new.AssName()
268 _set_infos(node, newnode, parent) 228 _set_infos(node, newnode, parent)
269 newnode.name = node_name 229 newnode.name = node_name
270 self._save_assignment(newnode) 230 self._save_assignment(newnode)
271 return newnode 231 return newnode
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
323 newnode.args = [self.visit(child, newnode) for child in node.args] 283 newnode.args = [self.visit(child, newnode) for child in node.args]
324 if node.starargs is not None: 284 if node.starargs is not None:
325 newnode.starargs = self.visit(node.starargs, newnode) 285 newnode.starargs = self.visit(node.starargs, newnode)
326 if node.kwargs is not None: 286 if node.kwargs is not None:
327 newnode.kwargs = self.visit(node.kwargs, newnode) 287 newnode.kwargs = self.visit(node.kwargs, newnode)
328 newnode.args.extend(self.visit(child, newnode) for child in node.keyword s) 288 newnode.args.extend(self.visit(child, newnode) for child in node.keyword s)
329 newnode.set_line_info(newnode.last_child()) 289 newnode.set_line_info(newnode.last_child())
330 return newnode 290 return newnode
331 291
332 def visit_class(self, node, parent): 292 def visit_class(self, node, parent):
333 """visit a Class node to become astroid""" 293 """visit a Class node to become astng"""
294 self._metaclass.append(self._metaclass[-1])
334 newnode = new.Class(node.name, None) 295 newnode = new.Class(node.name, None)
335 _lineno_parent(node, newnode, parent) 296 _lineno_parent(node, newnode, parent)
336 _init_set_doc(node, newnode) 297 _init_set_doc(node, newnode)
337 newnode.bases = [self.visit(child, newnode) for child in node.bases] 298 newnode.bases = [self.visit(child, newnode) for child in node.bases]
338 newnode.body = [self.visit(child, newnode) for child in node.body] 299 newnode.body = [self.visit(child, newnode) for child in node.body]
339 if 'decorator_list' in node._fields and node.decorator_list:# py >= 2.6 300 if 'decorator_list' in node._fields and node.decorator_list:# py >= 2.6
340 newnode.decorators = self.visit_decorators(node, newnode) 301 newnode.decorators = self.visit_decorators(node, newnode)
341 newnode.set_line_info(newnode.last_child()) 302 newnode.set_line_info(newnode.last_child())
303 metaclass = self._metaclass.pop()
304 if not newnode.bases:
305 # no base classes, detect new / style old style according to
306 # current scope
307 newnode._newstyle = metaclass == 'type'
342 newnode.parent.frame().set_local(newnode.name, newnode) 308 newnode.parent.frame().set_local(newnode.name, newnode)
343 return newnode 309 return newnode
344 310
345 def visit_const(self, node, parent): 311 def visit_const(self, node, parent):
346 """visit a Const node by returning a fresh instance of it""" 312 """visit a Const node by returning a fresh instance of it"""
347 newnode = new.Const(node.value) 313 newnode = new.Const(node.value)
348 _set_infos(node, newnode, parent) 314 _set_infos(node, newnode, parent)
349 return newnode 315 return newnode
350 316
351 def visit_continue(self, node, parent): 317 def visit_continue(self, node, parent):
352 """visit a Continue node by returning a fresh instance of it""" 318 """visit a Continue node by returning a fresh instance of it"""
353 newnode = new.Continue() 319 newnode = new.Continue()
354 _set_infos(node, newnode, parent) 320 _set_infos(node, newnode, parent)
355 return newnode 321 return newnode
356 322
357 def visit_compare(self, node, parent): 323 def visit_compare(self, node, parent):
358 """visit a Compare node by returning a fresh instance of it""" 324 """visit a Compare node by returning a fresh instance of it"""
359 newnode = new.Compare() 325 newnode = new.Compare()
360 _lineno_parent(node, newnode, parent) 326 _lineno_parent(node, newnode, parent)
361 newnode.left = self.visit(node.left, newnode) 327 newnode.left = self.visit(node.left, newnode)
362 newnode.ops = [(_CMP_OP_CLASSES[op.__class__], self.visit(expr, newnode) ) 328 newnode.ops = [(_CMP_OP_CLASSES[op.__class__], self.visit(expr, newnode) )
363 for (op, expr) in zip(node.ops, node.comparators)] 329 for (op, expr) in zip(node.ops, node.comparators)]
364 newnode.set_line_info(newnode.last_child()) 330 newnode.set_line_info(newnode.last_child())
365 return newnode 331 return newnode
366 332
367 def visit_comprehension(self, node, parent): 333 def visit_comprehension(self, node, parent):
368 """visit a Comprehension node by returning a fresh instance of it""" 334 """visit a Comprehension node by returning a fresh instance of it"""
369 newnode = new.Comprehension() 335 newnode = new.Comprehension()
370 _lineno_parent(node, newnode, parent) 336 _lineno_parent(node, newnode, parent)
371 self.asscontext = "Ass" 337 self.asscontext = "Ass"
372 newnode.target = self.visit(node.target, newnode) 338 newnode.target = self.visit(node.target, newnode)
373 self.asscontext = None 339 self.asscontext = None
374 newnode.iter = self.visit(node.iter, newnode) 340 newnode.iter = self.visit(node.iter, newnode)
375 newnode.ifs = [self.visit(child, newnode) for child in node.ifs] 341 newnode.ifs = [self.visit(child, newnode) for child in node.ifs]
376 newnode.set_line_info(newnode.last_child()) 342 newnode.set_line_info(newnode.last_child())
377 return newnode 343 return newnode
378 344
379 def visit_decorators(self, node, parent): 345 def visit_decorators(self, node, parent):
380 """visit a Decorators node by returning a fresh instance of it""" 346 """visit a Decorators node by returning a fresh instance of it"""
381 # /!\ node is actually a _ast.Function node while 347 # /!\ node is actually a _ast.Function node while
382 # parent is a astroid.nodes.Function node 348 # parent is a astng.nodes.Function node
383 newnode = new.Decorators() 349 newnode = new.Decorators()
384 _lineno_parent(node, newnode, parent) 350 _lineno_parent(node, newnode, parent)
385 if 'decorators' in node._fields: # py < 2.6, i.e. 2.5 351 if 'decorators' in node._fields: # py < 2.6, i.e. 2.5
386 decorators = node.decorators 352 decorators = node.decorators
387 else: 353 else:
388 decorators = node.decorator_list 354 decorators= node.decorator_list
389 newnode.nodes = [self.visit(child, newnode) for child in decorators] 355 newnode.nodes = [self.visit(child, newnode) for child in decorators]
390 newnode.set_line_info(newnode.last_child()) 356 newnode.set_line_info(newnode.last_child())
391 return newnode 357 return newnode
392 358
393 def visit_delete(self, node, parent): 359 def visit_delete(self, node, parent):
394 """visit a Delete node by returning a fresh instance of it""" 360 """visit a Delete node by returning a fresh instance of it"""
395 newnode = new.Delete() 361 newnode = new.Delete()
396 _lineno_parent(node, newnode, parent) 362 _lineno_parent(node, newnode, parent)
397 self.asscontext = "Del" 363 self.asscontext = "Del"
398 newnode.targets = [self.visit(child, newnode) for child in node.targets] 364 newnode.targets = [self.visit(child, newnode) for child in node.targets]
399 self.asscontext = None 365 self.asscontext = None
400 newnode.set_line_info(newnode.last_child()) 366 newnode.set_line_info(newnode.last_child())
401 return newnode 367 return newnode
402 368
403 def visit_dict(self, node, parent): 369 def visit_dict(self, node, parent):
404 """visit a Dict node by returning a fresh instance of it""" 370 """visit a Dict node by returning a fresh instance of it"""
405 newnode = new.Dict() 371 newnode = new.Dict()
406 _lineno_parent(node, newnode, parent) 372 _lineno_parent(node, newnode, parent)
407 newnode.items = [(self.visit(key, newnode), self.visit(value, newnode)) 373 newnode.items = [(self.visit(key, newnode), self.visit(value, newnode))
408 for key, value in zip(node.keys, node.values)] 374 for key, value in zip(node.keys, node.values)]
409 newnode.set_line_info(newnode.last_child()) 375 newnode.set_line_info(newnode.last_child())
410 return newnode 376 return newnode
411 377
412 def visit_dictcomp(self, node, parent): 378 def visit_dictcomp(self, node, parent):
413 """visit a DictComp node by returning a fresh instance of it""" 379 """visit a DictComp node by returning a fresh instance of it"""
414 newnode = new.DictComp() 380 newnode = new.DictComp()
415 _lineno_parent(node, newnode, parent) 381 _lineno_parent(node, newnode, parent)
416 newnode.key = self.visit(node.key, newnode) 382 newnode.key = self.visit(node.key, newnode)
417 newnode.value = self.visit(node.value, newnode) 383 newnode.value = self.visit(node.value, newnode)
418 newnode.generators = [self.visit(child, newnode) 384 newnode.generators = [self.visit(child, newnode)
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
484 self.asscontext = None 450 self.asscontext = None
485 newnode.iter = self.visit(node.iter, newnode) 451 newnode.iter = self.visit(node.iter, newnode)
486 newnode.body = [self.visit(child, newnode) for child in node.body] 452 newnode.body = [self.visit(child, newnode) for child in node.body]
487 newnode.orelse = [self.visit(child, newnode) for child in node.orelse] 453 newnode.orelse = [self.visit(child, newnode) for child in node.orelse]
488 newnode.set_line_info(newnode.last_child()) 454 newnode.set_line_info(newnode.last_child())
489 return newnode 455 return newnode
490 456
491 def visit_from(self, node, parent): 457 def visit_from(self, node, parent):
492 """visit a From node by returning a fresh instance of it""" 458 """visit a From node by returning a fresh instance of it"""
493 names = [(alias.name, alias.asname) for alias in node.names] 459 names = [(alias.name, alias.asname) for alias in node.names]
494 newnode = new.From(node.module or '', names, node.level or None) 460 newnode = new.From(node.module or '', names, node.level)
495 _set_infos(node, newnode, parent) 461 _set_infos(node, newnode, parent)
496 # store From names to add them to locals after building 462 # store From names to add them to locals after building
497 self._from_nodes.append(newnode) 463 self._from_nodes.append(newnode)
498 return newnode 464 return newnode
499 465
500 def visit_function(self, node, parent): 466 def visit_function(self, node, parent):
501 """visit an Function node to become astroid""" 467 """visit an Function node to become astng"""
502 self._global_names.append({}) 468 self._global_names.append({})
503 newnode = new.Function(node.name, None) 469 newnode = new.Function(node.name, None)
504 _lineno_parent(node, newnode, parent) 470 _lineno_parent(node, newnode, parent)
505 _init_set_doc(node, newnode) 471 _init_set_doc(node, newnode)
506 newnode.args = self.visit(node.args, newnode) 472 newnode.args = self.visit(node.args, newnode)
507 newnode.body = [self.visit(child, newnode) for child in node.body] 473 newnode.body = [self.visit(child, newnode) for child in node.body]
508 if 'decorators' in node._fields: # py < 2.6 474 if 'decorators' in node._fields: # py < 2.6
509 attr = 'decorators' 475 attr = 'decorators'
510 else: 476 else:
511 attr = 'decorator_list' 477 attr = 'decorator_list'
512 decorators = getattr(node, attr) 478 decorators = getattr(node, attr)
513 if decorators: 479 if decorators:
514 newnode.decorators = self.visit_decorators(node, newnode) 480 newnode.decorators = self.visit_decorators(node, newnode)
515 if PY3K and node.returns:
516 newnode.returns = self.visit(node.returns, newnode)
517 newnode.set_line_info(newnode.last_child()) 481 newnode.set_line_info(newnode.last_child())
518 self._global_names.pop() 482 self._global_names.pop()
519 frame = newnode.parent.frame() 483 frame = newnode.parent.frame()
520 if isinstance(frame, new.Class): 484 if isinstance(frame, new.Class):
521 if newnode.name == '__new__': 485 if newnode.name == '__new__':
522 newnode._type = 'classmethod' 486 newnode.type = 'classmethod'
523 else: 487 else:
524 newnode._type = 'method' 488 newnode.type = 'method'
525 if newnode.decorators is not None: 489 if newnode.decorators is not None:
526 for decorator_expr in newnode.decorators.nodes: 490 for decorator_expr in newnode.decorators.nodes:
527 if isinstance(decorator_expr, new.Name): 491 if isinstance(decorator_expr, new.Name):
528 if decorator_expr.name in ('classmethod', 'staticmethod'): 492 if decorator_expr.name in ('classmethod', 'staticmethod'):
529 newnode._type = decorator_expr.name 493 newnode.type = decorator_expr.name
530 elif decorator_expr.name == 'classproperty': 494 elif decorator_expr.name == 'classproperty':
531 newnode._type = 'classmethod' 495 newnode.type = 'classmethod'
532 frame.set_local(newnode.name, newnode) 496 frame.set_local(newnode.name, newnode)
533 return newnode 497 return newnode
534 498
535 def visit_genexpr(self, node, parent): 499 def visit_genexpr(self, node, parent):
536 """visit a GenExpr node by returning a fresh instance of it""" 500 """visit a GenExpr node by returning a fresh instance of it"""
537 newnode = new.GenExpr() 501 newnode = new.GenExpr()
538 _lineno_parent(node, newnode, parent) 502 _lineno_parent(node, newnode, parent)
539 newnode.elt = self.visit(node.elt, newnode) 503 newnode.elt = self.visit(node.elt, newnode)
540 newnode.generators = [self.visit(child, newnode) for child in node.gener ators] 504 newnode.generators = [self.visit(child, newnode) for child in node.gener ators]
541 newnode.set_line_info(newnode.last_child()) 505 newnode.set_line_info(newnode.last_child())
(...skipping 13 matching lines...) Expand all
555 newnode = new.Getattr() 519 newnode = new.Getattr()
556 _lineno_parent(node, newnode, parent) 520 _lineno_parent(node, newnode, parent)
557 asscontext, self.asscontext = self.asscontext, None 521 asscontext, self.asscontext = self.asscontext, None
558 newnode.expr = self.visit(node.value, newnode) 522 newnode.expr = self.visit(node.value, newnode)
559 self.asscontext = asscontext 523 self.asscontext = asscontext
560 newnode.attrname = node.attr 524 newnode.attrname = node.attr
561 newnode.set_line_info(newnode.last_child()) 525 newnode.set_line_info(newnode.last_child())
562 return newnode 526 return newnode
563 527
564 def visit_global(self, node, parent): 528 def visit_global(self, node, parent):
565 """visit an Global node to become astroid""" 529 """visit an Global node to become astng"""
566 newnode = new.Global(node.names) 530 newnode = new.Global(node.names)
567 _set_infos(node, newnode, parent) 531 _set_infos(node, newnode, parent)
568 if self._global_names: # global at the module level, no effect 532 if self._global_names: # global at the module level, no effect
569 for name in node.names: 533 for name in node.names:
570 self._global_names[-1].setdefault(name, []).append(newnode) 534 self._global_names[-1].setdefault(name, []).append(newnode)
571 return newnode 535 return newnode
572 536
573 def visit_if(self, node, parent): 537 def visit_if(self, node, parent):
574 """visit a If node by returning a fresh instance of it""" 538 """visit a If node by returning a fresh instance of it"""
575 newnode = new.If() 539 newnode = new.If()
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
638 def visit_listcomp(self, node, parent): 602 def visit_listcomp(self, node, parent):
639 """visit a ListComp node by returning a fresh instance of it""" 603 """visit a ListComp node by returning a fresh instance of it"""
640 newnode = new.ListComp() 604 newnode = new.ListComp()
641 _lineno_parent(node, newnode, parent) 605 _lineno_parent(node, newnode, parent)
642 newnode.elt = self.visit(node.elt, newnode) 606 newnode.elt = self.visit(node.elt, newnode)
643 newnode.generators = [self.visit(child, newnode) 607 newnode.generators = [self.visit(child, newnode)
644 for child in node.generators] 608 for child in node.generators]
645 newnode.set_line_info(newnode.last_child()) 609 newnode.set_line_info(newnode.last_child())
646 return newnode 610 return newnode
647 611
612 def visit_module(self, node, modname, package):
613 """visit a Module node by returning a fresh instance of it"""
614 newnode = new.Module(modname, None)
615 newnode.package = package
616 _lineno_parent(node, newnode, parent=None)
617 _init_set_doc(node, newnode)
618 newnode.body = [self.visit(child, newnode) for child in node.body]
619 newnode.set_line_info(newnode.last_child())
620 return newnode
621
648 def visit_name(self, node, parent): 622 def visit_name(self, node, parent):
649 """visit a Name node by returning a fresh instance of it""" 623 """visit a Name node by returning a fresh instance of it"""
650 # True and False can be assigned to something in py2x, so we have to 624 # True and False can be assigned to something in py2x, so we have to
651 # check first the asscontext 625 # check first the asscontext
652 if self.asscontext == "Del": 626 if self.asscontext == "Del":
653 newnode = new.DelName() 627 newnode = new.DelName()
654 elif self.asscontext is not None: # Ass 628 elif self.asscontext is not None: # Ass
655 assert self.asscontext == "Ass" 629 assert self.asscontext == "Ass"
656 newnode = new.AssName() 630 newnode = new.AssName()
657 elif node.id in CONST_NAME_TRANSFORMS: 631 elif node.id in CONST_NAME_TRANSFORMS:
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
719 def visit_return(self, node, parent): 693 def visit_return(self, node, parent):
720 """visit a Return node by returning a fresh instance of it""" 694 """visit a Return node by returning a fresh instance of it"""
721 newnode = new.Return() 695 newnode = new.Return()
722 _lineno_parent(node, newnode, parent) 696 _lineno_parent(node, newnode, parent)
723 if node.value is not None: 697 if node.value is not None:
724 newnode.value = self.visit(node.value, newnode) 698 newnode.value = self.visit(node.value, newnode)
725 newnode.set_line_info(newnode.last_child()) 699 newnode.set_line_info(newnode.last_child())
726 return newnode 700 return newnode
727 701
728 def visit_set(self, node, parent): 702 def visit_set(self, node, parent):
729 """visit a Set node by returning a fresh instance of it""" 703 """visit a Tuple node by returning a fresh instance of it"""
730 newnode = new.Set() 704 newnode = new.Set()
731 _lineno_parent(node, newnode, parent) 705 _lineno_parent(node, newnode, parent)
732 newnode.elts = [self.visit(child, newnode) for child in node.elts] 706 newnode.elts = [self.visit(child, newnode) for child in node.elts]
733 newnode.set_line_info(newnode.last_child()) 707 newnode.set_line_info(newnode.last_child())
734 return newnode 708 return newnode
735 709
736 def visit_setcomp(self, node, parent): 710 def visit_setcomp(self, node, parent):
737 """visit a SetComp node by returning a fresh instance of it""" 711 """visit a SetComp node by returning a fresh instance of it"""
738 newnode = new.SetComp() 712 newnode = new.SetComp()
739 _lineno_parent(node, newnode, parent) 713 _lineno_parent(node, newnode, parent)
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
807 """visit a While node by returning a fresh instance of it""" 781 """visit a While node by returning a fresh instance of it"""
808 newnode = new.While() 782 newnode = new.While()
809 _lineno_parent(node, newnode, parent) 783 _lineno_parent(node, newnode, parent)
810 newnode.test = self.visit(node.test, newnode) 784 newnode.test = self.visit(node.test, newnode)
811 newnode.body = [self.visit(child, newnode) for child in node.body] 785 newnode.body = [self.visit(child, newnode) for child in node.body]
812 newnode.orelse = [self.visit(child, newnode) for child in node.orelse] 786 newnode.orelse = [self.visit(child, newnode) for child in node.orelse]
813 newnode.set_line_info(newnode.last_child()) 787 newnode.set_line_info(newnode.last_child())
814 return newnode 788 return newnode
815 789
816 def visit_with(self, node, parent): 790 def visit_with(self, node, parent):
791 """visit a With node by returning a fresh instance of it"""
817 newnode = new.With() 792 newnode = new.With()
818 _lineno_parent(node, newnode, parent) 793 _lineno_parent(node, newnode, parent)
819 expr = self.visit(node.context_expr, newnode) 794 newnode.expr = self.visit(node.context_expr, newnode)
820 self.asscontext = "Ass" 795 self.asscontext = "Ass"
821 if node.optional_vars is not None: 796 if node.optional_vars is not None:
822 vars = self.visit(node.optional_vars, newnode) 797 newnode.vars = self.visit(node.optional_vars, newnode)
823 else:
824 vars = None
825 self.asscontext = None 798 self.asscontext = None
826 newnode.items = [(expr, vars)]
827 newnode.body = [self.visit(child, newnode) for child in node.body] 799 newnode.body = [self.visit(child, newnode) for child in node.body]
828 newnode.set_line_info(newnode.last_child()) 800 newnode.set_line_info(newnode.last_child())
829 return newnode 801 return newnode
830 802
831 def visit_yield(self, node, parent): 803 def visit_yield(self, node, parent):
832 """visit a Yield node by returning a fresh instance of it""" 804 """visit a Yield node by returning a fresh instance of it"""
833 return _create_yield_node(node, parent, self, new.Yield) 805 newnode = new.Yield()
806 _lineno_parent(node, newnode, parent)
807 if node.value is not None:
808 newnode.value = self.visit(node.value, newnode)
809 newnode.set_line_info(newnode.last_child())
810 return newnode
811
834 812
835 class TreeRebuilder3k(TreeRebuilder): 813 class TreeRebuilder3k(TreeRebuilder):
836 """extend and overwrite TreeRebuilder for python3k""" 814 """extend and overwrite TreeRebuilder for python3k"""
837 815
838 def visit_arg(self, node, parent): 816 def visit_arg(self, node, parent):
839 """visit a arg node by returning a fresh AssName instance""" 817 """visit a arg node by returning a fresh AssName instance"""
840 # the <arg> node is coming from py>=3.0, but we use AssName in py2.x 818 # the <arg> node is coming from py>=3.0, but we use AssName in py2.x
841 # XXX or we should instead introduce a Arg node in astroid ? 819 # XXX or we should instead introduce a Arg node in astng ?
842 return self.visit_assname(node, parent, node.arg) 820 return self.visit_assname(node, parent, node.arg)
843 821
844 def visit_nameconstant(self, node, parent):
845 # in Python 3.4 we have NameConstant for True / False / None
846 newnode = new.Const(node.value)
847 _set_infos(node, newnode, parent)
848 return newnode
849
850 def visit_arguments(self, node, parent):
851 newnode = super(TreeRebuilder3k, self).visit_arguments(node, parent)
852 self.asscontext = "Ass"
853 newnode.kwonlyargs = [self.visit(child, newnode) for child in node.kwonl yargs]
854 self.asscontext = None
855 newnode.kw_defaults = [self.visit(child, newnode) if child else None for child in node.kw_defaults]
856 newnode.annotations = [
857 self.visit(arg.annotation, newnode) if arg.annotation else None
858 for arg in node.args]
859 return newnode
860
861 def visit_excepthandler(self, node, parent): 822 def visit_excepthandler(self, node, parent):
862 """visit an ExceptHandler node by returning a fresh instance of it""" 823 """visit an ExceptHandler node by returning a fresh instance of it"""
863 newnode = new.ExceptHandler() 824 newnode = new.ExceptHandler()
864 _lineno_parent(node, newnode, parent) 825 _lineno_parent(node, newnode, parent)
865 if node.type is not None: 826 if node.type is not None:
866 newnode.type = self.visit(node.type, newnode) 827 newnode.type = self.visit(node.type, newnode)
867 if node.name is not None: 828 if node.name is not None:
868 newnode.name = self.visit_assname(node, newnode, node.name) 829 newnode.name = self.visit_assname(node, newnode, node.name)
869 newnode.body = [self.visit(child, newnode) for child in node.body] 830 newnode.body = [self.visit(child, newnode) for child in node.body]
870 newnode.set_line_info(newnode.last_child()) 831 newnode.set_line_info(newnode.last_child())
(...skipping 18 matching lines...) Expand all
889 return newnode 850 return newnode
890 851
891 def visit_starred(self, node, parent): 852 def visit_starred(self, node, parent):
892 """visit a Starred node and return a new instance of it""" 853 """visit a Starred node and return a new instance of it"""
893 newnode = new.Starred() 854 newnode = new.Starred()
894 _lineno_parent(node, newnode, parent) 855 _lineno_parent(node, newnode, parent)
895 newnode.value = self.visit(node.value, newnode) 856 newnode.value = self.visit(node.value, newnode)
896 newnode.set_line_info(newnode.last_child()) 857 newnode.set_line_info(newnode.last_child())
897 return newnode 858 return newnode
898 859
899 def visit_try(self, node, parent):
900 # python 3.3 introduce a new Try node replacing TryFinally/TryExcept nod es
901 if node.finalbody:
902 newnode = new.TryFinally()
903 _lineno_parent(node, newnode, parent)
904 newnode.finalbody = [self.visit(n, newnode) for n in node.finalbody]
905 if node.handlers:
906 excnode = new.TryExcept()
907 _lineno_parent(node, excnode, newnode)
908 excnode.body = [self.visit(child, excnode) for child in node.bod y]
909 excnode.handlers = [self.visit(child, excnode) for child in node .handlers]
910 excnode.orelse = [self.visit(child, excnode) for child in node.o relse]
911 excnode.set_line_info(excnode.last_child())
912 newnode.body = [excnode]
913 else:
914 newnode.body = [self.visit(child, newnode) for child in node.bod y]
915 elif node.handlers:
916 newnode = new.TryExcept()
917 _lineno_parent(node, newnode, parent)
918 newnode.body = [self.visit(child, newnode) for child in node.body]
919 newnode.handlers = [self.visit(child, newnode) for child in node.han dlers]
920 newnode.orelse = [self.visit(child, newnode) for child in node.orels e]
921 newnode.set_line_info(newnode.last_child())
922 return newnode
923
924 def visit_with(self, node, parent):
925 if 'items' not in node._fields:
926 # python < 3.3
927 return super(TreeRebuilder3k, self).visit_with(node, parent)
928
929 newnode = new.With()
930 _lineno_parent(node, newnode, parent)
931 def visit_child(child):
932 expr = self.visit(child.context_expr, newnode)
933 self.asscontext = 'Ass'
934 if child.optional_vars:
935 var = self.visit(child.optional_vars, newnode)
936 else:
937 var = None
938 self.asscontext = None
939 return expr, var
940 newnode.items = [visit_child(child)
941 for child in node.items]
942 newnode.body = [self.visit(child, newnode) for child in node.body]
943 newnode.set_line_info(newnode.last_child())
944 return newnode
945
946 def visit_yieldfrom(self, node, parent):
947 return _create_yield_node(node, parent, self, new.YieldFrom)
948
949 def visit_class(self, node, parent):
950 newnode = super(TreeRebuilder3k, self).visit_class(node, parent)
951 newnode._newstyle = True
952 for keyword in node.keywords:
953 if keyword.arg == 'metaclass':
954 newnode._metaclass = self.visit(keyword, newnode).value
955 break
956 return newnode
957 860
958 if sys.version_info >= (3, 0): 861 if sys.version_info >= (3, 0):
959 TreeRebuilder = TreeRebuilder3k 862 TreeRebuilder = TreeRebuilder3k
960 863
961 864
OLDNEW
« no previous file with comments | « third_party/logilab/astng/raw_building.py ('k') | third_party/logilab/astng/scoped_nodes.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698