tree-sitter-javascript
tree-sitter-javascript copied to clipboard
Range of jsx_text node is too large
Hi,
This issue is very similar to this one.
It concerns the jsx_text node. The range of this node is too large as it also covers the white spaces and newlines around it.
Here, how to reproduce the issue:
function test() {
return (
<>
TEXT
</>
)
}
(program [0, 0] - [7, 0]
(export_statement [0, 0] - [6, 1]
declaration: (function_declaration [0, 15] - [6, 1]
name: (identifier [0, 24] - [0, 28])
parameters: (formal_parameters [0, 28] - [0, 30])
body: (statement_block [0, 31] - [6, 1]
(return_statement [1, 2] - [5, 3]
(parenthesized_expression [1, 9] - [5, 3]
(jsx_element [2, 4] - [4, 7]
open_tag: (jsx_opening_element [2, 4] - [2, 6])
(jsx_text [2, 6] - [4, 4])
close_tag: (jsx_closing_element [4, 4] - [4, 7]))))))))
Thanks in advance for fixing it.
I think this is intentional, because the whitespace is included in the text string that is created by that JSX.
In JSX (AFAIK with React), if you want whitespaces before and after a text element to be rendered, you have to do something like this:
function test() {
return (
<>
{' TEXT '}
</>
)
}
For me, having only the text element strict range (without whitespaces) is very more useful for a code editor which uses tree-sitter to indent, fontify, etc...
If it is intended, it is a breaking change, as previous releases did not behave like that.
Its a bit strange @llemaitre19 because capturing the whitespace accurately is important for the formatting use case. This is because some whitespace in JSX is effectful. eg see my comment here.
That doesn't mean that what we have now is the perfect thing, but it does mean that a blanket argument for keeping it out because 'its not rendered' is not a valid argument.
Yeah I don't think we want to remove the leading and trailing whitespace, it's more useful to have this than to omit this.