Subject: bug#69625: 30.0.50; [PATCH] rust-ts-mode doesn't fontify some enum

From: Randy Taylor <[email-masked]>
Date: Sat, 09 Mar 2024 03:50:38 +0000

On Thursday, March 7th, 2024 at 23:43, Yuan Fu <[email-masked]> wrote:
> 
> X-Debug-CC: [email-masked] mailto:[email-masked]

Should be X-Debbugs-CC ;).

> 
> 
> (I lied a little bit about on the [PATCH] part: I have a solution but didn’t turn it into a patch yet.)
> 
> The problem is follows: given the rust code below, some enum are not fontified with type face under font lock level 3, and those enum are fontified as function or variable under font lock level 4.
> 
> fn main() {
> func(MyEnum::VariantA(0));
> func(MyEnum::VariantB);
> func(VariantC);
> func(VariantD(0));
> }
> 
> VariantA and VariantB are fontified correctly, but VariantC and VariantD are not.
> 
> I think a simple rule that fontifies every capitalized identifier would fix this. But I don’t know if that’ll create other problem. AFAIK capitalized identifier is always some type in rust, right?
> 

For VariantA and VariantD, these are constructors being used as functions,
so I think they are technically being highlighted correctly at level 4.
Whether or not that is desired is another question - I think that is simply
a matter of opinion/preference.
VariantA gets highlighted as a type and not a function at level 3 because that
level doesn't support functions, but does support types. Maybe that could be
considered a bug in that it shouldn't be highlighted at all for level 3?
I'm not sure how worth it would be to do something about that though, or how
easy.

For VariantC, our (and tree-sitter's) best guess is that it's a variable.
We can't really know it's a type without guessing - like assuming a capitalized
identifier is a type, and I don't think that's something we can assume. People
can have capitalized functions and variables even if that goes against Rust's
usual style. Perhaps as a compromise we could introduce a variable (or something)
that lets the user specify that all capitalized identifiers should be treated as
types? Maybe it even makes sense to default it to that behaviour since I believe
most Rust code follows that style.

I don't really think this is a tree-sitter problem to solve but more so an LSP one:
tree-sitter can't know that all of these are enums based on how they are used.
As was mentioned in that GitHub thread, LSP with semantic tokens is the way to go
for the most accuracy. But even with semantic tokens, how to highlight enum variants
being used as functions comes down to opinion methinks.

> This is first reported on rust-mode’s GitHub repo: https://github.com/rust-lang/rust-mode/issues/518
> 
> Yuan