diff options
| author | Emile Anclin <emile.anclin@logilab.fr> | 2009-09-03 18:05:52 +0200 |
|---|---|---|
| committer | Emile Anclin <emile.anclin@logilab.fr> | 2009-09-03 18:05:52 +0200 |
| commit | 2ec6ae811ff52ed61c43db078b2b84985e45d706 (patch) | |
| tree | 86ec3ab9f425f99307e620125d5f90e5747d9108 /node_classes.py | |
| parent | eb5abeeca27645211fa77e6c3b40cccd7d96c6af (diff) | |
| download | astroid-git-2ec6ae811ff52ed61c43db078b2b84985e45d706.tar.gz | |
[R] demonkey patching block_range
Diffstat (limited to 'node_classes.py')
| -rw-r--r-- | node_classes.py | 51 |
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""" |
