emacs-diffs
[Top][All Lists]
Advanced

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

emacs-29 2215298d90b 2/2: Update JSX support due to upstream changes (bu


From: Theodor Thornhill
Subject: emacs-29 2215298d90b 2/2: Update JSX support due to upstream changes (bug#64647)
Date: Sat, 22 Jul 2023 17:21:29 -0400 (EDT)

branch: emacs-29
commit 2215298d90bb04968803e7323af0cc3d819ae301
Author: Vincenzo Pupillo <v.pupillo@gmail.com>
Commit: Theodor Thornhill <theo@thornhill.no>

    Update JSX support due to upstream changes (bug#64647)
    
    A recent change in tree-sitter-javascript grammar support for
    JSX (commit bb1f97b), changed two things:
    1. renamed nested_identifier to member_expression
    2. removed jsx_fragment, jsx_text is used instead
    
    * lisp/progmodes/js.el (js-jsx--treesit-indent-compatibility-bb1f97b):
    Indent helper function to handle different tree-sitter-javascript
    version.
    * lisp/progmodes/js.el (js--treesit-indent-rules): Use the new
    function to handle both jsx_fragment and jsx_text.
    * lisp/progmodes/js.el (js-jsx--treesit-font-lock-compatibility-bb1f97b):
    Font lock helper function for handle different tree-sitter-javascript
    version.
    * lisp/progmodes/js.el (js--treesit-font-lock-settings): Use the new
    function to handle both nested_identifier and member_expression.
---
 lisp/progmodes/js.el | 61 +++++++++++++++++++++++++++++++++++++---------------
 1 file changed, 44 insertions(+), 17 deletions(-)

diff --git a/lisp/progmodes/js.el b/lisp/progmodes/js.el
index a05bd758dbc..70048e5d26c 100644
--- a/lisp/progmodes/js.el
+++ b/lisp/progmodes/js.el
@@ -3427,6 +3427,18 @@ This function is intended for use in 
`after-change-functions'."
 
 ;;; Tree sitter integration
 
+(defun js-jsx--treesit-indent-compatibility-bb1f97b ()
+  "Indent rules helper, to handle different releases of tree-sitter-javascript.
+Check if a node type is available, then return the right indent rules."
+  ;; handle commit bb1f97b
+  (condition-case nil
+      (progn (treesit-query-capture 'javascript '((jsx_fragment) @capture))
+             `(((match "<" "jsx_fragment") parent 0)
+               ((parent-is "jsx_fragment") parent js-indent-level)))
+    (error
+     `(((match "<" "jsx_text") parent 0)
+       ((parent-is "jsx_text") parent js-indent-level)))))
+
 (defvar js--treesit-indent-rules
   (let ((switch-case (rx "switch_" (or "case" "default"))))
     `((javascript
@@ -3462,8 +3474,7 @@ This function is intended for use in 
`after-change-functions'."
        ((parent-is "statement_block") parent-bol js-indent-level)
 
        ;; JSX
-       ((match "<" "jsx_fragment") parent 0)
-       ((parent-is "jsx_fragment") parent js-indent-level)
+       (js-jsx--treesit-indent-compatibility-bb1f97b)
        ((node-is "jsx_closing_element") parent 0)
        ((match "jsx_element" "statement") parent js-indent-level)
        ((parent-is "jsx_element") parent js-indent-level)
@@ -3490,6 +3501,35 @@ This function is intended for use in 
`after-change-functions'."
     "&&" "||" "!")
   "JavaScript operators for tree-sitter font-locking.")
 
+(defun js-jsx--treesit-font-lock-compatibility-bb1f97b ()
+  "Font lock rules helper, to handle different releases of 
tree-sitter-javascript.
+Check if a node type is available, then return the right font lock rules."
+  ;; handle commit bb1f97b
+  (condition-case nil
+      (progn (treesit-query-capture 'javascript '((member_expression) 
@capture))
+            '((jsx_opening_element
+               [(member_expression (identifier)) (identifier)]
+               @font-lock-function-call-face)
+
+              (jsx_closing_element
+               [(member_expression (identifier)) (identifier)]
+               @font-lock-function-call-face)
+
+              (jsx_self_closing_element
+               [(member_expression (identifier)) (identifier)]
+               @font-lock-function-call-face)))
+    (error '((jsx_opening_element
+             [(nested_identifier (identifier)) (identifier)]
+             @font-lock-function-call-face)
+
+            (jsx_closing_element
+             [(nested_identifier (identifier)) (identifier)]
+             @font-lock-function-call-face)
+
+            (jsx_self_closing_element
+             [(nested_identifier (identifier)) (identifier)]
+             @font-lock-function-call-face)))))
+
 (defvar js--treesit-font-lock-settings
   (treesit-font-lock-rules
 
@@ -3599,21 +3639,8 @@ This function is intended for use in 
`after-change-functions'."
 
    :language 'javascript
    :feature 'jsx
-   '((jsx_opening_element
-      [(nested_identifier (identifier)) (identifier)]
-      @font-lock-function-call-face)
-
-     (jsx_closing_element
-      [(nested_identifier (identifier)) (identifier)]
-      @font-lock-function-call-face)
-
-     (jsx_self_closing_element
-      [(nested_identifier (identifier)) (identifier)]
-      @font-lock-function-call-face)
-
-     (jsx_attribute
-      (property_identifier)
-      @font-lock-constant-face))
+   (append (js-jsx--treesit-font-lock-compatibility-bb1f97b)
+          '((jsx_attribute (property_identifier) @font-lock-constant-face)))
 
    :language 'javascript
    :feature 'number



reply via email to

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