summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorIrit Katriel <1055913+iritkatriel@users.noreply.github.com>2022-11-12 18:42:17 (GMT)
committerGitHub <noreply@github.com>2022-11-12 18:42:17 (GMT)
commitfb844e1931bc1ad2f11565fbe25627a1a41b4203 (patch)
tree060f99d2e18add21b30bfcfd4ed766230393cc1b /Lib
parent73a921b0701a4c135154c14649b49a0bb797e143 (diff)
downloadcpython-fb844e1931bc1ad2f11565fbe25627a1a41b4203.zip
cpython-fb844e1931bc1ad2f11565fbe25627a1a41b4203.tar.gz
cpython-fb844e1931bc1ad2f11565fbe25627a1a41b4203.tar.bz2
gh-98762: Fix locations of match sub-patterns (GH-98775)
Diffstat (limited to 'Lib')
-rw-r--r--Lib/test/test_compile.py96
1 files changed, 95 insertions, 1 deletions
diff --git a/Lib/test/test_compile.py b/Lib/test/test_compile.py
index a14509a..791f20b 100644
--- a/Lib/test/test_compile.py
+++ b/Lib/test/test_compile.py
@@ -1164,7 +1164,7 @@ class TestSourcePositions(unittest.TestCase):
class SourceOffsetVisitor(ast.NodeVisitor):
def generic_visit(self, node):
super().generic_visit(node)
- if not isinstance(node, ast.expr) and not isinstance(node, ast.stmt):
+ if not isinstance(node, (ast.expr, ast.stmt, ast.pattern)):
return
lines.add(node.lineno)
end_lines.add(node.end_lineno)
@@ -1442,6 +1442,100 @@ async def f():
self.assertOpcodeSourcePositionIs(compiled_code, 'RETURN_VALUE',
line=2, end_line=7, column=4, end_column=36, occurrence=1)
+ def test_matchcase_sequence(self):
+ snippet = """\
+match x:
+ case a, b:
+ pass
+"""
+ compiled_code, _ = self.check_positions_against_ast(snippet)
+ self.assertOpcodeSourcePositionIs(compiled_code, 'MATCH_SEQUENCE',
+ line=2, end_line=2, column=9, end_column=13, occurrence=1)
+ self.assertOpcodeSourcePositionIs(compiled_code, 'UNPACK_SEQUENCE',
+ line=2, end_line=2, column=9, end_column=13, occurrence=1)
+ self.assertOpcodeSourcePositionIs(compiled_code, 'STORE_NAME',
+ line=2, end_line=2, column=9, end_column=13, occurrence=1)
+ self.assertOpcodeSourcePositionIs(compiled_code, 'STORE_NAME',
+ line=2, end_line=2, column=9, end_column=13, occurrence=2)
+
+ def test_matchcase_sequence_wildcard(self):
+ snippet = """\
+match x:
+ case a, *b, c:
+ pass
+"""
+ compiled_code, _ = self.check_positions_against_ast(snippet)
+ self.assertOpcodeSourcePositionIs(compiled_code, 'MATCH_SEQUENCE',
+ line=2, end_line=2, column=9, end_column=17, occurrence=1)
+ self.assertOpcodeSourcePositionIs(compiled_code, 'UNPACK_EX',
+ line=2, end_line=2, column=9, end_column=17, occurrence=1)
+ self.assertOpcodeSourcePositionIs(compiled_code, 'STORE_NAME',
+ line=2, end_line=2, column=9, end_column=17, occurrence=1)
+ self.assertOpcodeSourcePositionIs(compiled_code, 'STORE_NAME',
+ line=2, end_line=2, column=9, end_column=17, occurrence=2)
+ self.assertOpcodeSourcePositionIs(compiled_code, 'STORE_NAME',
+ line=2, end_line=2, column=9, end_column=17, occurrence=3)
+
+ def test_matchcase_mapping(self):
+ snippet = """\
+match x:
+ case {"a" : a, "b": b}:
+ pass
+"""
+ compiled_code, _ = self.check_positions_against_ast(snippet)
+ self.assertOpcodeSourcePositionIs(compiled_code, 'MATCH_MAPPING',
+ line=2, end_line=2, column=9, end_column=26, occurrence=1)
+ self.assertOpcodeSourcePositionIs(compiled_code, 'MATCH_KEYS',
+ line=2, end_line=2, column=9, end_column=26, occurrence=1)
+ self.assertOpcodeSourcePositionIs(compiled_code, 'STORE_NAME',
+ line=2, end_line=2, column=9, end_column=26, occurrence=1)
+ self.assertOpcodeSourcePositionIs(compiled_code, 'STORE_NAME',
+ line=2, end_line=2, column=9, end_column=26, occurrence=2)
+
+ def test_matchcase_mapping_wildcard(self):
+ snippet = """\
+match x:
+ case {"a" : a, "b": b, **c}:
+ pass
+"""
+ compiled_code, _ = self.check_positions_against_ast(snippet)
+ self.assertOpcodeSourcePositionIs(compiled_code, 'MATCH_MAPPING',
+ line=2, end_line=2, column=9, end_column=31, occurrence=1)
+ self.assertOpcodeSourcePositionIs(compiled_code, 'MATCH_KEYS',
+ line=2, end_line=2, column=9, end_column=31, occurrence=1)
+ self.assertOpcodeSourcePositionIs(compiled_code, 'STORE_NAME',
+ line=2, end_line=2, column=9, end_column=31, occurrence=1)
+ self.assertOpcodeSourcePositionIs(compiled_code, 'STORE_NAME',
+ line=2, end_line=2, column=9, end_column=31, occurrence=2)
+
+ def test_matchcase_class(self):
+ snippet = """\
+match x:
+ case C(a, b):
+ pass
+"""
+ compiled_code, _ = self.check_positions_against_ast(snippet)
+ self.assertOpcodeSourcePositionIs(compiled_code, 'MATCH_CLASS',
+ line=2, end_line=2, column=9, end_column=16, occurrence=1)
+ self.assertOpcodeSourcePositionIs(compiled_code, 'UNPACK_SEQUENCE',
+ line=2, end_line=2, column=9, end_column=16, occurrence=1)
+ self.assertOpcodeSourcePositionIs(compiled_code, 'STORE_NAME',
+ line=2, end_line=2, column=9, end_column=16, occurrence=1)
+ self.assertOpcodeSourcePositionIs(compiled_code, 'STORE_NAME',
+ line=2, end_line=2, column=9, end_column=16, occurrence=2)
+
+ def test_matchcase_or(self):
+ snippet = """\
+match x:
+ case C(1) | C(2):
+ pass
+"""
+ compiled_code, _ = self.check_positions_against_ast(snippet)
+ self.assertOpcodeSourcePositionIs(compiled_code, 'MATCH_CLASS',
+ line=2, end_line=2, column=9, end_column=13, occurrence=1)
+ self.assertOpcodeSourcePositionIs(compiled_code, 'MATCH_CLASS',
+ line=2, end_line=2, column=16, end_column=20, occurrence=2)
+
def test_very_long_line_end_offset(self):
# Make sure we get the correct column offset for offsets
# too large to store in a byte.