* bug#73877: 30; rust-ts-mode: highlight the possible type suffix of number literals @ 2024-10-19 10:56 Christophe TROESTLER 2024-10-20 12:00 ` Stefan Kangas 0 siblings, 1 reply; 6+ messages in thread From: Christophe TROESTLER @ 2024-10-19 10:56 UTC (permalink / raw) To: 73877 [-- Attachment #1: Type: text/plain, Size: 199 bytes --] Hi, In order to make Rust number literals such as 1usize, 1.0_f64,... more legible, the type suffix should be highlighted. The attached patch to rust-ts-mode does that. Best, Christophe [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #2: 0001-rust-ts-mode-highlight-the-possible-type-suffix-of-n.patch --] [-- Type: text/x-diff; name="0001-rust-ts-mode-highlight-the-possible-type-suffix-of-n.patch", Size: 2706 bytes --] From e1cf2f8c59f2abd75688721d08653327c5427da9 Mon Sep 17 00:00:00 2001 From: Christophe Troestler <Christophe.Troestler@umons.ac.be> Date: Fri, 18 Oct 2024 23:50:06 +0200 Subject: [PATCH] rust-ts-mode: highlight the possible type suffix of number literals Content-Type: text/plain; charset="utf-8" --- lisp/progmodes/rust-ts-mode.el | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/lisp/progmodes/rust-ts-mode.el b/lisp/progmodes/rust-ts-mode.el index 571ffa9b220..0454c46261f 100644 --- a/lisp/progmodes/rust-ts-mode.el +++ b/lisp/progmodes/rust-ts-mode.el @@ -116,6 +116,12 @@ rust-ts-mode--indent-rules ((parent-is "use_list") parent-bol rust-ts-mode-indent-offset))) "Tree-sitter indent rules for `rust-ts-mode'.") +(defconst rust-ts-mode--number-types + (regexp-opt '("u8" "i8" "u16" "i16" "u32" "i32" "u64" + "i64" "u128" "i128" "usize" "isize" "f32" "f64")) + "Regexp that matches any suffix on number litterals as documented +at https://doc.rust-lang.org/reference/tokens.html#suffixes") + (defvar rust-ts-mode--builtin-macros '("concat_bytes" "concat_idents" "const_format_args" "format_args_nl" "log_syntax" "trace_macros" "assert" "assert_eq" @@ -221,7 +227,8 @@ rust-ts-mode--font-lock-settings :language 'rust :feature 'number - '([(float_literal) (integer_literal)] @font-lock-number-face) + '([(float_literal) (integer_literal)] + @rust-ts-mode--fontify-number-literal) :language 'rust :feature 'operator @@ -365,6 +372,22 @@ 'rust-ts-mode--fontify-pattern (treesit-node-start id) (treesit-node-end id) 'font-lock-variable-name-face override start end))))))) +(defun rust-ts-mode--fontify-number-literal (node override start stop &rest _) + "Fontify number literals, highlighting the optional type if present" + (let* ((beg (treesit-node-start node)) + (end (treesit-node-end node))) + (save-excursion + (goto-char end) + (if (looking-back rust-ts-mode--number-types beg) + (let* ((ty (match-beginning 0)) + (nb (if (eq (char-before ty) ?_) (1- ty) ty))) + (treesit-fontify-with-override + ty end 'font-lock-type-face override start stop) + (treesit-fontify-with-override + beg nb 'font-lock-number-face override start stop)) + (treesit-fontify-with-override + beg end 'font-lock-number-face override start stop))))) + (defun rust-ts-mode--defun-name (node) "Return the defun name of NODE. Return nil if there is no name or if NODE is not a defun node." -- 2.45.2 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* bug#73877: 30; rust-ts-mode: highlight the possible type suffix of number literals 2024-10-19 10:56 bug#73877: 30; rust-ts-mode: highlight the possible type suffix of number literals Christophe TROESTLER @ 2024-10-20 12:00 ` Stefan Kangas 2024-10-22 23:05 ` Randy Taylor 0 siblings, 1 reply; 6+ messages in thread From: Stefan Kangas @ 2024-10-20 12:00 UTC (permalink / raw) To: Christophe TROESTLER, 73877; +Cc: Randy Taylor Christophe TROESTLER <Christophe.TROESTLER@umons.ac.be> writes: > Hi, > > In order to make Rust number literals such as 1usize, 1.0_f64,... more legible, the type suffix should be highlighted. The attached patch to rust-ts-mode does that. > > Best, > Christophe Thanks. Randy, do you have any comments on the below patch? > From e1cf2f8c59f2abd75688721d08653327c5427da9 Mon Sep 17 00:00:00 2001 > From: Christophe Troestler <Christophe.Troestler@umons.ac.be> > Date: Fri, 18 Oct 2024 23:50:06 +0200 > Subject: [PATCH] rust-ts-mode: highlight the possible type suffix of number > literals > Content-Type: text/plain; charset="utf-8" > > --- > lisp/progmodes/rust-ts-mode.el | 25 ++++++++++++++++++++++++- > 1 file changed, 24 insertions(+), 1 deletion(-) > > diff --git a/lisp/progmodes/rust-ts-mode.el b/lisp/progmodes/rust-ts-mode.el > index 571ffa9b220..0454c46261f 100644 > --- a/lisp/progmodes/rust-ts-mode.el > +++ b/lisp/progmodes/rust-ts-mode.el > @@ -116,6 +116,12 @@ rust-ts-mode--indent-rules > ((parent-is "use_list") parent-bol rust-ts-mode-indent-offset))) > "Tree-sitter indent rules for `rust-ts-mode'.") > > +(defconst rust-ts-mode--number-types > + (regexp-opt '("u8" "i8" "u16" "i16" "u32" "i32" "u64" > + "i64" "u128" "i128" "usize" "isize" "f32" "f64")) > + "Regexp that matches any suffix on number litterals as documented > +at https://doc.rust-lang.org/reference/tokens.html#suffixes") > + > (defvar rust-ts-mode--builtin-macros > '("concat_bytes" "concat_idents" "const_format_args" > "format_args_nl" "log_syntax" "trace_macros" "assert" "assert_eq" > @@ -221,7 +227,8 @@ rust-ts-mode--font-lock-settings > > :language 'rust > :feature 'number > - '([(float_literal) (integer_literal)] @font-lock-number-face) > + '([(float_literal) (integer_literal)] > + @rust-ts-mode--fontify-number-literal) > > :language 'rust > :feature 'operator > @@ -365,6 +372,22 @@ 'rust-ts-mode--fontify-pattern > (treesit-node-start id) (treesit-node-end id) > 'font-lock-variable-name-face override start end))))))) > > +(defun rust-ts-mode--fontify-number-literal (node override start stop &rest _) > + "Fontify number literals, highlighting the optional type if present" > + (let* ((beg (treesit-node-start node)) > + (end (treesit-node-end node))) > + (save-excursion > + (goto-char end) > + (if (looking-back rust-ts-mode--number-types beg) > + (let* ((ty (match-beginning 0)) > + (nb (if (eq (char-before ty) ?_) (1- ty) ty))) > + (treesit-fontify-with-override > + ty end 'font-lock-type-face override start stop) > + (treesit-fontify-with-override > + beg nb 'font-lock-number-face override start stop)) > + (treesit-fontify-with-override > + beg end 'font-lock-number-face override start stop))))) > + > (defun rust-ts-mode--defun-name (node) > "Return the defun name of NODE. > Return nil if there is no name or if NODE is not a defun node." > -- > 2.45.2 ^ permalink raw reply [flat|nested] 6+ messages in thread
* bug#73877: 30; rust-ts-mode: highlight the possible type suffix of number literals 2024-10-20 12:00 ` Stefan Kangas @ 2024-10-22 23:05 ` Randy Taylor 2024-10-24 15:22 ` Christophe TROESTLER 0 siblings, 1 reply; 6+ messages in thread From: Randy Taylor @ 2024-10-22 23:05 UTC (permalink / raw) To: Christophe TROESTLER; +Cc: 73877, Stefan Kangas > Christophe TROESTLER Christophe.TROESTLER@umons.ac.be writes: > > > Hi, > > > > In order to make Rust number literals such as 1usize, 1.0_f64,... more legible, the type suffix should be highlighted. The attached patch to rust-ts-mode does that. > > > > Best, > > Christophe Thanks for working on this Christophe. I think this will need to be gated behind a variable which should retain the existing behaviour by default. Would you also be able to add some tests for this? You can see how the font-lock tests are done in the test/lisp/progmodes/rust-ts-mode-tests.el file, and add some to the rust-ts-mode-resources/font-lock.rs file. We might need a new file for this one, actually, since we'd want to test both cases. I have some comments below: + "Regexp that matches any suffix on number litterals as documented ^ literals +at https://doc.rust-lang.org/reference/tokens.html#suffixes") Add a period at the end. + "Fontify number literals, highlighting the optional type if present" Add a period at the end. We may also want to say something like: "highlighting the optional type based on the value of `name-of-the-variable'." once the variable to control it is added. ^ permalink raw reply [flat|nested] 6+ messages in thread
* bug#73877: 30; rust-ts-mode: highlight the possible type suffix of number literals 2024-10-22 23:05 ` Randy Taylor @ 2024-10-24 15:22 ` Christophe TROESTLER 2024-10-27 19:07 ` Randy Taylor 0 siblings, 1 reply; 6+ messages in thread From: Christophe TROESTLER @ 2024-10-24 15:22 UTC (permalink / raw) To: Randy Taylor; +Cc: 73877@debbugs.gnu.org, Stefan Kangas [-- Attachment #1: Type: text/plain, Size: 406 bytes --] Hi, Thanks for your comments. Here is an updated patch (against emacs-30, let me know if you would prefer the emacs-29 branch). Best, C. On 23 October 2024 at 01:05 +02, Randy Taylor <dev@rjt.dev> wrote: > […] I think this will need to be gated behind a variable which should > retain the existing behaviour by default. > > Would you also be able to add some tests for this? […] [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #2: 0001-rust-ts-mode-highlight-the-possible-type-suffix-of-n.patch --] [-- Type: text/x-diff; name="0001-rust-ts-mode-highlight-the-possible-type-suffix-of-n.patch", Size: 6559 bytes --] From a1b54f1074c6568a4aaa8c168a2e2639cdd9907c Mon Sep 17 00:00:00 2001 From: Christophe Troestler <Christophe.Troestler@umons.ac.be> Date: Fri, 18 Oct 2024 23:50:06 +0200 Subject: [PATCH] rust-ts-mode: highlight the possible type suffix of number literals Content-Type: text/plain; charset="utf-8" --- lisp/progmodes/rust-ts-mode.el | 35 ++++++++++++++++++- .../font-lock-number.rs | 18 ++++++++++ .../rust-ts-mode-resources/font-lock.rs | 18 ++++++++++ test/lisp/progmodes/rust-ts-mode-tests.el | 13 +++++-- 4 files changed, 81 insertions(+), 3 deletions(-) create mode 100644 test/lisp/progmodes/rust-ts-mode-resources/font-lock-number.rs diff --git a/lisp/progmodes/rust-ts-mode.el b/lisp/progmodes/rust-ts-mode.el index 571ffa9b220..2f8bc9c1586 100644 --- a/lisp/progmodes/rust-ts-mode.el +++ b/lisp/progmodes/rust-ts-mode.el @@ -62,6 +62,14 @@ rust-ts-flymake-command (repeat :tag "Custom command" string)) :group 'rust) +(defcustom rust-ts-mode-highlight-number-literal-type nil + "If non-nil, highlight the optional type suffix of number literals." + :version "30.1" + :type 'boolean + :group 'rust) +(put 'rust-ts-mode-highlight-number-literal-type 'safe-local-variable + 'booleanp) + (defvar rust-ts-mode-prettify-symbols-alist '(("&&" . ?∧) ("||" . ?∨) ("<=" . ?≤) (">=" . ?≥) ("!=" . ?≠) @@ -116,6 +124,12 @@ rust-ts-mode--indent-rules ((parent-is "use_list") parent-bol rust-ts-mode-indent-offset))) "Tree-sitter indent rules for `rust-ts-mode'.") +(defconst rust-ts-mode--number-types + (regexp-opt '("u8" "i8" "u16" "i16" "u32" "i32" "u64" + "i64" "u128" "i128" "usize" "isize" "f32" "f64")) + "Regexp that matches any suffix on number literals as documented +at https://doc.rust-lang.org/reference/tokens.html#suffixes.") + (defvar rust-ts-mode--builtin-macros '("concat_bytes" "concat_idents" "const_format_args" "format_args_nl" "log_syntax" "trace_macros" "assert" "assert_eq" @@ -221,7 +235,8 @@ rust-ts-mode--font-lock-settings :language 'rust :feature 'number - '([(float_literal) (integer_literal)] @font-lock-number-face) + '([(float_literal) (integer_literal)] + @rust-ts-mode--fontify-number-literal) :language 'rust :feature 'operator @@ -365,6 +380,24 @@ 'rust-ts-mode--fontify-pattern (treesit-node-start id) (treesit-node-end id) 'font-lock-variable-name-face override start end))))))) +(defun rust-ts-mode--fontify-number-literal (node override start stop &rest _) + "Fontify number literals, highlighting the optional type based on the +value of `rust-ts-mode-highlight-number-literal-type'." + (let* ((beg (treesit-node-start node)) + (end (treesit-node-end node))) + (save-excursion + (goto-char end) + (if (and rust-ts-mode-highlight-number-literal-type + (looking-back rust-ts-mode--number-types beg)) + (let* ((ty (match-beginning 0)) + (nb (if (eq (char-before ty) ?_) (1- ty) ty))) + (treesit-fontify-with-override + ty end 'font-lock-type-face override start stop) + (treesit-fontify-with-override + beg nb 'font-lock-number-face override start stop)) + (treesit-fontify-with-override + beg end 'font-lock-number-face override start stop))))) + (defun rust-ts-mode--defun-name (node) "Return the defun name of NODE. Return nil if there is no name or if NODE is not a defun node." diff --git a/test/lisp/progmodes/rust-ts-mode-resources/font-lock-number.rs b/test/lisp/progmodes/rust-ts-mode-resources/font-lock-number.rs new file mode 100644 index 00000000000..1c9a38bd683 --- /dev/null +++ b/test/lisp/progmodes/rust-ts-mode-resources/font-lock-number.rs @@ -0,0 +1,18 @@ + +fn main() { + let x = 1usize; +// ^ font-lock-number-face +// ^ font-lock-type-face + let x = 1_usize; +// ^ font-lock-number-face +// ^ font-lock-type-face + let x = 1_f64; +// ^ font-lock-number-face +// ^ font-lock-type-face + let x = 1.0f64; +// ^ font-lock-number-face +// ^ font-lock-type-face + let x = 1.0_f64; +// ^ font-lock-number-face +// ^ font-lock-type-face +} diff --git a/test/lisp/progmodes/rust-ts-mode-resources/font-lock.rs b/test/lisp/progmodes/rust-ts-mode-resources/font-lock.rs index 377cda0e3b9..1f549085e3f 100644 --- a/test/lisp/progmodes/rust-ts-mode-resources/font-lock.rs +++ b/test/lisp/progmodes/rust-ts-mode-resources/font-lock.rs @@ -23,3 +23,21 @@ macro_rules! unsafe_foo { // ^ font-lock-operator-face } }; + +fn main() { + let x = 1usize; +// ^ font-lock-number-face +// ^ font-lock-number-face + let x = 1_usize; +// ^ font-lock-number-face +// ^ font-lock-number-face + let x = 1_f64; +// ^ font-lock-number-face +// ^ font-lock-number-face + let x = 1.0f64; +// ^ font-lock-number-face +// ^ font-lock-number-face + let x = 1.0_f64; +// ^ font-lock-number-face +// ^ font-lock-number-face +} diff --git a/test/lisp/progmodes/rust-ts-mode-tests.el b/test/lisp/progmodes/rust-ts-mode-tests.el index f718a57fc9e..95ca4a32afd 100644 --- a/test/lisp/progmodes/rust-ts-mode-tests.el +++ b/test/lisp/progmodes/rust-ts-mode-tests.el @@ -26,8 +26,17 @@ (ert-deftest rust-ts-test-font-lock () (skip-unless (treesit-ready-p 'rust)) - (let ((treesit-font-lock-level 4)) - (ert-font-lock-test-file (ert-resource-file "font-lock.rs") 'rust-ts-mode))) + (let ((treesit-font-lock-level 4) + (h rust-ts-mode-highlight-number-literal-type)) + (setq rust-ts-mode-highlight-number-literal-type nil) + (ert-font-lock-test-file (ert-resource-file "font-lock.rs") 'rust-ts-mode) + (setq rust-ts-mode-highlight-number-literal-type h)) + (let ((treesit-font-lock-level 4) + (h rust-ts-mode-highlight-number-literal-type)) + (setq rust-ts-mode-highlight-number-literal-type t) + (ert-font-lock-test-file (ert-resource-file "font-lock-number.rs") + 'rust-ts-mode) + (setq rust-ts-mode-highlight-number-literal-type h))) (provide 'rust-ts-mode-tests) -- 2.45.2 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* bug#73877: 30; rust-ts-mode: highlight the possible type suffix of number literals 2024-10-24 15:22 ` Christophe TROESTLER @ 2024-10-27 19:07 ` Randy Taylor 2024-10-28 21:56 ` Christophe TROESTLER 0 siblings, 1 reply; 6+ messages in thread From: Randy Taylor @ 2024-10-27 19:07 UTC (permalink / raw) To: Christophe TROESTLER; +Cc: 73877@debbugs.gnu.org, Stefan Kangas On Thursday, October 24th, 2024 at 11:22, Christophe TROESTLER <Christophe.TROESTLER@umons.ac.be> wrote: > > > Hi, > > Thanks for your comments. Here is an updated patch (against emacs-30, let me know if you would prefer the emacs-29 branch). > > Best, > C. Thanks Christophe. This should be against the master branch. It will need a commit message (see the CONTRIBUTE file) and a NEWS entry. +(defcustom rust-ts-mode-highlight-number-literal-type nil I'm unsure about this name since it's a little misleading. The type is still highlighted if this is nil, but the same as the number. I don't really have a better suggestion though, and anything else would be longer and probably a little unruly. I was thinking about rust-ts-mode-highlight-number-literal-type-separately but... Maybe we drop the literal part? Does anyone else have any thoughts/suggestions? + :version "30.1" Should be "31.1". For rust-ts-test-font-lock, I'm wondering if we should split that up to a new ert-deftest. If we have more customizations in the future we'd probably end up doing that anyway. Also, I'm not sure we need to bother resetting the rust-ts-mode-highlight-number-literal-type variable. ^ permalink raw reply [flat|nested] 6+ messages in thread
* bug#73877: 30; rust-ts-mode: highlight the possible type suffix of number literals 2024-10-27 19:07 ` Randy Taylor @ 2024-10-28 21:56 ` Christophe TROESTLER 0 siblings, 0 replies; 6+ messages in thread From: Christophe TROESTLER @ 2024-10-28 21:56 UTC (permalink / raw) To: Randy Taylor; +Cc: 73877@debbugs.gnu.org, Stefan Kangas [-- Attachment #1: Type: text/plain, Size: 1398 bytes --] Hi, Here is an updated patch that (hopefully) addresses all of your remarks except the last one: when executing the tests interactively in the instance of Emacs one works with, it is good IMHO that global variables are not changed under our feet. That being said, it is not a strong opinion and I can remove the reset if you wish. Best, C. On 27 October 2024 at 20:07 +01, Randy Taylor <dev@rjt.dev> wrote: > […] This should be against the master branch. > > It will need a commit message (see the CONTRIBUTE file) and a NEWS entry. > > +(defcustom rust-ts-mode-highlight-number-literal-type nil > I'm unsure about this name since it's a little misleading. The type > is still highlighted if this is nil, but the same as the number. > I don't really have a better suggestion though, and anything else > would be longer and probably a little unruly. I was thinking about > rust-ts-mode-highlight-number-literal-type-separately but... > > Maybe we drop the literal part? > > Does anyone else have any thoughts/suggestions? > > + :version "30.1" > Should be "31.1". > > For rust-ts-test-font-lock, I'm wondering if we should split that up to > a new ert-deftest. If we have more customizations in the future we'd > probably end up doing that anyway. > Also, I'm not sure we need to bother resetting the > rust-ts-mode-highlight-number-literal-type variable. [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #2: 0001-Rust-ts-fontify-as-type-the-possible-suffix-of-numbe.patch --] [-- Type: text/x-diff; name="0001-Rust-ts-fontify-as-type-the-possible-suffix-of-numbe.patch", Size: 7730 bytes --] From a2aa35a72a11387db8f0784de1e832220c187966 Mon Sep 17 00:00:00 2001 From: Christophe Troestler <Christophe.Troestler@umons.ac.be> Date: Fri, 18 Oct 2024 23:50:06 +0200 Subject: [PATCH] Rust ts: fontify as type the possible suffix of number literals Content-Type: text/plain; charset="utf-8" * lisp/progmodes/rust-ts-mode.el (rust-ts-mode--fontify-number-literal): perform the improved fontification of numbers. * test/lisp/progmodes/rust-ts-mode-tests.el: * test/lisp/progmodes/rust-ts-mode-resources/font-lock.rs: * test/lisp/progmodes/rust-ts-mode-resources/font-lock-number.rs: Add tests for the new optional fontification of the possible type suffix of numbers. --- etc/NEWS | 7 ++++ lisp/progmodes/rust-ts-mode.el | 36 ++++++++++++++++++- .../font-lock-number.rs | 18 ++++++++++ .../rust-ts-mode-resources/font-lock.rs | 18 ++++++++++ test/lisp/progmodes/rust-ts-mode-tests.el | 16 +++++++-- 5 files changed, 92 insertions(+), 3 deletions(-) create mode 100644 test/lisp/progmodes/rust-ts-mode-resources/font-lock-number.rs diff --git a/etc/NEWS b/etc/NEWS index d1c7303f976..4a987f11f4b 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -630,6 +630,13 @@ cloning, or prompts for that, too. When the argument is non-nil, the function switches to a buffer visiting the directory into which the repository was cloned. +** Rust-ts mode + +--- +*** New user option 'rust-ts-mode-fontify-number-suffix-as-type'. +Rust number literals may have an optional type suffix. When this option +is non-nil, this suffix is fontified as a type. + \f * New Modes and Packages in Emacs 31.1 diff --git a/lisp/progmodes/rust-ts-mode.el b/lisp/progmodes/rust-ts-mode.el index e52ea3b125a..4314fa9aeed 100644 --- a/lisp/progmodes/rust-ts-mode.el +++ b/lisp/progmodes/rust-ts-mode.el @@ -62,6 +62,15 @@ rust-ts-flymake-command (repeat :tag "Custom command" string)) :group 'rust) +(defcustom rust-ts-mode-fontify-number-suffix-as-type nil + "If non-nil, fontify the optional type suffix of number literals with +`font-lock-type-face' instead of `font-lock-number-face'." + :version "31.1" + :type 'boolean + :group 'rust) +(put 'rust-ts-mode-fontify-number-suffix-as-type 'safe-local-variable + 'booleanp) + (defvar rust-ts-mode-prettify-symbols-alist '(("&&" . ?∧) ("||" . ?∨) ("<=" . ?≤) (">=" . ?≥) ("!=" . ?≠) @@ -116,6 +125,12 @@ rust-ts-mode--indent-rules ((parent-is "use_list") parent-bol rust-ts-mode-indent-offset))) "Tree-sitter indent rules for `rust-ts-mode'.") +(defconst rust-ts-mode--number-types + (regexp-opt '("u8" "i8" "u16" "i16" "u32" "i32" "u64" + "i64" "u128" "i128" "usize" "isize" "f32" "f64")) + "Regexp that matches any suffix on number literals as documented +at https://doc.rust-lang.org/reference/tokens.html#suffixes.") + (defvar rust-ts-mode--builtin-macros '("concat_bytes" "concat_idents" "const_format_args" "format_args_nl" "log_syntax" "trace_macros" "assert" "assert_eq" @@ -221,7 +236,8 @@ rust-ts-mode--font-lock-settings :language 'rust :feature 'number - '([(float_literal) (integer_literal)] @font-lock-number-face) + '([(float_literal) (integer_literal)] + @rust-ts-mode--fontify-number-literal) :language 'rust :feature 'operator @@ -369,6 +385,24 @@ 'rust-ts-mode--fontify-pattern (treesit-node-start id) (treesit-node-end id) 'font-lock-variable-name-face override start end))))))) +(defun rust-ts-mode--fontify-number-literal (node override start stop &rest _) + "Fontify number literals, highlighting the optional suffix as a type +based on the value of `rust-ts-mode-highlight-number-literal-type'." + (let* ((beg (treesit-node-start node)) + (end (treesit-node-end node))) + (save-excursion + (goto-char end) + (if (and rust-ts-mode-fontify-number-suffix-as-type + (looking-back rust-ts-mode--number-types beg)) + (let* ((ty (match-beginning 0)) + (nb (if (eq (char-before ty) ?_) (1- ty) ty))) + (treesit-fontify-with-override + ty end 'font-lock-type-face override start stop) + (treesit-fontify-with-override + beg nb 'font-lock-number-face override start stop)) + (treesit-fontify-with-override + beg end 'font-lock-number-face override start stop))))) + (defun rust-ts-mode--defun-name (node) "Return the defun name of NODE. Return nil if there is no name or if NODE is not a defun node." diff --git a/test/lisp/progmodes/rust-ts-mode-resources/font-lock-number.rs b/test/lisp/progmodes/rust-ts-mode-resources/font-lock-number.rs new file mode 100644 index 00000000000..1c9a38bd683 --- /dev/null +++ b/test/lisp/progmodes/rust-ts-mode-resources/font-lock-number.rs @@ -0,0 +1,18 @@ + +fn main() { + let x = 1usize; +// ^ font-lock-number-face +// ^ font-lock-type-face + let x = 1_usize; +// ^ font-lock-number-face +// ^ font-lock-type-face + let x = 1_f64; +// ^ font-lock-number-face +// ^ font-lock-type-face + let x = 1.0f64; +// ^ font-lock-number-face +// ^ font-lock-type-face + let x = 1.0_f64; +// ^ font-lock-number-face +// ^ font-lock-type-face +} diff --git a/test/lisp/progmodes/rust-ts-mode-resources/font-lock.rs b/test/lisp/progmodes/rust-ts-mode-resources/font-lock.rs index 377cda0e3b9..1f549085e3f 100644 --- a/test/lisp/progmodes/rust-ts-mode-resources/font-lock.rs +++ b/test/lisp/progmodes/rust-ts-mode-resources/font-lock.rs @@ -23,3 +23,21 @@ macro_rules! unsafe_foo { // ^ font-lock-operator-face } }; + +fn main() { + let x = 1usize; +// ^ font-lock-number-face +// ^ font-lock-number-face + let x = 1_usize; +// ^ font-lock-number-face +// ^ font-lock-number-face + let x = 1_f64; +// ^ font-lock-number-face +// ^ font-lock-number-face + let x = 1.0f64; +// ^ font-lock-number-face +// ^ font-lock-number-face + let x = 1.0_f64; +// ^ font-lock-number-face +// ^ font-lock-number-face +} diff --git a/test/lisp/progmodes/rust-ts-mode-tests.el b/test/lisp/progmodes/rust-ts-mode-tests.el index f718a57fc9e..fe82ce7ad7e 100644 --- a/test/lisp/progmodes/rust-ts-mode-tests.el +++ b/test/lisp/progmodes/rust-ts-mode-tests.el @@ -26,8 +26,20 @@ (ert-deftest rust-ts-test-font-lock () (skip-unless (treesit-ready-p 'rust)) - (let ((treesit-font-lock-level 4)) - (ert-font-lock-test-file (ert-resource-file "font-lock.rs") 'rust-ts-mode))) + (let ((treesit-font-lock-level 4) + (h rust-ts-mode-fontify-number-suffix-as-type)) + (setq rust-ts-mode-fontify-number-suffix-as-type nil) + (ert-font-lock-test-file (ert-resource-file "font-lock.rs") 'rust-ts-mode) + (setq rust-ts-mode-fontify-number-suffix-as-type h))) + +(ert-deftest rust-ts-test-font-lock-number () + (skip-unless (treesit-ready-p 'rust)) + (let ((treesit-font-lock-level 4) + (h rust-ts-mode-fontify-number-suffix-as-type)) + (setq rust-ts-mode-fontify-number-suffix-as-type t) + (ert-font-lock-test-file (ert-resource-file "font-lock-number.rs") + 'rust-ts-mode) + (setq rust-ts-mode-fontify-number-suffix-as-type h))) (provide 'rust-ts-mode-tests) -- 2.45.2 ^ permalink raw reply related [flat|nested] 6+ messages in thread
end of thread, other threads:[~2024-10-28 21:56 UTC | newest] Thread overview: 6+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2024-10-19 10:56 bug#73877: 30; rust-ts-mode: highlight the possible type suffix of number literals Christophe TROESTLER 2024-10-20 12:00 ` Stefan Kangas 2024-10-22 23:05 ` Randy Taylor 2024-10-24 15:22 ` Christophe TROESTLER 2024-10-27 19:07 ` Randy Taylor 2024-10-28 21:56 ` Christophe TROESTLER
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.