]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-136801: Fix PyREPL syntax highlightning on match cases after multi-line case ...
authorOlga Matoula <olgamatoula@gmail.com>
Sat, 19 Jul 2025 13:15:49 +0000 (14:15 +0100)
committerGitHub <noreply@github.com>
Sat, 19 Jul 2025 13:15:49 +0000 (15:15 +0200)
Lib/_pyrepl/utils.py
Lib/test/test_pyrepl/test_reader.py
Misc/NEWS.d/next/Core_and_Builtins/2025-07-19-12-37-05.gh-issue-136801.XU_tF2.rst [new file with mode: 0644]

index e04fbdc6c8a5c4cbf3e5968d0342d04a0a9db548..fd788c8429e15b2e6294b1c6bfe005770a7ce53b 100644 (file)
@@ -241,14 +241,14 @@ def is_soft_keyword_used(*tokens: TI | None) -> bool:
                 return s in keyword_first_sets_match
             return True
         case (
-            None | TI(T.NEWLINE) | TI(T.INDENT) | TI(string=":"),
+            None | TI(T.NEWLINE) | TI(T.INDENT) | TI(T.DEDENT) | TI(string=":"),
             TI(string="case"),
             TI(T.NUMBER | T.STRING | T.FSTRING_START | T.TSTRING_START)
             | TI(T.OP, string="(" | "*" | "-" | "[" | "{")
         ):
             return True
         case (
-            None | TI(T.NEWLINE) | TI(T.INDENT) | TI(string=":"),
+            None | TI(T.NEWLINE) | TI(T.INDENT) | TI(T.DEDENT) | TI(string=":"),
             TI(string="case"),
             TI(T.NAME, string=s)
         ):
index 1f655264f1c00a8f2bbe43ada495c609b5e8b005..9a02dff7387563630831c64bbb3b2f5cd1e30a42 100644 (file)
@@ -375,7 +375,8 @@ class TestReaderInColor(ScreenEqualMixin, TestCase):
                 )
                 match case:
                     case "emscripten": print("on the web")
-                    case "ios" | "android": print("on the phone")
+                    case "ios" | "android":
+                        print("on the phone")
                     case _: print('arms around', match.group(1))
             """
         )
@@ -393,7 +394,8 @@ class TestReaderInColor(ScreenEqualMixin, TestCase):
                 {o}){z}
                 {K}match{z} case{o}:{z}
                     {K}case{z} {s}"emscripten"{z}{o}:{z} {b}print{z}{o}({z}{s}"on the web"{z}{o}){z}
-                    {K}case{z} {s}"ios"{z} {o}|{z} {s}"android"{z}{o}:{z} {b}print{z}{o}({z}{s}"on the phone"{z}{o}){z}
+                    {K}case{z} {s}"ios"{z} {o}|{z} {s}"android"{z}{o}:{z}
+                        {b}print{z}{o}({z}{s}"on the phone"{z}{o}){z}
                     {K}case{z} {K}_{z}{o}:{z} {b}print{z}{o}({z}{s}'arms around'{z}{o},{z} match{o}.{z}group{o}({z}{n}1{z}{o}){z}{o}){z}
             """
         )
@@ -402,14 +404,14 @@ class TestReaderInColor(ScreenEqualMixin, TestCase):
         reader, _ = handle_all_events(events)
         self.assert_screen_equal(reader, code, clean=True)
         self.assert_screen_equal(reader, expected_sync)
-        self.assertEqual(reader.pos, 2**7 + 2**8)
-        self.assertEqual(reader.cxy, (0, 14))
+        self.assertEqual(reader.pos, 396)
+        self.assertEqual(reader.cxy, (0, 15))
 
         async_msg = "{k}async{z} ".format(**colors)
         expected_async = expected.format(a=async_msg, **colors)
         more_events = itertools.chain(
             code_to_events(code),
-            [Event(evt="key", data="up", raw=bytearray(b"\x1bOA"))] * 13,
+            [Event(evt="key", data="up", raw=bytearray(b"\x1bOA"))] * 14,
             code_to_events("async "),
         )
         reader, _ = handle_all_events(more_events)
diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-07-19-12-37-05.gh-issue-136801.XU_tF2.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-07-19-12-37-05.gh-issue-136801.XU_tF2.rst
new file mode 100644 (file)
index 0000000..5c0813b
--- /dev/null
@@ -0,0 +1 @@
+Fix PyREPL syntax highlightning on match cases after multi-line case. Contributed by Olga Matoula.