unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
* bug#61529: 30.0.50; tree-sitter: weird off-by-one error but only in css-ts-mode(?) with `treesit-node-at'
@ 2023-02-15  8:25 Mickey Petersen
  2023-02-15 13:42 ` Eli Zaretskii
  0 siblings, 1 reply; 12+ messages in thread
From: Mickey Petersen @ 2023-02-15  8:25 UTC (permalink / raw)
  To: 61529


Here's a strange one.

I don't know where to point the finger here exactly, but I think
`treesit-node-at' might have a small bug in it somewhere.


Consider this `css-ts-mode' code:

    a {
      background: linear-gradient(|210deg, rgba(255,82,41,1) 0%, rgba(251,165,85,1) 54%, rgba(163,73,73,1) 100%);
    }

Let | be point.

Engage `treesit-inspect-mode' and you'll see it asserts that point is
at '('. OK, so that could easily be a glitch in that implementation,
but let's probe further.

With point at '2', then I'd expect `treesit-node-at' to yield that node. But it does not:

(cons (point) (treesit-node-at (point)))

=> (34 . #<treesit-node "(" in 34-35>)

Move back one point

(cons (1- (point)) (treesit-node-at (1- (point)))) 
 
=> (35 . #<treesit-node "(" in 34-35>)

Move *forward* one and it does, but it gives us `unit' but I'd expect
`integer_value` as per the explorer (and indeed the tree.)

(cons (1+ (point)) (treesit-node-at (1+ (point))))

=> (36 . #<treesit-node unit in 38-41>)

Again but with the TS implementation `treesit-node-on`:

(cons (point) (treesit-node-on (point) (point)))

=> (35 . #<treesit-node integer_value in 35-41>)

And now we get the right node.









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

* bug#61529: 30.0.50; tree-sitter: weird off-by-one error but only in css-ts-mode(?) with `treesit-node-at'
  2023-02-15  8:25 bug#61529: 30.0.50; tree-sitter: weird off-by-one error but only in css-ts-mode(?) with `treesit-node-at' Mickey Petersen
@ 2023-02-15 13:42 ` Eli Zaretskii
  2023-02-15 13:42   ` Mickey Petersen
  0 siblings, 1 reply; 12+ messages in thread
From: Eli Zaretskii @ 2023-02-15 13:42 UTC (permalink / raw)
  To: Mickey Petersen; +Cc: 61529

> From: Mickey Petersen <mickey@masteringemacs.org>
> Date: Wed, 15 Feb 2023 08:25:53 +0000
> 
> 
> With point at '2', then I'd expect `treesit-node-at' to yield that node. But it does not:
> 
> (cons (point) (treesit-node-at (point)))
> 
> => (34 . #<treesit-node "(" in 34-35>)

The value of point is the number of the character which _follows_
point, yes?  So when the cursor is on '2', point is actually between
'(' and '2'.  Right?  What does this mean in terms of the node that
should be returned by tree-sitter?





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

* bug#61529: 30.0.50; tree-sitter: weird off-by-one error but only in css-ts-mode(?) with `treesit-node-at'
  2023-02-15 13:42 ` Eli Zaretskii
@ 2023-02-15 13:42   ` Mickey Petersen
  2023-02-15 18:35     ` Theodor Thornhill via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 1 reply; 12+ messages in thread
From: Mickey Petersen @ 2023-02-15 13:42 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 61529


Eli Zaretskii <eliz@gnu.org> writes:

>> From: Mickey Petersen <mickey@masteringemacs.org>
>> Date: Wed, 15 Feb 2023 08:25:53 +0000
>>
>>
>> With point at '2', then I'd expect `treesit-node-at' to yield that node. But it does not:
>>
>> (cons (point) (treesit-node-at (point)))
>>
>> => (34 . #<treesit-node "(" in 34-35>)
>
> The value of point is the number of the character which _follows_
> point, yes?  So when the cursor is on '2', point is actually between
> '(' and '2'.  Right?  What does this mean in terms of the node that
> should be returned by tree-sitter?

Correct, point is between '(' and '2'. So 34-35 means it occupies
position 34-35 or [34,35). So point is outside the scope of the '('
single-char anonymous node.

Or at least it should be: the problem is that it *is* inside it in
this one weird instance and, near as I can find, only in this mode,
and then only in this place, it isn't. I suspect `treesit-node-at' has
a bug.

Consider:

    a {
      background: linear-gradient(210deg, rgba(|255,82,41,1) 0%, rgba(251,165,85,1) 54%, rgba(163,73,73,1) 100%);
    }

Note the new position of point in rgba. `treesit-node-at` with `(point)` now correctly returns

    #<treesit-node integer_value in 48-51>

Move point back one position:

    a {
      background: linear-gradient(210deg, rgba|(255,82,41,1) 0%, rgba(251,165,85,1) 54%, rgba(163,73,73,1) 100%);
    }

And now:

  (treesit-node-at (point)) => #<treesit-node "(" in 47-48>

In start contrast to the original example.






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

* bug#61529: 30.0.50; tree-sitter: weird off-by-one error but only in css-ts-mode(?) with `treesit-node-at'
  2023-02-15 13:42   ` Mickey Petersen
@ 2023-02-15 18:35     ` Theodor Thornhill via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2023-02-15 19:01       ` Mickey Petersen
  2023-02-16 21:34       ` Dmitry Gutov
  0 siblings, 2 replies; 12+ messages in thread
From: Theodor Thornhill via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2023-02-15 18:35 UTC (permalink / raw)
  To: Mickey Petersen; +Cc: Eli Zaretskii, 61529

Mickey Petersen <mickey@masteringemacs.org> writes:

> Eli Zaretskii <eliz@gnu.org> writes:
>
>>> From: Mickey Petersen <mickey@masteringemacs.org>
>>> Date: Wed, 15 Feb 2023 08:25:53 +0000
>>>
>>>
>>> With point at '2', then I'd expect `treesit-node-at' to yield that node. But it does not:
>>>
>>> (cons (point) (treesit-node-at (point)))
>>>
>>> => (34 . #<treesit-node "(" in 34-35>)
>>
>> The value of point is the number of the character which _follows_
>> point, yes?  So when the cursor is on '2', point is actually between
>> '(' and '2'.  Right?  What does this mean in terms of the node that
>> should be returned by tree-sitter?
>
> Correct, point is between '(' and '2'. So 34-35 means it occupies
> position 34-35 or [34,35). So point is outside the scope of the '('
> single-char anonymous node.
>
> Or at least it should be: the problem is that it *is* inside it in
> this one weird instance and, near as I can find, only in this mode,
> and then only in this place, it isn't. I suspect `treesit-node-at' has
> a bug.
>

Hi, Mickey!

> Consider:
>
>     a {
>       background: linear-gradient(210deg, rgba(|255,82,41,1) 0%, rgba(251,165,85,1) 54%, rgba(163,73,73,1) 100%);
>     }
>
> Note the new position of point in rgba. `treesit-node-at` with `(point)` now correctly returns
>
>     #<treesit-node integer_value in 48-51>
>
> Move point back one position:
>
>     a {
>       background: linear-gradient(210deg, rgba|(255,82,41,1) 0%, rgba(251,165,85,1) 54%, rgba(163,73,73,1) 100%);
>     }
>
> And now:
>
>   (treesit-node-at (point)) => #<treesit-node "(" in 47-48>
>
> In start contrast to the original example.

So the docstring of treesit-node-at states:


  "Return the leaf node at position POS.

A leaf node is a node that doesn't have any child nodes.

The returned node's span covers POS: the node's beginning is before
or at POS, and the node's end is at or after POS.

If no leaf node's span covers POS (e.g., POS is on whitespace
between two leaf nodes), return the first leaf node after POS.

If there is no leaf node after POS, return the first leaf node
before POS.

Return nil if no leaf node can be returned.  If NAMED is non-nil,
only look for named nodes."

Doesn't this describe this behavior?

Theo





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

* bug#61529: 30.0.50; tree-sitter: weird off-by-one error but only in css-ts-mode(?) with `treesit-node-at'
  2023-02-15 18:35     ` Theodor Thornhill via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2023-02-15 19:01       ` Mickey Petersen
  2023-02-15 19:42         ` Theodor Thornhill via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2023-02-16 21:26         ` Dmitry Gutov
  2023-02-16 21:34       ` Dmitry Gutov
  1 sibling, 2 replies; 12+ messages in thread
From: Mickey Petersen @ 2023-02-15 19:01 UTC (permalink / raw)
  To: Theodor Thornhill; +Cc: Eli Zaretskii, 61529


Theodor Thornhill <theo@thornhill.no> writes:

> Mickey Petersen <mickey@masteringemacs.org> writes:
>
>> Eli Zaretskii <eliz@gnu.org> writes:
>>
>>>> From: Mickey Petersen <mickey@masteringemacs.org>
>>>> Date: Wed, 15 Feb 2023 08:25:53 +0000
>>>>
>>>>
>>>> With point at '2', then I'd expect `treesit-node-at' to yield that node. But it does not:
>>>>
>>>> (cons (point) (treesit-node-at (point)))
>>>>
>>>> => (34 . #<treesit-node "(" in 34-35>)
>>>
>>> The value of point is the number of the character which _follows_
>>> point, yes?  So when the cursor is on '2', point is actually between
>>> '(' and '2'.  Right?  What does this mean in terms of the node that
>>> should be returned by tree-sitter?
>>
>> Correct, point is between '(' and '2'. So 34-35 means it occupies
>> position 34-35 or [34,35). So point is outside the scope of the '('
>> single-char anonymous node.
>>
>> Or at least it should be: the problem is that it *is* inside it in
>> this one weird instance and, near as I can find, only in this mode,
>> and then only in this place, it isn't. I suspect `treesit-node-at' has
>> a bug.
>>
>
> Hi, Mickey!
>
Hey Theo!

>> Consider:
>>
>>     a {
>>       background: linear-gradient(210deg, rgba(|255,82,41,1) 0%, rgba(251,165,85,1) 54%, rgba(163,73,73,1) 100%);
>>     }
>>
>> Note the new position of point in rgba. `treesit-node-at` with `(point)` now correctly returns
>>
>>     #<treesit-node integer_value in 48-51>
>>
>> Move point back one position:
>>
>>     a {
>>       background: linear-gradient(210deg, rgba|(255,82,41,1) 0%, rgba(251,165,85,1) 54%, rgba(163,73,73,1) 100%);
>>     }
>>
>> And now:
>>
>>   (treesit-node-at (point)) => #<treesit-node "(" in 47-48>
>>
>> In start contrast to the original example.
>
> So the docstring of treesit-node-at states:
>
>
>   "Return the leaf node at position POS.
>
> A leaf node is a node that doesn't have any child nodes.
>
> The returned node's span covers POS: the node's beginning is before
> or at POS, and the node's end is at or after POS.
>
> If no leaf node's span covers POS (e.g., POS is on whitespace
> between two leaf nodes), return the first leaf node after POS.
>
> If there is no leaf node after POS, return the first leaf node
> before POS.
>
> Return nil if no leaf node can be returned.  If NAMED is non-nil,
> only look for named nodes."
>
> Doesn't this describe this behavior?
>

It's a good question: I suppose it's a question of wording (or
understanding) more than it necessarily being *wrong* -- it is, after
all, a custom function.

I read and interpreted it to mean that due to how node boundaries work
that "*end is at* or after POS" to mean that point is wholly contained
in the node "(" which, due to how tree-sitter determines node extents,
it technically isn't.

But I think it's fair enough if this is intentional -- I've no real
suggestions for improving its behaviour if this is intended. So if
it's working as expected, then it's safe to close the issue.

Thanks. Mickey.






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

* bug#61529: 30.0.50; tree-sitter: weird off-by-one error but only in css-ts-mode(?) with `treesit-node-at'
  2023-02-15 19:01       ` Mickey Petersen
@ 2023-02-15 19:42         ` Theodor Thornhill via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2023-02-16 19:48           ` Mickey Petersen
  2023-02-16 21:26         ` Dmitry Gutov
  1 sibling, 1 reply; 12+ messages in thread
From: Theodor Thornhill via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2023-02-15 19:42 UTC (permalink / raw)
  To: Mickey Petersen; +Cc: Eli Zaretskii, 61529

Mickey Petersen <mickey@masteringemacs.org> writes:

> Theodor Thornhill <theo@thornhill.no> writes:
>
>> Mickey Petersen <mickey@masteringemacs.org> writes:
>>
>>> Eli Zaretskii <eliz@gnu.org> writes:
>>>
>>>>> From: Mickey Petersen <mickey@masteringemacs.org>
>>>>> Date: Wed, 15 Feb 2023 08:25:53 +0000
>>>>>
>>>>>
>>>>> With point at '2', then I'd expect `treesit-node-at' to yield that node. But it does not:
>>>>>
>>>>> (cons (point) (treesit-node-at (point)))
>>>>>
>>>>> => (34 . #<treesit-node "(" in 34-35>)
>>>>
>>>> The value of point is the number of the character which _follows_
>>>> point, yes?  So when the cursor is on '2', point is actually between
>>>> '(' and '2'.  Right?  What does this mean in terms of the node that
>>>> should be returned by tree-sitter?
>>>
>>> Correct, point is between '(' and '2'. So 34-35 means it occupies
>>> position 34-35 or [34,35). So point is outside the scope of the '('
>>> single-char anonymous node.
>>>
>>> Or at least it should be: the problem is that it *is* inside it in
>>> this one weird instance and, near as I can find, only in this mode,
>>> and then only in this place, it isn't. I suspect `treesit-node-at' has
>>> a bug.
>>>
>>
>> Hi, Mickey!
>>
> Hey Theo!
>
>>> Consider:
>>>
>>>     a {
>>>       background: linear-gradient(210deg, rgba(|255,82,41,1) 0%, rgba(251,165,85,1) 54%, rgba(163,73,73,1) 100%);
>>>     }
>>>
>>> Note the new position of point in rgba. `treesit-node-at` with `(point)` now correctly returns
>>>
>>>     #<treesit-node integer_value in 48-51>
>>>
>>> Move point back one position:
>>>
>>>     a {
>>>       background: linear-gradient(210deg, rgba|(255,82,41,1) 0%, rgba(251,165,85,1) 54%, rgba(163,73,73,1) 100%);
>>>     }
>>>
>>> And now:
>>>
>>>   (treesit-node-at (point)) => #<treesit-node "(" in 47-48>
>>>
>>> In start contrast to the original example.
>>
>> So the docstring of treesit-node-at states:
>>
>>
>>   "Return the leaf node at position POS.
>>
>> A leaf node is a node that doesn't have any child nodes.
>>
>> The returned node's span covers POS: the node's beginning is before
>> or at POS, and the node's end is at or after POS.
>>
>> If no leaf node's span covers POS (e.g., POS is on whitespace
>> between two leaf nodes), return the first leaf node after POS.
>>
>> If there is no leaf node after POS, return the first leaf node
>> before POS.
>>
>> Return nil if no leaf node can be returned.  If NAMED is non-nil,
>> only look for named nodes."
>>
>> Doesn't this describe this behavior?
>>
>
> It's a good question: I suppose it's a question of wording (or
> understanding) more than it necessarily being *wrong* -- it is, after
> all, a custom function.
>
> I read and interpreted it to mean that due to how node boundaries work
> that "*end is at* or after POS" to mean that point is wholly contained
> in the node "(" which, due to how tree-sitter determines node extents,
> it technically isn't.
>
> But I think it's fair enough if this is intentional -- I've no real
> suggestions for improving its behaviour if this is intended. So if
> it's working as expected, then it's safe to close the issue.
>

There is one thing here which confuses me a lot and that you might also
have some thoughts on. Consider some simple tsx:

```
const x = () => (
  <div>
    try to C-SPC C-SPC at the beginning of try after activating treesit-explore-mode
  </div>
)
```

Now you can maybe see that the jsx_text node covers a lot more than just
the line in the middle.  There are some other cases like this in some
languages, and they do trip up our semantics. May this be one similar
such case, just not concerning indentation in this case?

IOW, sometimes the parser also returns nodes including whitespace, so it
looks like we are outside a node, but we're not yet.

Theo





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

* bug#61529: 30.0.50; tree-sitter: weird off-by-one error but only in css-ts-mode(?) with `treesit-node-at'
  2023-02-15 19:42         ` Theodor Thornhill via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2023-02-16 19:48           ` Mickey Petersen
  0 siblings, 0 replies; 12+ messages in thread
From: Mickey Petersen @ 2023-02-16 19:48 UTC (permalink / raw)
  To: Theodor Thornhill; +Cc: Eli Zaretskii, 61529


Theodor Thornhill <theo@thornhill.no> writes:

> Mickey Petersen <mickey@masteringemacs.org> writes:
>
>> Theodor Thornhill <theo@thornhill.no> writes:
>>
>>> Mickey Petersen <mickey@masteringemacs.org> writes:
>>>
>>>> Eli Zaretskii <eliz@gnu.org> writes:
>>>>
>>>>>> From: Mickey Petersen <mickey@masteringemacs.org>
>>>>>> Date: Wed, 15 Feb 2023 08:25:53 +0000
>>>>>>
>>>>>>
>>>>>> With point at '2', then I'd expect `treesit-node-at' to yield that node. But it does not:
>>>>>>
>>>>>> (cons (point) (treesit-node-at (point)))
>>>>>>
>>>>>> => (34 . #<treesit-node "(" in 34-35>)
>>>>>
>>>>> The value of point is the number of the character which _follows_
>>>>> point, yes?  So when the cursor is on '2', point is actually between
>>>>> '(' and '2'.  Right?  What does this mean in terms of the node that
>>>>> should be returned by tree-sitter?
>>>>
>>>> Correct, point is between '(' and '2'. So 34-35 means it occupies
>>>> position 34-35 or [34,35). So point is outside the scope of the '('
>>>> single-char anonymous node.
>>>>
>>>> Or at least it should be: the problem is that it *is* inside it in
>>>> this one weird instance and, near as I can find, only in this mode,
>>>> and then only in this place, it isn't. I suspect `treesit-node-at' has
>>>> a bug.
>>>>
>>>
>>> Hi, Mickey!
>>>
>> Hey Theo!
>>
>>>> Consider:
>>>>
>>>>     a {
>>>>       background: linear-gradient(210deg, rgba(|255,82,41,1) 0%, rgba(251,165,85,1) 54%, rgba(163,73,73,1) 100%);
>>>>     }
>>>>
>>>> Note the new position of point in rgba. `treesit-node-at` with `(point)` now correctly returns
>>>>
>>>>     #<treesit-node integer_value in 48-51>
>>>>
>>>> Move point back one position:
>>>>
>>>>     a {
>>>>       background: linear-gradient(210deg, rgba|(255,82,41,1) 0%, rgba(251,165,85,1) 54%, rgba(163,73,73,1) 100%);
>>>>     }
>>>>
>>>> And now:
>>>>
>>>>   (treesit-node-at (point)) => #<treesit-node "(" in 47-48>
>>>>
>>>> In start contrast to the original example.
>>>
>>> So the docstring of treesit-node-at states:
>>>
>>>
>>>   "Return the leaf node at position POS.
>>>
>>> A leaf node is a node that doesn't have any child nodes.
>>>
>>> The returned node's span covers POS: the node's beginning is before
>>> or at POS, and the node's end is at or after POS.
>>>
>>> If no leaf node's span covers POS (e.g., POS is on whitespace
>>> between two leaf nodes), return the first leaf node after POS.
>>>
>>> If there is no leaf node after POS, return the first leaf node
>>> before POS.
>>>
>>> Return nil if no leaf node can be returned.  If NAMED is non-nil,
>>> only look for named nodes."
>>>
>>> Doesn't this describe this behavior?
>>>
>>
>> It's a good question: I suppose it's a question of wording (or
>> understanding) more than it necessarily being *wrong* -- it is, after
>> all, a custom function.
>>
>> I read and interpreted it to mean that due to how node boundaries work
>> that "*end is at* or after POS" to mean that point is wholly contained
>> in the node "(" which, due to how tree-sitter determines node extents,
>> it technically isn't.
>>
>> But I think it's fair enough if this is intentional -- I've no real
>> suggestions for improving its behaviour if this is intended. So if
>> it's working as expected, then it's safe to close the issue.
>>
>
> There is one thing here which confuses me a lot and that you might also
> have some thoughts on. Consider some simple tsx:
>
> ```
> const x = () => (
>   <div>
>     try to C-SPC C-SPC at the beginning of try after activating treesit-explore-mode
>   </div>
> )
> ```
>
> Now you can maybe see that the jsx_text node covers a lot more than just
> the line in the middle.  There are some other cases like this in some
> languages, and they do trip up our semantics. May this be one similar
> such case, just not concerning indentation in this case?
>

Yeah that's just how XML is, which is more or less what JSX is based
on. So that does not seem too surprising to me in this particular case
that the jsx_text node has extra whitespace around the text, even if
it is insignificant in SGML. (Though some xml parsers do trim the
leading and trailing element whitespace...)

> IOW, sometimes the parser also returns nodes including whitespace, so it
> looks like we are outside a node, but we're not yet.
>
> Theo






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

* bug#61529: 30.0.50; tree-sitter: weird off-by-one error but only in css-ts-mode(?) with `treesit-node-at'
  2023-02-15 19:01       ` Mickey Petersen
  2023-02-15 19:42         ` Theodor Thornhill via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2023-02-16 21:26         ` Dmitry Gutov
  1 sibling, 0 replies; 12+ messages in thread
From: Dmitry Gutov @ 2023-02-16 21:26 UTC (permalink / raw)
  To: Mickey Petersen, Theodor Thornhill; +Cc: Eli Zaretskii, 61529

On 15/02/2023 21:01, Mickey Petersen wrote:
> I read and interpreted it to mean that due to how node boundaries work
> that "*end is at*  or after POS" to mean that point is wholly contained
> in the node "(" which, due to how tree-sitter determines node extents,
> it technically isn't.
> 
> But I think it's fair enough if this is intentional -- I've no real
> suggestions for improving its behaviour if this is intended. So if
> it's working as expected, then it's safe to close the issue.

The difference in this case is due to the tree structure:

In '210deg', (integer_value) is not a leaf node. The only leaf node it 
has inside is (unit), and that one starts 3 characters later.

In '255', however, (integer_value) *is* a leaf node. And since 
treesit-node-at looks for leaf nodes, it stops at "(" as documented.

I'd probably calls it a problem with the grammar, but it doesn't seem 
likely to be fixed, backward compatibility and all.





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

* bug#61529: 30.0.50; tree-sitter: weird off-by-one error but only in css-ts-mode(?) with `treesit-node-at'
  2023-02-15 18:35     ` Theodor Thornhill via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2023-02-15 19:01       ` Mickey Petersen
@ 2023-02-16 21:34       ` Dmitry Gutov
  2023-02-17  6:16         ` Eli Zaretskii
  1 sibling, 1 reply; 12+ messages in thread
From: Dmitry Gutov @ 2023-02-16 21:34 UTC (permalink / raw)
  To: Theodor Thornhill, Mickey Petersen; +Cc: Eli Zaretskii, 61529

On 15/02/2023 20:35, Theodor Thornhill via Bug reports for GNU Emacs, 
the Swiss army knife of text editors wrote:
> So the docstring of treesit-node-at states:

Looking at the code, this change might describe it better:

diff --git a/lisp/treesit.el b/lisp/treesit.el
index 749781894b8..6e53b3d4c4a 100644
--- a/lisp/treesit.el
+++ b/lisp/treesit.el
@@ -166,10 +166,13 @@ treesit-node-at
  A leaf node is a node that doesn't have any child nodes.

  The returned node's span covers POS: the node's beginning is before
-or at POS, and the node's end is at or after POS.
+or at POS, and the node's end is after POS.

-If no leaf node's span covers POS (e.g., POS is on whitespace
-between two leaf nodes), return the first leaf node after POS.
+If no such node is found, but a leaf node ends at POS, it's
+returned.
+
+Otherwise (e.g., when POS is on whitespace between two leaf
+nodes), return the first leaf node after POS.

  If there is no leaf node after POS, return the first leaf node
  before POS.






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

* bug#61529: 30.0.50; tree-sitter: weird off-by-one error but only in css-ts-mode(?) with `treesit-node-at'
  2023-02-16 21:34       ` Dmitry Gutov
@ 2023-02-17  6:16         ` Eli Zaretskii
  2023-02-17  7:24           ` Mickey Petersen
  2023-02-17 15:11           ` Dmitry Gutov
  0 siblings, 2 replies; 12+ messages in thread
From: Eli Zaretskii @ 2023-02-17  6:16 UTC (permalink / raw)
  To: Dmitry Gutov; +Cc: mickey, 61529, theo

> Date: Thu, 16 Feb 2023 23:34:58 +0200
> Cc: Eli Zaretskii <eliz@gnu.org>, 61529@debbugs.gnu.org
> From: Dmitry Gutov <dgutov@yandex.ru>
> 
> +If no such node is found, but a leaf node ends at POS, it's
> +returned.

Passive tense alert!  This is better:

  If no such node exists, but there's a leaf node which ends at POS,
  return that node.





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

* bug#61529: 30.0.50; tree-sitter: weird off-by-one error but only in css-ts-mode(?) with `treesit-node-at'
  2023-02-17  6:16         ` Eli Zaretskii
@ 2023-02-17  7:24           ` Mickey Petersen
  2023-02-17 15:11           ` Dmitry Gutov
  1 sibling, 0 replies; 12+ messages in thread
From: Mickey Petersen @ 2023-02-17  7:24 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 61529, theo, Dmitry Gutov


Eli Zaretskii <eliz@gnu.org> writes:

>> Date: Thu, 16 Feb 2023 23:34:58 +0200
>> Cc: Eli Zaretskii <eliz@gnu.org>, 61529@debbugs.gnu.org
>> From: Dmitry Gutov <dgutov@yandex.ru>
>>
>> +If no such node is found, but a leaf node ends at POS, it's
>> +returned.
>
> Passive tense alert!  This is better:
>
>   If no such node exists, but there's a leaf node which ends at POS,
>   return that node.


Thanks, everyone. I think it's safe to say I misread the intent of the
function. It's safe to close this issue.





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

* bug#61529: 30.0.50; tree-sitter: weird off-by-one error but only in css-ts-mode(?) with `treesit-node-at'
  2023-02-17  6:16         ` Eli Zaretskii
  2023-02-17  7:24           ` Mickey Petersen
@ 2023-02-17 15:11           ` Dmitry Gutov
  1 sibling, 0 replies; 12+ messages in thread
From: Dmitry Gutov @ 2023-02-17 15:11 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 61529-done, mickey, theo

Version: 29.1

On 17/02/2023 08:16, Eli Zaretskii wrote:
>> Date: Thu, 16 Feb 2023 23:34:58 +0200
>> Cc: Eli Zaretskii<eliz@gnu.org>,61529@debbugs.gnu.org
>> From: Dmitry Gutov<dgutov@yandex.ru>
>>
>> +If no such node is found, but a leaf node ends at POS, it's
>> +returned.
> Passive tense alert!  This is better:
> 
>    If no such node exists, but there's a leaf node which ends at POS,
>    return that node.

Thank you, pushed. With that, I'm closing the report.





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

end of thread, other threads:[~2023-02-17 15:11 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-02-15  8:25 bug#61529: 30.0.50; tree-sitter: weird off-by-one error but only in css-ts-mode(?) with `treesit-node-at' Mickey Petersen
2023-02-15 13:42 ` Eli Zaretskii
2023-02-15 13:42   ` Mickey Petersen
2023-02-15 18:35     ` Theodor Thornhill via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-02-15 19:01       ` Mickey Petersen
2023-02-15 19:42         ` Theodor Thornhill via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-02-16 19:48           ` Mickey Petersen
2023-02-16 21:26         ` Dmitry Gutov
2023-02-16 21:34       ` Dmitry Gutov
2023-02-17  6:16         ` Eli Zaretskii
2023-02-17  7:24           ` Mickey Petersen
2023-02-17 15:11           ` Dmitry Gutov

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