JSX text and attributes support HTML character references (a.k.a. entities), and don't support ECMAScript string escape sequences.
Although the spec calls it "historical" and threatens to change it, it is in the spec, and the spec is pretty stable at this point.
In changing this, I landed back on an idea that @maxbrunsfeld suggested in a PR review some time ago: having separate string and jsx_string nodes, and aliasing jsx_string to string for consumers' convenience. At that time, having two different node types was deemed unnecessary, but this adds a second, more substantive difference between the two, so I've brought the idea back, and stopped allowing invalid newlines in JS string literals, which is invalid in both JS and TS.
TL;DR
Here is some JSX highlighted in Neovim using tree-sitter:
And here it is in VSCode, not using tree-sitter:
VSCode, correctly, does not highlight the \n in the JSX attribute, and does highlight the two valid s, which tree-sitter-javascript doesn't currently parse. This PR fixes both things.
Checklist:
[ ] All tests pass in CI. (awaiting approval)
[x] The script/parse-examples passes without issues.
[x] There are sufficient tests for the new fix/feature.
[x] Grammar rules have not been renamed unless absolutely necessary.
[x] The conflicts section hasn't grown too much.
[x] The parser size hasn't grown too much (check the value of STATE_COUNT in src/parser.c).
JSX text and attributes support HTML character references (a.k.a. entities), and don't support ECMAScript string escape sequences.
Although the spec calls it "historical" and threatens to change it, it is in the spec, and the spec is pretty stable at this point.
In changing this, I landed back on an idea that @maxbrunsfeld suggested in a PR review some time ago: having separate
string
andjsx_string
nodes, and aliasingjsx_string
tostring
for consumers' convenience. At that time, having two different node types was deemed unnecessary, but this adds a second, more substantive difference between the two, so I've brought the idea back, and stopped allowing invalid newlines in JS string literals, which is invalid in both JS and TS.TL;DR
Here is some JSX highlighted in Neovim using tree-sitter:
And here it is in VSCode, not using tree-sitter:
VSCode, correctly, does not highlight the
\n
in the JSX attribute, and does highlight the two valid
s, which tree-sitter-javascript doesn't currently parse. This PR fixes both things.Checklist: