diff options
| author | Emile Anclin <emile.anclin@logilab.fr> | 2010-10-12 10:31:00 +0200 |
|---|---|---|
| committer | Emile Anclin <emile.anclin@logilab.fr> | 2010-10-12 10:31:00 +0200 |
| commit | 650f0a151ca98b8e91a91c11305b84f771c64dbb (patch) | |
| tree | a2a923ec8d2699b1fe6bd38b595e07bc1b672f30 | |
| parent | cbaee0645c621ecb043a2bf39f66c5df391cbe8b (diff) | |
| download | astroid-git-650f0a151ca98b8e91a91c11305b84f771c64dbb.tar.gz | |
py3k / Raise : use "exc" instead of "type"
have other attributes explicitly different for 2.x and 3.x
| -rw-r--r-- | _nodes_ast.py | 30 | ||||
| -rw-r--r-- | _nodes_compiler.py | 2 | ||||
| -rw-r--r-- | as_string.py | 8 | ||||
| -rw-r--r-- | node_classes.py | 22 | ||||
| -rw-r--r-- | scoped_nodes.py | 10 |
5 files changed, 46 insertions, 26 deletions
diff --git a/_nodes_ast.py b/_nodes_ast.py index b1facea3..3a96fa40 100644 --- a/_nodes_ast.py +++ b/_nodes_ast.py @@ -557,16 +557,26 @@ class TreeRebuilder(RebuildVisitor): newnode.set_line_info(newnode.last_child()) return newnode - def visit_raise(self, node, parent): - """visit a Raise node by returning a fresh instance of it""" - newnode = new.Raise() - _lineno_parent(node, newnode, parent) - - newnode.type = self.visit(node.type, newnode) - newnode.inst = self.visit(node.inst, newnode) - newnode.tback = self.visit(node.tback, newnode) - newnode.set_line_info(newnode.last_child()) - return newnode + if sys.version_info < (3, 0): + def visit_raise(self, node, parent): + """visit a Raise node by returning a fresh instance of it""" + newnode = new.Raise() + _lineno_parent(node, newnode, parent) + newnode.exc = self.visit(node.type, newnode) + newnode.inst = self.visit(node.inst, newnode) + newnode.tback = self.visit(node.tback, newnode) + newnode.set_line_info(newnode.last_child()) + return newnode + else: + def visit_raise(self, node, parent): + """visit a Raise node by returning a fresh instance of it""" + newnode = new.Raise() + _lineno_parent(node, newnode, parent) + # no traceback; anyway it is not used in Pylint + newnode.exc = self.visit(node.exc, newnode) + newnode.cause = self.visit(node.cause, newnode) + newnode.set_line_info(newnode.last_child()) + return newnode def visit_return(self, node, parent): """visit a Return node by returning a fresh instance of it""" diff --git a/_nodes_compiler.py b/_nodes_compiler.py index 54766689..6a89caef 100644 --- a/_nodes_compiler.py +++ b/_nodes_compiler.py @@ -602,7 +602,7 @@ class TreeRebuilder(RebuildVisitor): """visit a Raise node by returning a fresh instance of it""" newnode = new.Raise() self._set_infos(node, newnode, parent) - newnode.type = self.visit(node.expr1, newnode) + newnode.exc = self.visit(node.expr1, newnode) newnode.inst = self.visit(node.expr2, newnode) newnode.tback = self.visit(node.expr3, newnode) return newnode diff --git a/as_string.py b/as_string.py index 76276d1f..ddd8be22 100644 --- a/as_string.py +++ b/as_string.py @@ -308,15 +308,15 @@ class AsStringVisitor(ASTVisitor): def visit_raise(self, node): """return an astng.Raise node as string""" - if node.type: + if node.exc: if node.inst: if node.tback: - return 'raise %s, %s, %s' % (node.type.accept(self), + return 'raise %s, %s, %s' % (node.exc.accept(self), node.inst.accept(self), node.tback.accept(self)) - return 'raise %s, %s' % (node.type.accept(self), + return 'raise %s, %s' % (node.exc.accept(self), node.inst.accept(self)) - return 'raise %s' % node.type.accept(self) + return 'raise %s' % node.exc.accept(self) return 'raise' def visit_return(self, node): diff --git a/node_classes.py b/node_classes.py index f93ad4a8..58f91f43 100644 --- a/node_classes.py +++ b/node_classes.py @@ -20,6 +20,7 @@ """Module for some node classes. More nodes in scoped_nodes.py """ +import sys from itertools import chain, imap from logilab.astng import NoDefault @@ -667,12 +668,25 @@ class Print(StmtMixIn, NodeNG): values = None + class Raise(StmtMixIn, NodeNG): """class representing a Raise node""" - _astng_fields = ('type', 'inst', 'tback') - type = None - inst = None - tback = None + exc = None + if sys.version_info < (3, 0): + _astng_fields = ('exc', 'inst', 'tback') + inst = None + tback = None + else: + _astng_fields = ('exc', 'cause') + inst = None + tback = None + + def raises_not_implemented(self): + if not self.exc: + return + for name in self.exc.nodes_of_class(Name): + if name.name == 'NotImplementedError': + return True class Return(StmtMixIn, NodeNG): diff --git a/scoped_nodes.py b/scoped_nodes.py index 86973897..54dcc92b 100644 --- a/scoped_nodes.py +++ b/scoped_nodes.py @@ -572,13 +572,9 @@ class Function(StmtMixIn, Lambda): NotImplementError, or, if pass_is_abstract, a pass statement """ for child_node in self.body: - if isinstance(child_node, Raise) and child_node.type: - try: - name = child_node.type.nodes_of_class(Name).next() - if name.name == 'NotImplementedError': - return True - except StopIteration: - pass + if isinstance(child_node, Raise): + if child_node.raises_not_implemented(): + return True if pass_is_abstract and isinstance(child_node, Pass): return True return False |
