From: Randy Taylor <dev@rjt.dev>
To: 59397@debbugs.gnu.org
Cc: casouri@gmail.com, theo@thornhill.no
Subject: bug#59397: [PATCH] feature/tree-sitter: Utilize new font-lock faces for more tree-sitter backed modes
Date: Sun, 20 Nov 2022 03:42:19 +0000 [thread overview]
Message-ID: <ReWNQjT65-ruEkKNyZA21GP5idoODLxqfBwEjj-Sp4lHB2POLeEGCSuUQfpT7euLs8N4b2HszCnAv_w8ZNK5JRNUebZzXdJYCXe5Hzz3028=@rjt.dev> (raw)
[-- Attachment #1.1: Type: text/plain, Size: 429 bytes --]
X-Debbugs-CC: casouri@gmail.com, theo@thornhill.no
This patch adds support for using the new font-lock faces for more tree-sitter backed modes.
js.el:
- For the number feature, is there a better way to match for exactly NaN or Infinity?
- It might be a good idea to make a parent/base mode (ECMA?) like done in c-ts-mode for JS and TS, since there's a bit of overlap. I'm not volunteering though, since I don't use JS or TS ;).
[-- Attachment #1.2: Type: text/html, Size: 1174 bytes --]
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-Utilize-new-font-lock-faces-for-more-tree-sitter-bac.patch --]
[-- Type: text/x-patch; name=0001-Utilize-new-font-lock-faces-for-more-tree-sitter-bac.patch, Size: 14387 bytes --]
From a157d87327fe5af206a9282f582cfe92605f0667 Mon Sep 17 00:00:00 2001
From: Randy Taylor <dev@rjt.dev>
Date: Sat, 19 Nov 2022 22:30:13 -0500
Subject: [PATCH] Utilize new font-lock faces for more tree-sitter backed modes
* lisp/progmodes/java-ts-mode.el (java-ts-mode--font-lock-settings):
Use operator and number font-lock faces.
(java-ts-mode): Alphabetize.
* lisp/progmodes/js.el (js--treesit-operators): Define operators.
(js--treesit-font-lock-settings): Use bracket, delimiter,
escape-sequence, property, number, and operator font-lock faces.
(js-mode): Add them to the feature list and alphabetize.
* lisp/progmodes/json-ts-mode.el (json-ts-mode--font-lock-settings):
Use bracket, delimiter, escape-sequence, and number faces. Remove
unused features.
(json-ts-mode): Add them to the feature list and alphabetize.
* lisp/progmodes/sh-script.el (sh-mode--treesit-settings): Use number
and operator font-lock faces.
(sh-mode): Add them to the feature list and alphabetize.
* lisp/progmodes/ts-mode.el (ts-mode--operators): Define operators.
(ts-mode--font-lock-settings): Use bracket, delimiter,
escape-sequence, property, number, and operator font-lock faces.
(ts-mode): Add them to the feature list and alphabetize.
---
lisp/progmodes/java-ts-mode.el | 17 ++++----
lisp/progmodes/js.el | 69 +++++++++++++++++++++++----------
lisp/progmodes/json-ts-mode.el | 32 ++++++++-------
lisp/progmodes/sh-script.el | 15 ++++---
lisp/progmodes/ts-mode.el | 71 ++++++++++++++++++++++------------
5 files changed, 133 insertions(+), 71 deletions(-)
diff --git a/lisp/progmodes/java-ts-mode.el b/lisp/progmodes/java-ts-mode.el
index 6a800d292c..5b8d026da4 100644
--- a/lisp/progmodes/java-ts-mode.el
+++ b/lisp/progmodes/java-ts-mode.el
@@ -133,8 +133,7 @@ java-ts-mode--font-lock-settings
:feature 'constant
`(((identifier) @font-lock-constant-face
(:match "^[A-Z_][A-Z_\\d]*$" @font-lock-constant-face))
- (true) @font-lock-constant-face
- (false) @font-lock-constant-face)
+ [(true) (false)] @font-lock-constant-face)
:language 'java
:override t
:feature 'keyword
@@ -144,7 +143,7 @@ java-ts-mode--font-lock-settings
:language 'java
:override t
:feature 'operator
- `([,@java-ts-mode--operators] @font-lock-builtin-face)
+ `([,@java-ts-mode--operators] @font-lock-operator-face)
:language 'java
:override t
:feature 'annotation
@@ -161,8 +160,12 @@ java-ts-mode--font-lock-settings
:override t
:feature 'literal
`((null_literal) @font-lock-constant-face
- (decimal_floating_point_literal) @font-lock-constant-face
- (hex_floating_point_literal) @font-lock-constant-face)
+ (binary_integer_literal) @font-lock-number-face
+ (decimal_integer_literal) @font-lock-number-face
+ (hex_integer_literal) @font-lock-number-face
+ (octal_integer_literal) @font-lock-number-face
+ (decimal_floating_point_literal) @font-lock-number-face
+ (hex_floating_point_literal) @font-lock-number-face)
:language 'java
:override t
:feature 'type
@@ -302,8 +305,8 @@ java-ts-mode
;; Font-lock.
(setq-local treesit-font-lock-settings java-ts-mode--font-lock-settings)
(setq-local treesit-font-lock-feature-list
- '((basic comment keyword constant string operator)
- (type definition expression literal annotation)
+ '((basic comment constant keyword operator string)
+ (annotation definition expression literal type)
()))
;; Imenu.
diff --git a/lisp/progmodes/js.el b/lisp/progmodes/js.el
index 4b07c0d12c..39c4845c4e 100644
--- a/lisp/progmodes/js.el
+++ b/lisp/progmodes/js.el
@@ -3452,6 +3452,13 @@ js--treesit-keywords
"typeof" "var" "void" "while" "with" "yield")
"JavaScript keywords for tree-sitter font-locking.")
+(defvar js--treesit-operators
+ '("=" "+=" "-=" "*=" "/=" "%=" "**=" "<<=" ">>=" ">>>=" "&=" "^="
+ "|=" "&&=" "||=" "??=" "==" "!=" "===" "!==" ">" ">=" "<" "<=" "+"
+ "-" "*" "/" "%" "++" "--" "**" "&" "|" "^" "~" "<<" ">>" ">>>"
+ "&&" "||" "!")
+ "JavaScript operators for tree-sitter font-locking.")
+
(defvar js--treesit-font-lock-settings
(treesit-font-lock-rules
@@ -3466,8 +3473,7 @@ js--treesit-font-lock-settings
`(((identifier) @font-lock-constant-face
(:match "^[A-Z_][A-Z_\\d]*$" @font-lock-constant-face))
- [(true) (false) (null)] @font-lock-constant-face
- (number) @font-lock-constant-face)
+ [(true) (false) (null)] @font-lock-constant-face)
:language 'javascript
:override t
@@ -3544,21 +3550,6 @@ js--treesit-font-lock-settings
(member_expression
property: (property_identifier) @font-lock-variable-name-face)]))
- :language 'javascript
- :override t
- :feature 'property
- `((pair key: (property_identifier) @font-lock-variable-name-face)
-
- (pair value: (identifier) @font-lock-variable-name-face)
-
- (pair
- key: (property_identifier) @font-lock-function-name-face
- value: [(function) (arrow_function)])
-
- ((shorthand_property_identifier) @font-lock-variable-name-face)
-
- ((shorthand_property_identifier_pattern) @font-lock-variable-name-face))
-
:language 'javascript
:override t
:feature 'pattern
@@ -3583,7 +3574,42 @@ js--treesit-font-lock-settings
(jsx_attribute
(property_identifier)
- @font-lock-constant-face)))
+ @font-lock-property-face))
+
+ :language 'javascript
+ :feature 'number
+ `((number) @font-lock-number-face
+ ((identifier) @font-lock-number-face
+ (:match "^\\(:?NaN\\|Infinity\\)$" @font-lock-number-face)))
+
+ :language 'javascript
+ :feature 'operator
+ `([,@js--treesit-operators] @font-lock-operator-face
+ (ternary_expression ["?" ":"] @font-lock-operator-face))
+
+ :language 'javascript
+ :feature 'bracket
+ '(["(" ")" "[" "]" "{" "}"] @font-lock-bracket-face)
+
+ :language 'javascript
+ :feature 'delimiter
+ '(["," "." ";" ":"] @font-lock-delimiter-face)
+
+ :language 'javascript
+ :feature 'escape-sequence
+ :override t
+ '((escape_sequence) @font-lock-escape-face)
+
+ :language 'javascript
+ :override t
+ :feature 'property
+ `((property_identifier) @font-lock-property-face
+
+ (pair value: (identifier) @font-lock-property-face)
+
+ ((shorthand_property_identifier) @font-lock-property-face)
+
+ ((shorthand_property_identifier_pattern) @font-lock-property-face)))
"Tree-sitter font-lock settings.")
(defun js--fontify-template-string (node override start end &rest _)
@@ -3831,9 +3857,10 @@ js-ts-mode
;; Fontification.
(setq-local treesit-font-lock-settings js--treesit-font-lock-settings)
(setq-local treesit-font-lock-feature-list
- '((comment declaration)
- (string keyword identifier expression constant)
- (property pattern jsx )))
+ '(( comment declaration)
+ ( constant expression identifier keyword string)
+ ( bracket delimiter escape-sequence jsx number operator
+ pattern property)))
;; Imenu
(setq-local imenu-create-index-function
#'js--treesit-imenu)
diff --git a/lisp/progmodes/json-ts-mode.el b/lisp/progmodes/json-ts-mode.el
index 7e0dd17911..3edc0a6888 100644
--- a/lisp/progmodes/json-ts-mode.el
+++ b/lisp/progmodes/json-ts-mode.el
@@ -68,26 +68,28 @@ json-ts--indent-rules
(defvar json-ts-mode--font-lock-settings
(treesit-font-lock-rules
:language 'json
- :feature 'comment
- :override t
- '((comment) @font-lock-comment-face)
+ :feature 'bracket
+ '(["[" "]" "{" "}"] @font-lock-bracket-face)
:language 'json
- :feature 'string
- :override t
- '((escape_sequence) @font-lock-constant-face
- (string) @font-lock-string-face)
+ :feature 'constant
+ '([(null) (true) (false)] @font-lock-constant-face)
+ :language 'json
+ :feature 'delimiter
+ '(["," ":"] @font-lock-delimiter-face)
:language 'json
:feature 'number
- :override t
- '((number) @font-lock-constant-face)
+ '((number) @font-lock-number-face)
:language 'json
- :feature 'constant
+ :feature 'string
+ '((string) @font-lock-string-face)
+ :language 'json
+ :feature 'escape-sequence
:override t
- '([(null) (true) (false)] @font-lock-constant-face)
+ '((escape_sequence) @font-lock-escape-face)
:language 'json
- :feature 'pair
+ :feature 'error
:override t
- `((pair key: (_) @font-lock-variable-name-face)))
+ '((ERROR) @font-lock-warning-face))
"Font-lock settings for JSON.")
(defun json-ts-mode--imenu-1 (node)
@@ -148,7 +150,9 @@ json-ts-mode
;; Font-lock.
(setq-local treesit-font-lock-settings json-ts-mode--font-lock-settings)
(setq-local treesit-font-lock-feature-list
- '((comment string number) (constant pair) ()))
+ '((constant number string)
+ (escape-sequence)
+ (bracket delimiter error)))
;; Imenu.
(setq-local imenu-create-index-function #'json-ts-mode--imenu)
diff --git a/lisp/progmodes/sh-script.el b/lisp/progmodes/sh-script.el
index ed06f2263e..d40ce20e49 100644
--- a/lisp/progmodes/sh-script.el
+++ b/lisp/progmodes/sh-script.el
@@ -1589,9 +1589,9 @@ sh-mode
;; Tree-sitter. If the shell is bash, we can enable tree-sitter.
((treesit-ready-p sh-shell)
(setq-local treesit-font-lock-feature-list
- '((comment function string heredoc)
- (variable keyword command declaration-command)
- (constant operator builtin-variable)))
+ '((comment function heredoc string)
+ (command declaration-command keyword variable)
+ (builtin-variable constant number operator)))
(setq-local treesit-font-lock-settings
sh-mode--treesit-settings)
(treesit-major-mode-setup))
@@ -3306,7 +3306,7 @@ sh-mode--treesit-settings
:feature 'operator
:language 'bash
- `([ ,@sh-mode--treesit-operators ] @font-lock-builtin-face)
+ `([,@sh-mode--treesit-operators] @font-lock-operator-face)
:feature 'builtin-variable
:language 'bash
@@ -3316,7 +3316,12 @@ sh-mode--treesit-settings
`(seq bol
(or ,@builtin-vars)
eol)))
- @font-lock-builtin-face))))
+ @font-lock-builtin-face)))
+
+ :feature 'number
+ :language 'bash
+ `(((word) @font-lock-number-face
+ (:match "^[0-9]+$" @font-lock-number-face))))
"Tree-sitter font-lock settings for `sh-mode'.")
(provide 'sh-script)
diff --git a/lisp/progmodes/ts-mode.el b/lisp/progmodes/ts-mode.el
index 01719a89ee..35275d501d 100644
--- a/lisp/progmodes/ts-mode.el
+++ b/lisp/progmodes/ts-mode.el
@@ -101,6 +101,13 @@ ts-mode--keywords
"while" "with" "yield")
"TypeScript keywords for tree-sitter font-locking.")
+(defvar ts-mode--operators
+ '("=" "+=" "-=" "*=" "/=" "%=" "**=" "<<=" ">>=" ">>>=" "&=" "^="
+ "|=" "&&=" "||=" "??=" "==" "!=" "===" "!==" ">" ">=" "<" "<=" "+"
+ "-" "*" "/" "%" "++" "--" "**" "&" "|" "^" "~" "<<" ">>" ">>>"
+ "&&" "||" "!" "?.")
+ "TypeScript operators for tree-sitter font-locking.")
+
(defvar ts-mode--font-lock-settings
(treesit-font-lock-rules
:language 'tsx
@@ -114,8 +121,7 @@ ts-mode--font-lock-settings
`(((identifier) @font-lock-constant-face
(:match "^[A-Z_][A-Z_\\d]*$" @font-lock-constant-face))
- [(true) (false) (null)] @font-lock-constant-face
- (number) @font-lock-constant-face)
+ [(true) (false) (null)] @font-lock-constant-face)
:language 'tsx
:override t
@@ -207,25 +213,6 @@ ts-mode--font-lock-settings
(member_expression
property: (property_identifier) @font-lock-function-name-face)]))
- :language 'tsx
- :override t
- :feature 'property
- `((pair key: (property_identifier) @font-lock-variable-name-face)
-
- (pair value: (identifier) @font-lock-variable-name-face)
-
- (pair
- key: (property_identifier) @font-lock-function-name-face
- value: [(function) (arrow_function)])
-
- (property_signature
- name: (property_identifier) @font-lock-variable-name-face)
-
- ((shorthand_property_identifier) @font-lock-variable-name-face)
-
- ((shorthand_property_identifier_pattern)
- @font-lock-variable-name-face))
-
:language 'tsx
:override t
:feature 'pattern
@@ -249,7 +236,43 @@ ts-mode--font-lock-settings
[(nested_identifier (identifier)) (identifier)]
@font-lock-function-name-face)
- (jsx_attribute (property_identifier) @font-lock-constant-face)))
+ (jsx_attribute (property_identifier) @font-lock-property-face))
+
+ :language 'tsx
+ :feature 'number
+ `((number) @font-lock-number-face
+ ((identifier) @font-lock-number-face
+ (:match "^\\(:?NaN\\|Infinity\\)$" @font-lock-number-face)))
+
+ :language 'tsx
+ :feature 'operator
+ `([,@ts-mode--operators] @font-lock-operator-face
+ (ternary_expression ["?" ":"] @font-lock-operator-face))
+
+ :language 'tsx
+ :feature 'bracket
+ '(["(" ")" "[" "]" "{" "}"] @font-lock-bracket-face)
+
+ :language 'tsx
+ :feature 'delimiter
+ '(["," "." ";" ":"] @font-lock-delimiter-face)
+
+ :language 'tsx
+ :feature 'escape-sequence
+ :override t
+ '((escape_sequence) @font-lock-escape-face)
+
+ :language 'tsx
+ :override t
+ :feature 'property
+ `(((property_identifier) @font-lock-property-face)
+
+ (pair value: (identifier) @font-lock-property-face)
+
+ ((shorthand_property_identifier) @font-lock-property-face)
+
+ ((shorthand_property_identifier_pattern)
+ @font-lock-property-face)))
"Tree-sitter font-lock settings.")
;;;###autoload
@@ -296,8 +319,8 @@ ts-mode
(setq-local treesit-font-lock-settings ts-mode--font-lock-settings)
(setq-local treesit-font-lock-feature-list
'((comment declaration)
- (string keyword identifier expression constant)
- (property pattern jsx)))
+ (constant expression identifier keyword number string)
+ (bracket delimiter jsx property pattern)))
;; Imenu.
(setq-local imenu-create-index-function #'js--treesit-imenu)
--
2.38.1
next reply other threads:[~2022-11-20 3:42 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-11-20 3:42 Randy Taylor [this message]
2022-11-21 18:52 ` bug#59397: [PATCH] feature/tree-sitter: Utilize new font-lock faces for more tree-sitter backed modes Theodor Thornhill via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-11-21 21:49 ` Yuan Fu
2022-11-22 3:38 ` Randy Taylor
2022-11-22 22:21 ` Randy Taylor
2022-11-23 1:49 ` Yuan Fu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to='ReWNQjT65-ruEkKNyZA21GP5idoODLxqfBwEjj-Sp4lHB2POLeEGCSuUQfpT7euLs8N4b2HszCnAv_w8ZNK5JRNUebZzXdJYCXe5Hzz3028=@rjt.dev' \
--to=dev@rjt.dev \
--cc=59397@debbugs.gnu.org \
--cc=casouri@gmail.com \
--cc=theo@thornhill.no \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.