unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
* 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; 9+ 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] 9+ 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; 9+ 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] 9+ 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; 9+ 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] 9+ 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; 9+ 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] 9+ 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; 9+ 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] 9+ 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
  2024-11-02 11:01           ` Eli Zaretskii
  2024-11-02 19:48           ` Randy Taylor
  0 siblings, 2 replies; 9+ 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] 9+ messages in thread

* bug#73877: 30; rust-ts-mode: highlight the possible type suffix of number literals
  2024-10-28 21:56         ` Christophe TROESTLER
@ 2024-11-02 11:01           ` Eli Zaretskii
  2024-11-02 19:48           ` Randy Taylor
  1 sibling, 0 replies; 9+ messages in thread
From: Eli Zaretskii @ 2024-11-02 11:01 UTC (permalink / raw)
  To: Christophe TROESTLER; +Cc: dev, 73877, stefankangas

> Cc: "73877@debbugs.gnu.org" <73877@debbugs.gnu.org>,
>  Stefan Kangas <stefankangas@gmail.com>
> From: Christophe TROESTLER <Christophe.TROESTLER@umons.ac.be>
> Date: Mon, 28 Oct 2024 21:56:52 +0000
> 
> 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.

Thanks, a few more nits to be fixed:

> * lisp/progmodes/rust-ts-mode.el (rust-ts-mode--fontify-number-literal):
> perform the improved fontification of numbers.

The description should start with a capital letter.

Also, please mention the bug number somewhere in the log message.

> +---
> +*** 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.
                                        ^^^^^^^^^
I think "using the 'font-lock-type-face'" is a more clear description
than "as a type".

> +(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'."

The first line of a doc string should be a single complete sentence.
So please make it a summary of what this option does, and describe the
details in the subsequent sentences.

> +(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.")

Same here.

> +(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'."

And here.





^ permalink raw reply	[flat|nested] 9+ messages in thread

* bug#73877: 30; rust-ts-mode: highlight the possible type suffix of number literals
  2024-10-28 21:56         ` Christophe TROESTLER
  2024-11-02 11:01           ` Eli Zaretskii
@ 2024-11-02 19:48           ` Randy Taylor
  2024-11-11 12:32             ` Christophe TROESTLER
  1 sibling, 1 reply; 9+ messages in thread
From: Randy Taylor @ 2024-11-02 19:48 UTC (permalink / raw)
  To: Christophe TROESTLER; +Cc: Eli Zaretskii, 73877@debbugs.gnu.org, Stefan Kangas

On Monday, October 28th, 2024 at 17:56, Christophe TROESTLER <Christophe.TROESTLER@umons.ac.be> wrote:
> 
> 
> Hi,
> 
> Here is an updated patch that (hopefully) addresses all of your remarks except the last one

Sorry for the delay.

The patch looks good to me with Eli's points addressed (thanks Eli for
taking a look) and the below addressed.

>...: 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.

Unless I am missing something, the variables should reset automatically.
They are only changed in the context of the test.

How are you running them that you are seeing otherwise?

> 
> Best,
> C.
>





^ permalink raw reply	[flat|nested] 9+ messages in thread

* bug#73877: 30; rust-ts-mode: highlight the possible type suffix of number literals
  2024-11-02 19:48           ` Randy Taylor
@ 2024-11-11 12:32             ` Christophe TROESTLER
  0 siblings, 0 replies; 9+ messages in thread
From: Christophe TROESTLER @ 2024-11-11 12:32 UTC (permalink / raw)
  To: Randy Taylor; +Cc: Eli Zaretskii, 73877@debbugs.gnu.org, Stefan Kangas

[-- Attachment #1: Type: text/plain, Size: 576 bytes --]


Thanks Eli Zaretskii and Randy Taylor for your remarks.  An undated patch is attached.

On  2 November 2024 at 20:48 +01, Randy Taylor <dev@rjt.dev> wrote:
> […] Unless I am missing something, the variables should reset
> automatically.  They are only changed in the context of the test.
>
> How are you running them that you are seeing otherwise?

I now am using the command line but, if I evaluate the tests (C-xC-e) and then run them with M-x ert, the variable 'rust-ts-mode-fontify-number-suffix-as-type' is not reset to its original value.

Best,
C.


[-- 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: 7675 bytes --]

From be22fcf187ccea26706f832ca768d3f8c15e0bfd 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.  (Bug#73877)
* 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                | 39 ++++++++++++++++++-
 .../font-lock-number.rs                       | 18 +++++++++
 .../rust-ts-mode-resources/font-lock.rs       | 18 +++++++++
 test/lisp/progmodes/rust-ts-mode-tests.el     | 11 +++++-
 5 files changed, 91 insertions(+), 2 deletions(-)
 create mode 100644 test/lisp/progmodes/rust-ts-mode-resources/font-lock-number.rs

diff --git a/etc/NEWS b/etc/NEWS
index e63132efeda..1b7d2cb95b4 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -683,6 +683,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 using the 'font-lock-type-face'.
+
 \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..7e0ed65974b 100644
--- a/lisp/progmodes/rust-ts-mode.el
+++ b/lisp/progmodes/rust-ts-mode.el
@@ -62,6 +62,17 @@ rust-ts-flymake-command
                  (repeat :tag "Custom command" string))
   :group 'rust)
 
+(defcustom rust-ts-mode-fontify-number-suffix-as-type nil
+  "If non-nil, suffixes of number literals are fontified as types.
+In Rust, number literals can possess an optional type suffix.  When this
+variable is non-nil, these suffixes are fontified using
+`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 +127,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 matching type suffixes of number literals.
+See 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 +238,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 +387,25 @@ '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 suffix.
+If `rust-ts-mode-fontify-number-suffix-as-type' is non-nil, use
+`font-lock-type-face' to highlight the suffix."
+  (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..6fad11a4ca4 100644
--- a/test/lisp/progmodes/rust-ts-mode-tests.el
+++ b/test/lisp/progmodes/rust-ts-mode-tests.el
@@ -27,7 +27,16 @@
 (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)))
+    (setq rust-ts-mode-fontify-number-suffix-as-type nil)
+    (ert-font-lock-test-file (ert-resource-file "font-lock.rs")
+                             'rust-ts-mode)))
+
+(ert-deftest rust-ts-test-font-lock-number ()
+  (skip-unless (treesit-ready-p 'rust))
+  (let ((treesit-font-lock-level 4))
+    (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)))
 
 (provide 'rust-ts-mode-tests)
 
-- 
2.45.2


^ permalink raw reply related	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2024-11-11 12:32 UTC | newest]

Thread overview: 9+ 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
2024-11-02 11:01           ` Eli Zaretskii
2024-11-02 19:48           ` Randy Taylor
2024-11-11 12:32             ` Christophe TROESTLER

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).