summaryrefslogtreecommitdiff
path: root/lisp/progmodes/python.el
diff options
context:
space:
mode:
authorYuan Fu <casouri@gmail.com>2022-11-24 10:18:14 -0800
committerYuan Fu <casouri@gmail.com>2022-11-24 13:47:27 -0800
commitfc9d7b3d047dbf60a07baa7fa92d5db90f562d28 (patch)
tree22014243bad061758ee582d0108ec869c202b973 /lisp/progmodes/python.el
parent55f6f1c82a35f0589d3dbdd1f32fae7ea9a758d8 (diff)
downloademacs-fc9d7b3d047dbf60a07baa7fa92d5db90f562d28.tar.gz
Improve python-ts-mode fontification (bug#59534)
* lisp/progmodes/python.el (python--treesit-operators): Add operators. (python--treesit-fontify-string): Fontify BOF docstrings.
Diffstat (limited to 'lisp/progmodes/python.el')
-rw-r--r--lisp/progmodes/python.el25
1 files changed, 20 insertions, 5 deletions
diff --git a/lisp/progmodes/python.el b/lisp/progmodes/python.el
index f97ae81508a..221e16f8f77 100644
--- a/lisp/progmodes/python.el
+++ b/lisp/progmodes/python.el
@@ -988,7 +988,7 @@ It makes underscores and dots word constituent chars.")
(defvar python--treesit-operators
'("-" "-=" "!=" "*" "**" "**=" "*=" "/" "//" "//=" "/=" "&" "%" "%="
- "^" "+" "+=" "<" "<<" "<=" "<>" "=" "==" ">" ">=" ">>" "|" "~"))
+ "^" "+" "+=" "<" "<<" "<=" "<>" "=" "==" ">" ">=" ">>" "|" "~" "@" "@="))
(defvar python--treesit-special-attributes
'("__annotations__" "__closure__" "__code__"
@@ -1033,12 +1033,27 @@ fontified."
(let* ((string-beg (treesit-node-start node))
(string-end (treesit-node-end node))
(maybe-expression (treesit-node-parent node))
- (maybe-defun (treesit-node-parent
+ (grandparent (treesit-node-parent
(treesit-node-parent
maybe-expression)))
- (face (if (and (member (treesit-node-type maybe-defun)
- '("function_definition"
- "class_definition"))
+ (maybe-defun grandparent)
+ (face (if (and (or (member (treesit-node-type maybe-defun)
+ '("function_definition"
+ "class_definition"))
+ ;; If the grandparent is null, meaning the
+ ;; string is top-level, and the string has
+ ;; no node or only comment preceding it,
+ ;; it's a BOF docstring.
+ (and (null grandparent)
+ (cl-loop
+ for prev = (treesit-node-prev-sibling
+ maybe-expression)
+ then (treesit-node-prev-sibling prev)
+ while prev
+ if (not (equal (treesit-node-type prev)
+ "comment"))
+ return nil
+ finally return t)))
;; This check filters out this case:
;; def function():
;; return "some string"