From 95c582fd8038a7158ff96baff4186f5fb601afd4 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Sun, 6 Jun 2021 12:10:38 -0400 Subject: feat: add support for Python 3.10 match-case statements --- coverage/parser.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) (limited to 'coverage/parser.py') diff --git a/coverage/parser.py b/coverage/parser.py index ff395dad..abaa2e50 100644 --- a/coverage/parser.py +++ b/coverage/parser.py @@ -1017,6 +1017,27 @@ class AstArcAnalyzer: exits |= self.add_body_arcs(node.orelse, from_start=from_start) return exits + @contract(returns='ArcStarts') + def _handle__Match(self, node): + start = self.line_for_node(node) + last_start = start + exits = set() + had_wildcard = False + for case in node.cases: + # The wildcard case doesn't execute the pattern. + case_start = self.line_for_node(case.pattern) + if isinstance(case.pattern, ast.MatchAs): + had_wildcard = True + if case.pattern.name is None: + case_start = self.line_for_node(case.body[0]) + self.add_arc(last_start, case_start, "the pattern on line {lineno} always matched") + from_start = ArcStart(case_start, cause="the pattern on line {lineno} never matched") + exits |= self.add_body_arcs(case.body, from_start=from_start) + last_start = case_start + if not had_wildcard: + exits.add(from_start) + return exits + @contract(returns='ArcStarts') def _handle__NodeList(self, node): start = self.line_for_node(node) -- cgit v1.2.1