unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
From: Vincenzo Pupillo <v.pupillo@gmail.com>
To: Yuan Fu <casouri@gmail.com>
Cc: emacs-devel@gnu.org
Subject: Re: treesit-range-settings with ':local' : I missed something or it's a bug?
Date: Sat, 27 Jan 2024 11:23:04 +0100	[thread overview]
Message-ID: <10408919.nUPlyArG6x@fedora> (raw)
In-Reply-To: <5C4F13B5-3FE3-499E-8F23-8B528AF194B7@gmail.com>


[-- Attachment #1.1: Type: text/plain, Size: 5992 bytes --]

No. I defined a function for "treesit-language-at", which works correctly 
without tree-sitter-phodoc parser (the version without phpdoc is here https://
github.com/vpxyz/php-ts-mode)
I find two problems: 
1. treesit-range-rules does not reset the variable "local" at the end of pcase 
as it does with "host", "embed" and "offset". If there is a parser with the 
:local attribute, all parsers defined after it are marked as :local 
Without fix: 
treesit-range-settings is a variable defined in ‘~/Projects/Emacs/php-ts-mode/
treesit.el’.

Its value is
((#<treesit-compiled-query> phpdoc t nil)
 (#<treesit-compiled-query> html t nil)
 (#<treesit-compiled-query> javascript t (1 . -1))
 (#<treesit-compiled-query> css t (1 . -1)))
Local in buffer index4.php; global value is nil

with fix:
treesit-range-settings is a variable defined in ‘~/Projects/Emacs/php-ts-mode/
treesit.el’.

Its value is
((#<treesit-compiled-query> phpdoc t nil)
 (#<treesit-compiled-query> html nil nil)
 (#<treesit-compiled-query> javascript nil (1 . -1))
 (#<treesit-compiled-query> css nil (1 . -1)))
Local in buffer index4.php; global value is nil

2.  treesit-font-lock-fontify-region: the variable "global-parser" is set with 
all parsers defined, including local parsers. As result the root-nodes 
variable, without fix are ("document node" is  a phpdoc node): 
root-nodes (#<treesit-node document in 517-621> #<treesit-node document in 
672-810> #<treesit-node program in 1-1057> #<treesit-node program in 79-138> 
#<treesit-node stylesheet in 167-223> #<treesit-node fragment in 1-271> 
#<treesit-node document in 1-1057>)

with fix:  
root-nodes (#<treesit-node document in 517-621> #<treesit-node document in 
672-810> #<treesit-node program in 1-1057> #<treesit-node program in 79-138> 
#<treesit-node stylesheet in 167-223> #<treesit-node fragment in 1-271>)
 
you can see the difference in the attached screenshots.
The patch I wrote is not a solution (it's trivial) . I think there are other 
"moving parts" to take into account.

Thanks.


In data sabato 27 gennaio 2024 05:32:02 CET, Yuan Fu ha scritto:
> > On Jan 11, 2024, at 3:15 AM, Vincenzo Pupillo <v.pupillo@gmail.com> wrote:
> > 
> > Hi,
> > in the php-ts-mode I am writing, I am trying to use the tree-sitter-phpdoc
> > parser (I had tried before but without success, and I currently use a
> > font block based on regular expressions).
> > tree-sitter-phpdoc requires a single doc block (a single /** */ doc block
> > and nothing else, no /* */ or #). I wrote these range rules:
> > (setq-local treesit-range-settings
> > 
> >      (treesit-range-rules
> >      
> >       :embed 'phpdoc
> >       :host 'php
> >       :local t
> >       
> >       '(((comment) @cap
> > 
> > (:match "/\\*\\*" @cap)))
> > 
> >       :embed 'html
> >       :host 'php
> >       
> >       '((program (text) @cap)
> > 
> > (text_interpolation (text) @cap))
> > 
> >       :embed 'javascript
> >       :host 'html
> >       :offset '(1 . -1)
> >       
> >       '((script_element
> >  
> >  (start_tag (tag_name))
> >  (raw_text) @cap))
> >  
> >       :embed 'css
> >       :host 'html
> >       :offset '(1 . -1)
> >       
> >       '((style_element
> >  
> >  (start_tag (tag_name))
> >  (raw_text) @cap))))
> > 
> > With html, js and css it works fine. With phpdoc I tried with or without
> > :local. Without :local the parse intervals are all null. Without :local
> > on the other hand they are correct. With this simple php snippet:
> > <?php
> > 
> > /**
> > * Test class
> > * @author v <v.pupillo@gmail.com>
> > */
> > class Test {
> > 
> >    /** @see http://example.com the lib */
> >    function test() {
> > 
> > echo "prova";
> > 
> >    }
> > 
> > }
> > 
> > Without :local the field rules are:
> > ((#<treesit-parser for phpdoc> ((1 . 1) (8 . 64) (82 . 120))) (#<treesit-
> > parser for html> ((1 . 1) (1 . 2))) (#<treesit-parser for css> ((1 . 1)))
> > (#<treesit-parser for javascript> ((1 . 1))) (#<treesit-parser for php>
> > nil))
> > 
> > With :local the result is:
> > ((#<treesit-parser for phpdoc> nil) (#<treesit-parser for html> nil)
> > (#<treesit-parser for css> nil) (#<treesit-parser for javascript> nil)
> > (#<treesit-parser for php> nil))
> > 
> > 
> > With :local the treesit-language-at breaks, and js or css rules
> > are also applied to php code :-(
> > 
> > I tried tracking the node location sent from the parser to the
> > font-lock-rules I wrote for phpdoc, with :local the result is:
> > 
> > phpdoc-block node-start= 8 node-end= 64 start= 1 end= 166
> > phpdoc-block node-start= 82 node-end= 120 start= 1 end= 166
> > phpdoc-block node-start= 1 node-end= 166 start= 1 end= 166
> > 
> > the first two are right, the last one is not.
> > 
> > Any idea?
> > Tested with:
> > GNU Emacs 30.0.50 (build 3, x86_64-pc-linux-gnu, GTK+ Version 3.24.39,
> > cairo version 1.18.0) of 2024-01-11
> > 
> > 
> > Thanks
> > 
> > p.s. the function I wrote to get the ranges is:
> > (defun php-ts-mode--get-parser-ranges ()
> > 
> >  "Return the ranges covered by the parsers.
> > 
> > `php-ts-mode' use 5 parsers, this function returns, for the
> > current buffer, the ranges covered by each parser.
> > Usefull for debugging."
> > 
> >  (let ((ranges))
> >  
> >    (if (not (treesit-parser-list))
> > 
> > (message "At least one parser must be initialized"))
> > 
> >    (cl-loop
> >    
> >     for parser in (treesit-parser-list)
> >     do (push (list parser (treesit-parser-included-ranges parser)) ranges)
> >     finally return ranges)))
> 
> IIUC your problem is that treesit-language-at doesn’t work, right? Have you
> assigned treesit-language-at-function? People often assume
> treesit-language-at works automatically when they define
> treesit-range-rules. But you actually need to define
> treesit-language-at-function.
> 
> Yuan


[-- Attachment #1.2: treesit_local_withoutfix.png --]
[-- Type: image/png, Size: 17487 bytes --]

[-- Attachment #1.3: treesit_local_withfix.png --]
[-- Type: image/png, Size: 17947 bytes --]

[-- Attachment #2: This is a digitally signed message part. --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

  reply	other threads:[~2024-01-27 10:23 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-01-11 11:15 treesit-range-settings with ':local' : I missed something or it's a bug? Vincenzo Pupillo
2024-01-25 12:21 ` Vincenzo Pupillo
2024-01-27  4:32 ` Yuan Fu
2024-01-27 10:23   ` Vincenzo Pupillo [this message]
2024-01-28  7:09     ` Yuan Fu
2024-01-29 14:04       ` Vincenzo Pupillo
2024-01-31  6:32         ` Yuan Fu
2024-01-31 20:05           ` Vincenzo Pupillo
2024-01-31 20:24             ` 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

  List information: https://www.gnu.org/software/emacs/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=10408919.nUPlyArG6x@fedora \
    --to=v.pupillo@gmail.com \
    --cc=casouri@gmail.com \
    --cc=emacs-devel@gnu.org \
    /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 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).