]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix font lock of assignments with type hints in Python
authorDario Gjorgjevski <dario.gjorgjevski@gmail.com>
Wed, 11 Nov 2020 09:49:04 +0000 (10:49 +0100)
committerLars Ingebrigtsen <larsi@gnus.org>
Wed, 11 Nov 2020 09:49:04 +0000 (10:49 +0100)
* lisp/progmodes/python.el
(python-font-lock-keywords-maximum-decoration): Fix regular
expressions for font lock of assignments with type hints (bug#44568).

The font lock of assignments with type hints in Python is rather bad.
Consider the following example:

    from typing import Mapping, Tuple, Sequence
    var1: int = 5
    var2: Mapping[int, int] = {10: 1024}
    var3: Mapping[Tuple[int, int], int] = {(2, 5): 32}
    var4: Sequence[Sequence[int]] = [[1], [1, 2], [1, 2, 3]]
    var5: Sequence[Mapping[str, Sequence[str]]] = [
        {
            'red': ['scarlet', 'vermilion', 'ruby'],
            'green': ['emerald green', 'aqua']
        },
        {
            'sword': ['cutlass', 'rapier']
        }
    ]

As things stand right now, only ‘var1’ would be highlighted.  To make
things worse, the ‘Mapping’ type hint of ‘var2’ would also be
highlighted, which is entirely incorrect.

This commit makes all of ‘var1’ through ‘var5’ be highlighted
correctly.

lisp/progmodes/python.el

index 378ff8cc2c1c6b400e85abb58d50145f5437a98c..eb84b494e35490bbfadedd3ce2fd593af2231bc0 100644 (file)
@@ -662,10 +662,14 @@ builtins.")
     ;; assignments
     ;; support for a = b = c = 5
     (,(lambda (limit)
-        (let ((re (python-rx (group (+ (any word ?. ?_)))
-                             (? ?\[ (+ (not (any  ?\]))) ?\]) (* space)
+        (let ((re (python-rx (group (+ symbol-name))
+                             (? ?\[ (+ (not ?\])) ?\])
+                             (* space)
                              ;; A type, like " : int ".
-                             (? ?: (* space) (+ (any word ?. ?_)) (* space))
+                             (? ?:
+                                (* space)
+                                (+ not-simple-operator)
+                                (* space))
                              assignment-operator))
               (res nil))
           (while (and (setq res (re-search-forward re limit t))
@@ -675,9 +679,9 @@ builtins.")
      (1 font-lock-variable-name-face nil nil))
     ;; support for a, b, c = (1, 2, 3)
     (,(lambda (limit)
-        (let ((re (python-rx (group (+ (any word ?. ?_))) (* space)
-                             (* ?, (* space) (+ (any word ?. ?_)) (* space))
-                             ?, (* space) (+ (any word ?. ?_)) (* space)
+        (let ((re (python-rx (group (+ symbol-name)) (* space)
+                             (* ?, (* space) (+ symbol-name) (* space))
+                             ?, (* space) (+ symbol-name) (* space)
                              assignment-operator))
               (res nil))
           (while (and (setq res (re-search-forward re limit t))