Merge pull request #247 from guillaumebrunerie/jsx_fixes

Various fixes for JSX support
pull/643/head
Amaan Qureshi 2023-07-11 19:25:15 +07:00 committed by GitHub
commit a232b3ac46
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 266916 additions and 265804 deletions

@ -125,7 +125,7 @@ declare module Foo {
(ambient_declaration
(module
name: (nested_identifier (identifier) (identifier))
name: (nested_identifier (identifier) (property_identifier))
body: (statement_block
(export_statement
declaration: (variable_declaration (variable_declarator name: (identifier)))))))
@ -320,7 +320,7 @@ import r = X.N;
---
(program
(import_alias (identifier) (nested_identifier (identifier) (identifier))))
(import_alias (identifier) (nested_identifier (identifier) (property_identifier))))
==================================
Import aliases in modules
@ -334,7 +334,7 @@ module C {
(program
(module (identifier) (statement_block
(import_alias (identifier) (nested_identifier (identifier) (identifier))))))
(import_alias (identifier) (nested_identifier (identifier) (property_identifier))))))
==================================
Export import aliases

@ -214,7 +214,7 @@ module.exports = function defineGrammar(dialect) {
if (dialect === 'typescript') {
choices.push($.type_assertion);
choices.push(...previous.members.filter(member =>
member.name !== '_jsx_element' && member.name !== 'jsx_fragment'
member.name !== '_jsx_element'
));
} else if (dialect === 'tsx') {
choices.push(...previous.members);
@ -227,20 +227,24 @@ module.exports = function defineGrammar(dialect) {
_jsx_start_opening_element: $ => seq(
'<',
choice(
field('name', choice(
$._jsx_identifier,
$.jsx_namespace_name
)),
optional(
seq(
field('name', choice(
$.identifier,
$.nested_identifier
)),
field('type_arguments', optional($.type_arguments))
)
choice(
field('name', choice(
$._jsx_identifier,
$.jsx_namespace_name
)),
seq(
field('name', choice(
$.identifier,
$.nested_identifier
)),
field('type_arguments', optional($.type_arguments))
)
),
repeat(field('attribute', $._jsx_attribute)),
),
),
repeat(field('attribute', $._jsx_attribute))
),
// This rule is only referenced by expression when the dialect is 'tsx'
@ -252,8 +256,7 @@ module.exports = function defineGrammar(dialect) {
// tsx only. See jsx_opening_element.
jsx_self_closing_element: $ => prec.dynamic(-1, seq(
$._jsx_start_opening_element,
'/',
'>'
'/>'
)),
export_specifier: ($, previous) => seq(

@ -19,7 +19,7 @@
"main": "./bindings/node",
"devDependencies": {
"tree-sitter-cli": "^0.20.6",
"tree-sitter-javascript": "github:tree-sitter/tree-sitter-javascript#d15843d"
"tree-sitter-javascript": "github:tree-sitter/tree-sitter-javascript#f772967"
},
"scripts": {
"build": "npm run build-typescript && npm run build-tsx",

@ -4,6 +4,7 @@ Type arguments in JSX
<Element<T>>hi</Element>;
<Element<T> />;
<>fragment</>;
---
@ -16,4 +17,9 @@ Type arguments in JSX
(expression_statement
(jsx_self_closing_element
(identifier) (type_arguments (type_identifier))))
(expression_statement
(jsx_element
(jsx_opening_element)
(jsx_text)
(jsx_closing_element)))
)

227
tsx/src/grammar.json vendored

@ -1976,10 +1976,6 @@
"type": "SYMBOL",
"name": "_jsx_element"
},
{
"type": "SYMBOL",
"name": "jsx_fragment"
},
{
"type": "SYMBOL",
"name": "assignment_expression"
@ -2782,42 +2778,19 @@
}
]
},
"jsx_fragment": {
"type": "SEQ",
"jsx_text": {
"type": "CHOICE",
"members": [
{
"type": "STRING",
"value": "<"
},
{
"type": "STRING",
"value": ">"
},
{
"type": "REPEAT",
"content": {
"type": "SYMBOL",
"name": "_jsx_child"
}
},
{
"type": "STRING",
"value": "<"
},
{
"type": "STRING",
"value": "/"
"type": "PATTERN",
"value": "[^{}<>\\n ]([^{}<>\\n]*[^{}<>\\n ])?"
},
{
"type": "STRING",
"value": ">"
"type": "PATTERN",
"value": "\\/\\/[^\\n]*"
}
]
},
"jsx_text": {
"type": "PATTERN",
"value": "[^{}<>]+"
},
"jsx_expression": {
"type": "SEQ",
"members": [
@ -2867,10 +2840,6 @@
"type": "SYMBOL",
"name": "_jsx_element"
},
{
"type": "SYMBOL",
"name": "jsx_fragment"
},
{
"type": "SYMBOL",
"name": "jsx_expression"
@ -2930,8 +2899,13 @@
"name": "identifier"
},
{
"type": "SYMBOL",
"name": "nested_identifier"
"type": "ALIAS",
"content": {
"type": "SYMBOL",
"name": "nested_identifier"
},
"named": true,
"value": "member_expression"
}
]
},
@ -2940,8 +2914,13 @@
"value": "."
},
{
"type": "SYMBOL",
"name": "identifier"
"type": "ALIAS",
"content": {
"type": "SYMBOL",
"name": "identifier"
},
"named": true,
"value": "property_identifier"
}
]
}
@ -2971,8 +2950,13 @@
"name": "_jsx_identifier"
},
{
"type": "SYMBOL",
"name": "nested_identifier"
"type": "ALIAS",
"content": {
"type": "SYMBOL",
"name": "nested_identifier"
},
"named": true,
"value": "member_expression"
},
{
"type": "SYMBOL",
@ -2985,19 +2969,23 @@
"members": [
{
"type": "STRING",
"value": "<"
"value": "</"
},
{
"type": "STRING",
"value": "/"
},
{
"type": "FIELD",
"name": "name",
"content": {
"type": "SYMBOL",
"name": "_jsx_element_name"
}
"type": "CHOICE",
"members": [
{
"type": "FIELD",
"name": "name",
"content": {
"type": "SYMBOL",
"name": "_jsx_element_name"
}
},
{
"type": "BLANK"
}
]
},
{
"type": "STRING",
@ -3017,11 +3005,7 @@
},
{
"type": "STRING",
"value": "/"
},
{
"type": "STRING",
"value": ">"
"value": "/>"
}
]
}
@ -3101,10 +3085,6 @@
{
"type": "SYMBOL",
"name": "_jsx_element"
},
{
"type": "SYMBOL",
"name": "jsx_fragment"
}
]
},
@ -7213,73 +7193,86 @@
{
"type": "CHOICE",
"members": [
{
"type": "FIELD",
"name": "name",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "_jsx_identifier"
},
{
"type": "SYMBOL",
"name": "jsx_namespace_name"
}
]
}
},
{
"type": "SEQ",
"members": [
{
"type": "FIELD",
"name": "name",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "identifier"
},
{
"type": "SYMBOL",
"name": "nested_identifier"
"type": "CHOICE",
"members": [
{
"type": "FIELD",
"name": "name",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "_jsx_identifier"
},
{
"type": "SYMBOL",
"name": "jsx_namespace_name"
}
]
}
]
}
},
{
"type": "SEQ",
"members": [
{
"type": "FIELD",
"name": "name",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "identifier"
},
{
"type": "SYMBOL",
"name": "nested_identifier"
}
]
}
},
{
"type": "FIELD",
"name": "type_arguments",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "type_arguments"
},
{
"type": "BLANK"
}
]
}
}
]
}
]
},
{
"type": "FIELD",
"name": "type_arguments",
"type": "REPEAT",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "type_arguments"
},
{
"type": "BLANK"
}
]
"type": "FIELD",
"name": "attribute",
"content": {
"type": "SYMBOL",
"name": "_jsx_attribute"
}
}
}
]
},
{
"type": "BLANK"
}
]
},
{
"type": "REPEAT",
"content": {
"type": "FIELD",
"name": "attribute",
"content": {
"type": "SYMBOL",
"name": "_jsx_attribute"
}
}
}
]
},

@ -179,10 +179,6 @@
"type": "jsx_element",
"named": true
},
{
"type": "jsx_fragment",
"named": true
},
{
"type": "jsx_self_closing_element",
"named": true
@ -3256,10 +3252,6 @@
"type": "jsx_expression",
"named": true
},
{
"type": "jsx_fragment",
"named": true
},
{
"type": "jsx_namespace_name",
"named": true
@ -3285,7 +3277,7 @@
"fields": {
"name": {
"multiple": false,
"required": true,
"required": false,
"types": [
{
"type": "identifier",
@ -3296,7 +3288,7 @@
"named": true
},
{
"type": "nested_identifier",
"type": "member_expression",
"named": true
}
]
@ -3340,10 +3332,6 @@
"type": "jsx_expression",
"named": true
},
{
"type": "jsx_fragment",
"named": true
},
{
"type": "jsx_self_closing_element",
"named": true
@ -3378,37 +3366,6 @@
]
}
},
{
"type": "jsx_fragment",
"named": true,
"fields": {},
"children": {
"multiple": true,
"required": false,
"types": [
{
"type": "jsx_element",
"named": true
},
{
"type": "jsx_expression",
"named": true
},
{
"type": "jsx_fragment",
"named": true
},
{
"type": "jsx_self_closing_element",
"named": true
},
{
"type": "jsx_text",
"named": true
}
]
}
},
{
"type": "jsx_namespace_name",
"named": true,
@ -3444,7 +3401,7 @@
},
"name": {
"multiple": false,
"required": true,
"required": false,
"types": [
{
"type": "identifier",
@ -3492,7 +3449,7 @@
},
"name": {
"multiple": false,
"required": true,
"required": false,
"types": [
{
"type": "identifier",
@ -3520,6 +3477,11 @@
}
}
},
{
"type": "jsx_text",
"named": true,
"fields": {}
},
{
"type": "labeled_statement",
"named": true,
@ -3720,7 +3682,7 @@
"fields": {
"object": {
"multiple": false,
"required": true,
"required": false,
"types": [
{
"type": "expression",
@ -3740,7 +3702,7 @@
},
"property": {
"multiple": false,
"required": true,
"required": false,
"types": [
{
"type": "private_property_identifier",
@ -3752,6 +3714,24 @@
}
]
}
},
"children": {
"multiple": true,
"required": false,
"types": [
{
"type": "identifier",
"named": true
},
{
"type": "member_expression",
"named": true
},
{
"type": "property_identifier",
"named": true
}
]
}
},
{
@ -4033,7 +4013,11 @@
"named": true
},
{
"type": "nested_identifier",
"type": "member_expression",
"named": true
},
{
"type": "property_identifier",
"named": true
}
]
@ -6020,6 +6004,10 @@
"type": "/=",
"named": false
},
{
"type": "/>",
"named": false
},
{
"type": ":",
"named": false
@ -6032,6 +6020,10 @@
"type": "<",
"named": false
},
{
"type": "</",
"named": false
},
{
"type": "</template>",
"named": false
@ -6296,10 +6288,6 @@
"type": "is",
"named": false
},
{
"type": "jsx_text",
"named": true
},
{
"type": "keyof",
"named": false
@ -6330,11 +6318,11 @@
},
{
"type": "number",
"named": true
"named": false
},
{
"type": "number",
"named": false
"named": true
},
{
"type": "object",

278279
tsx/src/parser.c vendored

File diff suppressed because it is too large Load Diff

@ -2778,42 +2778,19 @@
}
]
},
"jsx_fragment": {
"type": "SEQ",
"jsx_text": {
"type": "CHOICE",
"members": [
{
"type": "STRING",
"value": "<"
},
{
"type": "STRING",
"value": ">"
},
{
"type": "REPEAT",
"content": {
"type": "SYMBOL",
"name": "_jsx_child"
}
},
{
"type": "STRING",
"value": "<"
},
{
"type": "STRING",
"value": "/"
"type": "PATTERN",
"value": "[^{}<>\\n ]([^{}<>\\n]*[^{}<>\\n ])?"
},
{
"type": "STRING",
"value": ">"
"type": "PATTERN",
"value": "\\/\\/[^\\n]*"
}
]
},
"jsx_text": {
"type": "PATTERN",
"value": "[^{}<>]+"
},
"jsx_expression": {
"type": "SEQ",
"members": [
@ -2863,10 +2840,6 @@
"type": "SYMBOL",
"name": "_jsx_element"
},
{
"type": "SYMBOL",
"name": "jsx_fragment"
},
{
"type": "SYMBOL",
"name": "jsx_expression"
@ -2926,8 +2899,13 @@
"name": "identifier"
},
{
"type": "SYMBOL",
"name": "nested_identifier"
"type": "ALIAS",
"content": {
"type": "SYMBOL",
"name": "nested_identifier"
},
"named": true,
"value": "member_expression"
}
]
},
@ -2936,8 +2914,13 @@
"value": "."
},
{
"type": "SYMBOL",
"name": "identifier"
"type": "ALIAS",
"content": {
"type": "SYMBOL",
"name": "identifier"
},
"named": true,
"value": "property_identifier"
}
]
}
@ -2967,8 +2950,13 @@
"name": "_jsx_identifier"
},
{
"type": "SYMBOL",
"name": "nested_identifier"
"type": "ALIAS",
"content": {
"type": "SYMBOL",
"name": "nested_identifier"
},
"named": true,
"value": "member_expression"
},
{
"type": "SYMBOL",
@ -2981,19 +2969,23 @@
"members": [
{
"type": "STRING",
"value": "<"
},
{
"type": "STRING",
"value": "/"
"value": "</"
},
{
"type": "FIELD",
"name": "name",
"content": {
"type": "SYMBOL",
"name": "_jsx_element_name"
}
"type": "CHOICE",
"members": [
{
"type": "FIELD",
"name": "name",
"content": {
"type": "SYMBOL",
"name": "_jsx_element_name"
}
},
{
"type": "BLANK"
}
]
},
{
"type": "STRING",
@ -3013,11 +3005,7 @@
},
{
"type": "STRING",
"value": "/"
},
{
"type": "STRING",
"value": ">"
"value": "/>"
}
]
}
@ -3097,10 +3085,6 @@
{
"type": "SYMBOL",
"name": "_jsx_element"
},
{
"type": "SYMBOL",
"name": "jsx_fragment"
}
]
},
@ -7209,73 +7193,86 @@
{
"type": "CHOICE",
"members": [
{
"type": "FIELD",
"name": "name",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "_jsx_identifier"
},
{
"type": "SYMBOL",
"name": "jsx_namespace_name"
}
]
}
},
{
"type": "SEQ",
"members": [
{
"type": "FIELD",
"name": "name",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "identifier"
},
{
"type": "SYMBOL",
"name": "nested_identifier"
"type": "CHOICE",
"members": [
{
"type": "FIELD",
"name": "name",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "_jsx_identifier"
},
{
"type": "SYMBOL",
"name": "jsx_namespace_name"
}
]
}
]
}
},
{
"type": "SEQ",
"members": [
{
"type": "FIELD",
"name": "name",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "identifier"
},
{
"type": "SYMBOL",
"name": "nested_identifier"
}
]
}
},
{
"type": "FIELD",
"name": "type_arguments",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "type_arguments"
},
{
"type": "BLANK"
}
]
}
}
]
}
]
},
{
"type": "FIELD",
"name": "type_arguments",
"type": "REPEAT",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "type_arguments"
},
{
"type": "BLANK"
}
]
"type": "FIELD",
"name": "attribute",
"content": {
"type": "SYMBOL",
"name": "_jsx_attribute"
}
}
}
]
},
{
"type": "BLANK"
}
]
},
{
"type": "REPEAT",
"content": {
"type": "FIELD",
"name": "attribute",
"content": {
"type": "SYMBOL",
"name": "_jsx_attribute"
}
}
}
]
},

@ -3248,10 +3248,6 @@
"type": "jsx_expression",
"named": true
},
{
"type": "jsx_fragment",
"named": true
},
{
"type": "jsx_namespace_name",
"named": true
@ -3277,7 +3273,7 @@
"fields": {
"name": {
"multiple": false,
"required": true,
"required": false,
"types": [
{
"type": "identifier",
@ -3288,7 +3284,7 @@
"named": true
},
{
"type": "nested_identifier",
"type": "member_expression",
"named": true
}
]
@ -3332,10 +3328,6 @@
"type": "jsx_expression",
"named": true
},
{
"type": "jsx_fragment",
"named": true
},
{
"type": "jsx_self_closing_element",
"named": true
@ -3370,37 +3362,6 @@
]
}
},
{
"type": "jsx_fragment",
"named": true,
"fields": {},
"children": {
"multiple": true,
"required": false,
"types": [
{
"type": "jsx_element",
"named": true
},
{
"type": "jsx_expression",
"named": true
},
{
"type": "jsx_fragment",
"named": true
},
{
"type": "jsx_self_closing_element",
"named": true
},
{
"type": "jsx_text",
"named": true
}
]
}
},
{
"type": "jsx_namespace_name",
"named": true,
@ -3436,7 +3397,7 @@
},
"name": {
"multiple": false,
"required": true,
"required": false,
"types": [
{
"type": "identifier",
@ -3484,7 +3445,7 @@
},
"name": {
"multiple": false,
"required": true,
"required": false,
"types": [
{
"type": "identifier",
@ -3512,6 +3473,11 @@
}
}
},
{
"type": "jsx_text",
"named": true,
"fields": {}
},
{
"type": "labeled_statement",
"named": true,
@ -3712,7 +3678,7 @@
"fields": {
"object": {
"multiple": false,
"required": true,
"required": false,
"types": [
{
"type": "expression",
@ -3732,7 +3698,7 @@
},
"property": {
"multiple": false,
"required": true,
"required": false,
"types": [
{
"type": "private_property_identifier",
@ -3744,6 +3710,24 @@
}
]
}
},
"children": {
"multiple": true,
"required": false,
"types": [
{
"type": "identifier",
"named": true
},
{
"type": "member_expression",
"named": true
},
{
"type": "property_identifier",
"named": true
}
]
}
},
{
@ -4025,7 +4009,11 @@
"named": true
},
{
"type": "nested_identifier",
"type": "member_expression",
"named": true
},
{
"type": "property_identifier",
"named": true
}
]
@ -6031,6 +6019,10 @@
"type": "/=",
"named": false
},
{
"type": "/>",
"named": false
},
{
"type": ":",
"named": false
@ -6043,6 +6035,10 @@
"type": "<",
"named": false
},
{
"type": "</",
"named": false
},
{
"type": "</template>",
"named": false
@ -6307,10 +6303,6 @@
"type": "is",
"named": false
},
{
"type": "jsx_text",
"named": true
},
{
"type": "keyof",
"named": false

253752
typescript/src/parser.c vendored

File diff suppressed because it is too large Load Diff