diff --git a/Lib/idlelib/colorizer.py b/Lib/idlelib/colorizer.py index b4df353012b788..247b0b186d6196 100644 --- a/Lib/idlelib/colorizer.py +++ b/Lib/idlelib/colorizer.py @@ -64,7 +64,7 @@ def make_pat(): prog = make_pat() -idprog = re.compile(r"\s+(\w+)") +idprog = re.compile(r"\s+([^\\\s([:]+)") prog_group_name_to_tag = { "MATCH_SOFTKW": "KEYWORD", "CASE_SOFTKW": "KEYWORD", @@ -346,8 +346,9 @@ def _add_tags_in_section(self, chars, head): self._add_tag(a, b, head, name) if matched_text in ("def", "class"): if m1 := self.idprog.match(chars, b): - a, b = m1.span(1) - self._add_tag(a, b, head, "DEFINITION") + if m1.groups()[0].isidentifier(): + a, b = m1.span(1) + self._add_tag(a, b, head, "DEFINITION") def removecolors(self): "Remove all colorizing tags." diff --git a/Lib/idlelib/idle_test/test_colorizer.py b/Lib/idlelib/idle_test/test_colorizer.py index 308bc389384d33..d0c4957bfc6587 100644 --- a/Lib/idlelib/idle_test/test_colorizer.py +++ b/Lib/idlelib/idle_test/test_colorizer.py @@ -93,6 +93,14 @@ def test_idprog(self): self.assertIsNone(m) m = idprog.match(' space') self.assertEqual(m.group(0), ' space') + m = idprog.match(' space') + self.assertTrue(m.groups()[0].isidentifier()) + m = idprog.match(' 42') + self.assertFalse(m.groups()[0].isidentifier()) + m = idprog.match(' dot·[T]') + self.assertTrue(m.groups()[0].isidentifier()) + m = idprog.match(' cls()') + self.assertTrue(m.groups()[0].isidentifier()) class ColorConfigTest(unittest.TestCase): diff --git a/Misc/NEWS.d/next/IDLE/2025-08-10-15-01-48.gh-issue-135052._pUw6u.rst b/Misc/NEWS.d/next/IDLE/2025-08-10-15-01-48.gh-issue-135052._pUw6u.rst new file mode 100644 index 00000000000000..ceadf15edbad23 --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2025-08-10-15-01-48.gh-issue-135052._pUw6u.rst @@ -0,0 +1,2 @@ +Fix a bug that XID_Continue Unicode characters in function/class names +highlighted incorrectly.