all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: Yuan Fu <casouri@gmail.com>
To: Vincenzo Pupillo <v.pupillo@gmail.com>
Cc: emacs-devel@gnu.org
Subject: Re: treesit-range-settings with ':local' : I missed something or it's a bug?
Date: Fri, 26 Jan 2024 20:32:02 -0800	[thread overview]
Message-ID: <5C4F13B5-3FE3-499E-8F23-8B528AF194B7@gmail.com> (raw)
In-Reply-To: <6107698.MhkbZ0Pkbq@3-191.divsi.unimi.it>



> 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


  parent reply	other threads:[~2024-01-27  4:32 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 [this message]
2024-01-27 10:23   ` Vincenzo Pupillo
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

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

  git send-email \
    --in-reply-to=5C4F13B5-3FE3-499E-8F23-8B528AF194B7@gmail.com \
    --to=casouri@gmail.com \
    --cc=emacs-devel@gnu.org \
    --cc=v.pupillo@gmail.com \
    /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 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.