summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEmile Anclin <emile.anclin@logilab.fr>2010-10-12 10:31:00 +0200
committerEmile Anclin <emile.anclin@logilab.fr>2010-10-12 10:31:00 +0200
commit650f0a151ca98b8e91a91c11305b84f771c64dbb (patch)
treea2a923ec8d2699b1fe6bd38b595e07bc1b672f30
parentcbaee0645c621ecb043a2bf39f66c5df391cbe8b (diff)
downloadastroid-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.py30
-rw-r--r--_nodes_compiler.py2
-rw-r--r--as_string.py8
-rw-r--r--node_classes.py22
-rw-r--r--scoped_nodes.py10
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