From 3597bf6991678fd03a4282995cc5d98492b1b6ad Mon Sep 17 00:00:00 2001 From: kobarity Date: Fri, 24 May 2024 22:50:12 +0900 Subject: [PATCH] Fix Python font lock of chained assignment statement * lisp/progmodes/python.el (python-font-lock-keywords-maximum-decoration): Allow chaining of single assignment statements. * test/lisp/progmodes/python-tests.el (python-font-lock-assignment-statement-20): New test. (Bug#71093) (cherry picked from commit 3647645e94856344696768bef590b49a24c7ac52) --- lisp/progmodes/python.el | 11 +++++++++ test/lisp/progmodes/python-tests.el | 37 ++++++----------------------- 2 files changed, 18 insertions(+), 30 deletions(-) diff --git a/lisp/progmodes/python.el b/lisp/progmodes/python.el index 360936c9efd..79e383a1c1a 100644 --- a/lisp/progmodes/python.el +++ b/lisp/progmodes/python.el @@ -845,6 +845,17 @@ sign in chained assignment." (match-beginning 2)) ; limit the search until the assignment nil (1 font-lock-variable-name-face))) + ;; single assignment with type hints, e.g. + ;; a: int = 5 + ;; b: Tuple[Optional[int], Union[Sequence[str], str]] = (None, 'foo') + ;; c: Collection = {1, 2, 3} + ;; d: Mapping[int, str] = {1: 'bar', 2: 'baz'} + (,(python-font-lock-assignment-matcher + (python-rx grouped-assignment-target (* space) + (? ?: (* space) (+ not-simple-operator) (* space)) + (group assignment-operator))) + (1 font-lock-variable-name-face) + (2 'font-lock-operator-face)) ;; special cases ;; (a) = 5 ;; [a] = 5, diff --git a/test/lisp/progmodes/python-tests.el b/test/lisp/progmodes/python-tests.el index b19c5c31f16..0aee5a2212b 100644 --- a/test/lisp/progmodes/python-tests.el +++ b/test/lisp/progmodes/python-tests.el @@ -491,38 +491,15 @@ def f(x: CustomInt) -> CustomInt: (136 . font-lock-operator-face) (137) (144 . font-lock-keyword-face) (150)))) -(ert-deftest python-font-lock-assignment-statement-19 () +(ert-deftest python-font-lock-assignment-statement-20 () (python-tests-assert-faces - "a: List[List[CustomInt], List[CustomInt]] = []" + "a = b = c = 1" '((1 . font-lock-variable-name-face) (2) - (4 . font-lock-type-face) (8) - (9 . font-lock-type-face) (13) - (14 . font-lock-type-face) (23) - (26 . font-lock-type-face) (30) - (31 . font-lock-type-face) (40) - (43 . font-lock-operator-face) (44)))) - -(ert-deftest python-font-lock-operator-1 () - (python-tests-assert-faces - "1 << 2 ** 3 == +4%-5|~6&7^8%9" - '((1) - (3 . font-lock-operator-face) (5) - (8 . font-lock-operator-face) (10) - (13 . font-lock-operator-face) (15) - (16 . font-lock-operator-face) (17) - (18 . font-lock-operator-face) (20) - (21 . font-lock-operator-face) (23) - (24 . font-lock-operator-face) (25) - (26 . font-lock-operator-face) (27) - (28 . font-lock-operator-face) (29)))) - -(ert-deftest python-font-lock-operator-2 () - "Keyword operators are font-locked as keywords." - (python-tests-assert-faces - "is_ is None" - '((1) - (5 . font-lock-keyword-face) (7) - (8 . font-lock-constant-face)))) + (3 . font-lock-operator-face) (4) + (5 . font-lock-variable-name-face) (6) + (7 . font-lock-operator-face) (8) + (9 . font-lock-variable-name-face) (10) + (11 . font-lock-operator-face) (12)))) (ert-deftest python-font-lock-escape-sequence-string-newline () (python-tests-assert-faces -- 2.39.5