summaryrefslogtreecommitdiff
path: root/node_classes.py
diff options
context:
space:
mode:
authorEmile Anclin <emile.anclin@logilab.fr>2009-09-03 18:05:52 +0200
committerEmile Anclin <emile.anclin@logilab.fr>2009-09-03 18:05:52 +0200
commit2ec6ae811ff52ed61c43db078b2b84985e45d706 (patch)
tree86ec3ab9f425f99307e620125d5f90e5747d9108 /node_classes.py
parenteb5abeeca27645211fa77e6c3b40cccd7d96c6af (diff)
downloadastroid-git-2ec6ae811ff52ed61c43db078b2b84985e45d706.tar.gz
[R] demonkey patching block_range
Diffstat (limited to 'node_classes.py')
-rw-r--r--node_classes.py51
1 files changed, 51 insertions, 0 deletions
diff --git a/node_classes.py b/node_classes.py
index a445ee24..f855e80a 100644
--- a/node_classes.py
+++ b/node_classes.py
@@ -1,4 +1,6 @@
+#
+from logilab.astng._nodes import TryExcept
# from lookup import NodeNG, StmtMixIn, LocalsDictMixIn
@@ -124,6 +126,22 @@ class ExceptHandlerNG(object):# (ExceptHandler, NodeNG)
else:
return self.lineno
+ def set_line_info(self, lastchild):
+ self.fromlineno = self.lineno
+ self.tolineno = lastchild.tolineno
+ self.blockstart_tolineno = self._blockstart_toline()
+
+ def catch(self, exceptions):
+ if self.type is None or exceptions is None:
+ return True
+ for node in self.type.nodes_of_class(Name):
+ if node.name in exceptions:
+ return True
+
+ def block_range(self, lineno):
+ """handle block line numbers range for For statements"""
+ return self. _elsed_block_range(lineno, self.orelse)
+
class ExecNG(object):# (Exec, NodeNG)
"""class representing an Exec node"""
@@ -166,6 +184,15 @@ class IfNG(object):# (If, NodeNG)
def _blockstart_toline(self):
return self.test.tolineno
+ def block_range(self, lineno):
+ """handle block line numbers range for if statements"""
+ if lineno == self.body[0].fromlineno:
+ return lineno, lineno
+ if lineno <= self.body[-1].tolineno:
+ return lineno, self.body[-1].tolineno
+ return self._elsed_block_range(lineno, self.orelse,
+ self.body[0].fromlineno - 1)
+
class IfExpNG(object):# (IfExp, StmtMixIn, NodeNG)
@@ -236,6 +263,18 @@ class TryExceptNG(object):# (TryExcept, NodeNG)
def _blockstart_toline(self):
return self.lineno
+ def block_range(self, lineno):
+ """handle block line numbers range for try/except statements"""
+ last = None
+ for exhandler in self.handlers:
+ if exhandler.type and lineno == exhandler.type.fromlineno:
+ return lineno, lineno
+ if exhandler.body[0].fromlineno <= lineno <= exhandler.body[-1].tolineno:
+ return lineno, exhandler.body[-1].tolineno
+ if last is None:
+ last = exhandler.body[0].fromlineno - 1
+ return self._elsed_block_range(lineno, self.orelse, last)
+
class TryFinallyNG(object):# (TryFinally, NodeNG)
"""class representing a TryFinally node"""
@@ -243,6 +282,15 @@ class TryFinallyNG(object):# (TryFinally, NodeNG)
def _blockstart_toline(self):
return self.lineno
+ def block_range(self, lineno):
+ """handle block line numbers range for try/finally statements"""
+ child = self.body[0]
+ # py2.5 try: except: finally:
+ if (isinstance(child, TryExcept) and child.fromlineno == self.fromlineno
+ and lineno > self.fromlineno and lineno <= child.tolineno):
+ return child.block_range(lineno)
+ return self._elsed_block_range(lineno, self.finalbody)
+
class TupleNG(object):# (Tuple, StmtMixIn, NodeNG)
"""class representing a Tuple node"""
@@ -258,6 +306,9 @@ class WhileNG(object):# (While, NodeNG)
def _blockstart_toline(self):
return self.test.tolineno
+ def block_range(self, lineno):
+ """handle block line numbers range for for and while statements"""
+ return self. _elsed_block_range(lineno, self.orelse)
class WithNG(object):# (With, NodeNG)
"""class representing a With node"""