summaryrefslogtreecommitdiff
path: root/coverage/parser.py
diff options
context:
space:
mode:
authorNed Batchelder <ned@nedbatchelder.com>2015-12-24 19:46:00 -0500
committerNed Batchelder <ned@nedbatchelder.com>2015-12-24 19:46:00 -0500
commitaa6dd62bb2c67f5e1d536133503f164895abee03 (patch)
tree123ca70dc3e8912da2899b6383963f5f842c8f57 /coverage/parser.py
parentfbe278c8bc9f3355a23dd68ad53a8a0201004f0b (diff)
downloadpython-coveragepy-aa6dd62bb2c67f5e1d536133503f164895abee03.tar.gz
A start on try/except/finally
Diffstat (limited to 'coverage/parser.py')
-rw-r--r--coverage/parser.py24
1 files changed, 22 insertions, 2 deletions
diff --git a/coverage/parser.py b/coverage/parser.py
index fb2cf95..4b920f1 100644
--- a/coverage/parser.py
+++ b/coverage/parser.py
@@ -341,8 +341,9 @@ class AstArcAnalyzer(object):
handler = getattr(self, "handle_" + node_name, self.handle_default)
return handler(node)
- def add_body_arcs(self, body, from_line):
- prev_lines = set([from_line])
+ def add_body_arcs(self, body, from_line=None, prev_lines=None):
+ if prev_lines is None:
+ prev_lines = set([from_line])
for body_node in body:
lineno = self.line_for_node(body_node)
for prev_lineno in prev_lines:
@@ -363,6 +364,7 @@ class AstArcAnalyzer(object):
# TODO: listcomps hidden in lists: x = [[i for i in range(10)]]
# TODO: multi-line listcomps
# TODO: nested function definitions
+ # TODO: multiple `except` clauses
def handle_Break(self, node):
here = self.line_for_node(node)
@@ -411,12 +413,30 @@ class AstArcAnalyzer(object):
def handle_Module(self, node):
raise Exception("TODO: this shouldn't happen")
+ def handle_Raise(self, node):
+ # `raise` statement jumps away, no exits from here.
+ return set([])
+
def handle_Return(self, node):
here = self.line_for_node(node)
# TODO: what if self.function_start is None?
self.arcs.add((here, -self.function_start))
return set([])
+ def handle_Try(self, node):
+ start = self.line_for_node(node)
+ exits = self.add_body_arcs(node.body, from_line=start)
+ handler_exits = set()
+ for handler_node in node.handlers:
+ handler_start = self.line_for_node(handler_node)
+ # TODO: handler_node.name and handler_node.type
+ handler_exits |= self.add_body_arcs(handler_node.body, from_line=handler_start)
+ # TODO: node.orelse
+ # TODO: node.finalbody
+ if node.finalbody:
+ exits = self.add_body_arcs(node.finalbody, prev_lines=exits|handler_exits)
+ return exits
+
def handle_While(self, node):
constant_test = self.is_constant_expr(node.test)
start = to_top = self.line_for_node(node.test)