emacs-devel
[Top][All Lists]
Advanced

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

Re: Standardizing tree-sitter fontification features


From: Yuan Fu
Subject: Re: Standardizing tree-sitter fontification features
Date: Mon, 5 Dec 2022 13:02:24 -0800


> On Dec 5, 2022, at 3:30 AM, Theodor Thornhill <theo@thornhill.no> wrote:
> 
> Mattias Engdegård <mattias.engdegard@gmail.com> writes:
> 
>> 5 dec. 2022 kl. 09.58 skrev Theodor Thornhill <theo@thornhill.no>:
>> 
>>> I agree - but in most tree-sitter languages it seems like there usually
>>> is no distinction between them.  We need to implement some heuristics to
>>> locate a comment above method etc, if I'm not mistaken.
>> 
>> At least distinguish doc comments by their special syntax, such as `--
>> !` or `/**`; it's better than nothing and only requires local
>> analysis. A grammar tie-in to make sure they aren't misplaced is
>> obviously better (and valuable) but it can be a later improvement.
> 
> Sure, but I don't think it's too hard.  We could do something like (on
> emacs-29 branch):
> 
> diff --git a/lisp/progmodes/java-ts-mode.el b/lisp/progmodes/java-ts-mode.el
> index 2c42505ac9..abf67a4c14 100644
> --- a/lisp/progmodes/java-ts-mode.el
> +++ b/lisp/progmodes/java-ts-mode.el
> @@ -123,13 +123,24 @@ java-ts-mode--operators
>     "|=" "~" ">>" ">>>" "<<" "::" "?" "&=")
>   "C operators for tree-sitter font-locking.")
> 
> +(defun java-ts-mode--font-lock-comment (node override start end &rest _)
> +  (when (or (equal (treesit-node-type node) "block_comment")
> +            (equal (treesit-node-type node) "line_comment"))
> +    (let ((face (if (equal (treesit-node-type (treesit-node-next-sibling 
> node))
> +                           "method_declaration")
> +                    'font-lock-doc-face
> +                  'font-lock-comment-face)))
> +      (treesit-fontify-with-override
> +       (treesit-node-start node) (treesit-node-end node)
> +       face override start end))))
> +
> (defvar java-ts-mode--font-lock-settings
>   (treesit-font-lock-rules
>    :language 'java
>    :override t
>    :feature 'comment
> -   `((line_comment) @font-lock-comment-face
> -     (block_comment) @font-lock-comment-face)
> +   `((line_comment) @java-ts-mode--font-lock-comment
> +     (block_comment) @java-ts-mode--font-lock-comment)
>    :language 'java
>    :override t
>    :feature 'constant
> 
> 
> This naive function will work for comments directly above a method.  It
> won't try to fix annotations and do other smartness.  The local analysis
> is actually a little more complex because you need to extract the
> comment text and scan it.  Is a more robust variant of this of interest?

Yeah! Throw in some checks for empty lines and  `-- !` or `/**` (when 
applicable) and it’ll be good to go.

Yuan


reply via email to

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