emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

emacs-29 1fb2fb501f3: typescript-ts-mode, tsx-ts-mode: Fix syntax proper


From: Dmitry Gutov
Subject: emacs-29 1fb2fb501f3: typescript-ts-mode, tsx-ts-mode: Fix syntax properties for regexp and jsx
Date: Tue, 12 Sep 2023 19:08:01 -0400 (EDT)

branch: emacs-29
commit 1fb2fb501f34d7c08462209a798e65904ea7b8da
Author: Jostein Kjønigsen <jostein@kjonigsen.net>
Commit: Dmitry Gutov <dmitry@gutov.dev>

    typescript-ts-mode, tsx-ts-mode: Fix syntax properties for regexp and jsx
    
    Propertize regexps as strings and JSX elements as generic strings.
    
    * lisp/progmodes/typescript-ts-mode.el (ts-ts--s-p-query)
    (tsx-ts--s-p-query): New variables.
    (ts-ts--syntax-propertize, tsx-ts--syntax-propertize)
    (ts-ts--syntax-propertize-captures): New functions.
    (typescript-ts-mode, tsx-ts-mode): Use them (bug#65470).
---
 lisp/progmodes/typescript-ts-mode.el | 39 ++++++++++++++++++++++++++++++++++++
 1 file changed, 39 insertions(+)

diff --git a/lisp/progmodes/typescript-ts-mode.el 
b/lisp/progmodes/typescript-ts-mode.el
index 96ea18523e3..57382c9cb31 100644
--- a/lisp/progmodes/typescript-ts-mode.el
+++ b/lisp/progmodes/typescript-ts-mode.el
@@ -418,6 +418,7 @@ Argument LANGUAGE is either `typescript' or `tsx'."
                   (keyword string escape-sequence)
                   (constant expression identifier number pattern property)
                   (function bracket delimiter)))
+    (setq-local syntax-propertize-function #'ts-ts--syntax-propertize)
 
     (treesit-major-mode-setup)))
 
@@ -464,9 +465,47 @@ at least 3 (which is the default value)."
                   (keyword string escape-sequence)
                   (constant expression identifier jsx number pattern property)
                   (function bracket delimiter)))
+    (setq-local syntax-propertize-function #'tsx-ts--syntax-propertize)
 
     (treesit-major-mode-setup)))
 
+(defvar ts-ts--s-p-query
+  (when (treesit-available-p)
+    (treesit-query-compile 'typescript
+                           '(((regex pattern: (regex_pattern) @regexp))))))
+
+(defvar tsx-ts--s-p-query
+  (when (treesit-available-p)
+    (treesit-query-compile 'tsx
+                           '(((regex pattern: (regex_pattern) @regexp))
+                             ((variable_declarator value: (jsx_element) @jsx))
+                             ((assignment_expression right: (jsx_element) 
@jsx))
+                             ((arguments (jsx_element) @jsx))
+                             ((parenthesized_expression (jsx_element) @jsx))
+                             ((return_statement (jsx_element) @jsx))))))
+
+(defun ts-ts--syntax-propertize (beg end)
+  (let ((captures (treesit-query-capture 'typescript ts-ts--s-p-query beg 
end)))
+    (ts-ts--syntax-propertize-captures captures)))
+
+(defun tsx-ts--syntax-propertize (beg end)
+  (let ((captures (treesit-query-capture 'tsx tsx-ts--s-p-query beg end)))
+    (ts-ts--syntax-propertize-captures captures)))
+
+(defun ts-ts--syntax-propertize-captures (captures)
+  (pcase-dolist (`(,name . ,node) captures)
+    (let* ((ns (treesit-node-start node))
+           (ne (treesit-node-end node))
+           (syntax (pcase-exhaustive name
+                     ('regexp
+                      (cl-decf ns)
+                      (cl-incf ne)
+                      (string-to-syntax "\"/"))
+                     ('jsx
+                      (string-to-syntax "|")))))
+      (put-text-property ns (1+ ns) 'syntax-table syntax)
+      (put-text-property (1- ne) ne 'syntax-table syntax))))
+
 (if (treesit-ready-p 'tsx)
     (add-to-list 'auto-mode-alist '("\\.tsx\\'" . tsx-ts-mode)))
 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]