Merge commit '9fa49ff3315987f715ce5666ff979a7742fa8a98'

pull/647/head
Wilfred Hughes 2024-02-15 08:52:33 +07:00
commit e52849ebba
12 changed files with 448471 additions and 229522 deletions

@ -2,7 +2,7 @@
### Parsing ### Parsing
Updated JavaScript and TypeScript parser. Updated JavaScript, TypeScript and QML parsers.
## 0.55 (released 1st February 2024) ## 0.55 (released 1st February 2024)

@ -1,4 +1,6 @@
GIT = git GIT = git
GIT_LOG_FLAGS = -p --reverse
QTDECLARATIVE_GIT_ID = 49ec094b7fb1eb6675fdc1db8348409cd3ff8184
.PHONY: all .PHONY: all
all: qtdeclarative all: qtdeclarative
@ -7,4 +9,11 @@ all: qtdeclarative
qtdeclarative: qtdeclarative:
[ -d $@ ] || $(GIT) clone git://code.qt.io/qt/qtdeclarative.git $@ [ -d $@ ] || $(GIT) clone git://code.qt.io/qt/qtdeclarative.git $@
$(GIT) -C $@ fetch $(GIT) -C $@ fetch
$(GIT) -C $@ reset --hard 6ac764a4d9e3bd723e955e8e9d5efd8ef6900214 $(GIT) -C $@ reset --hard $(QTDECLARATIVE_GIT_ID)
.PHONY: review-qtdeclarative
review-qtdeclarative:
$(GIT) -C qtdeclarative log $(GIT_LOG_FLAGS) \
$(QTDECLARATIVE_GIT_ID)..origin/dev \
src/qml/compiler/qqmlirbuilder.cpp \
src/qml/parser

@ -2,7 +2,6 @@ qtdeclarative/src/quick/doc/snippets/qml/image-ext.qml
qtdeclarative/tests/auto/qml/debugger/qqmlpreview/data/broken.qml qtdeclarative/tests/auto/qml/debugger/qqmlpreview/data/broken.qml
qtdeclarative/tests/auto/qml/qmlformat/data/settings/Example1.formatted_mac_cr.qml qtdeclarative/tests/auto/qml/qmlformat/data/settings/Example1.formatted_mac_cr.qml
qtdeclarative/tests/auto/qml/qmllint/data/failure1.qml qtdeclarative/tests/auto/qml/qmllint/data/failure1.qml
qtdeclarative/tests/auto/qml/qqmlecmascript/data/compatibilitySemicolon.qml
qtdeclarative/tests/auto/qml/qqmlecmascript/data/numberParsing_error.1.qml qtdeclarative/tests/auto/qml/qqmlecmascript/data/numberParsing_error.1.qml
qtdeclarative/tests/auto/qml/qqmlecmascript/data/numberParsing_error.2.qml qtdeclarative/tests/auto/qml/qqmlecmascript/data/numberParsing_error.2.qml
qtdeclarative/tests/auto/qml/qqmlecmascript/data/stringParsing_error.5.qml qtdeclarative/tests/auto/qml/qqmlecmascript/data/stringParsing_error.5.qml
@ -24,5 +23,9 @@ qtdeclarative/tests/auto/qml/qqmllanguage/data/signal.2.qml
qtdeclarative/tests/auto/qml/qqmllanguage/data/signal.3.qml qtdeclarative/tests/auto/qml/qqmllanguage/data/signal.3.qml
qtdeclarative/tests/auto/qml/qqmllanguage/data/signal.5.qml qtdeclarative/tests/auto/qml/qqmllanguage/data/signal.5.qml
qtdeclarative/tests/auto/qml/qquickfolderlistmodel/data/dummy.qml qtdeclarative/tests/auto/qml/qquickfolderlistmodel/data/dummy.qml
qtdeclarative/tests/auto/qmlls/utils/data/completions/missingRHS.parserfail.qml
qtdeclarative/tests/auto/qmlls/utils/data/completions/missingRHS.qml
qtdeclarative/tests/auto/qmlls/utils/data/emptyFile.qml
qtdeclarative/tests/auto/quick/qquickloader/data/InvalidSourceComponent.qml qtdeclarative/tests/auto/quick/qquickloader/data/InvalidSourceComponent.qml
qtdeclarative/tests/auto/quickcontrols/controls/data/tst_scrollbar.qml qtdeclarative/tests/auto/quickcontrols/controls/data/tst_scrollbar.qml
qtdeclarative/tests/manual/qmllsformatter/test.qml

@ -2,7 +2,7 @@
// https://code.qt.io/cgit/qt/qtdeclarative.git/tree/src/qml/ // https://code.qt.io/cgit/qt/qtdeclarative.git/tree/src/qml/
// compiler/qqmlirbuilder.cpp // compiler/qqmlirbuilder.cpp
// parser/{qqmljs.g,qqmljsast_p.h,qqmljslexer.cpp} // parser/{qqmljs.g,qqmljsast_p.h,qqmljslexer.cpp}
// 6ac764a4d9e3bd723e955e8e9d5efd8ef6900214 // 49ec094b7fb1eb6675fdc1db8348409cd3ff8184
module.exports = grammar(require('tree-sitter-typescript/typescript/grammar'), { module.exports = grammar(require('tree-sitter-typescript/typescript/grammar'), {
name: 'qmljs', name: 'qmljs',
@ -21,6 +21,8 @@ module.exports = grammar(require('tree-sitter-typescript/typescript/grammar'), {
$._ui_script_statement, $._ui_script_statement,
$._ui_qualified_id, $._ui_qualified_id,
$._ui_identifier, $._ui_identifier,
$._ui_simple_qualified_id,
$._ui_reserved_identifier,
]), ]),
conflicts: ($, original) => original.concat([ conflicts: ($, original) => original.concat([
@ -45,7 +47,8 @@ module.exports = grammar(require('tree-sitter-typescript/typescript/grammar'), {
field('name', $.identifier), // PragmaId field('name', $.identifier), // PragmaId
optional(seq( optional(seq(
':', ':',
field('value', $.identifier), // TODO: or insert 'values': (ui_pragma_value_list ..)?
sep1(field('value', choice($.identifier, $.string)), ','),
)), )),
$._semicolon, $._semicolon,
), ),
@ -54,9 +57,8 @@ module.exports = grammar(require('tree-sitter-typescript/typescript/grammar'), {
'import', 'import',
field('source', choice( field('source', choice(
$.string, $.string,
$.identifier, $._ui_qualified_id,
$.nested_identifier, )), // ImportId: MemberExpression
)), // ImportId
optional(field('version', $.ui_version_specifier)), optional(field('version', $.ui_version_specifier)),
optional(seq( optional(seq(
'as', 'as',
@ -94,10 +96,7 @@ module.exports = grammar(require('tree-sitter-typescript/typescript/grammar'), {
ui_annotation: $ => seq( ui_annotation: $ => seq(
'@', '@',
field('type_name', choice( field('type_name', $._ui_simple_qualified_id),
$.identifier,
$.nested_identifier,
)), // UiSimpleQualifiedId
field('initializer', $.ui_object_initializer), field('initializer', $.ui_object_initializer),
), ),
@ -286,7 +285,7 @@ module.exports = grammar(require('tree-sitter-typescript/typescript/grammar'), {
_ui_identifier: $ => choice( _ui_identifier: $ => choice(
$.identifier, $.identifier,
alias($._reserved_identifier, $.identifier), alias($._ui_reserved_identifier, $.identifier),
), ),
ui_nested_identifier: $ => seq( ui_nested_identifier: $ => seq(
@ -295,6 +294,17 @@ module.exports = grammar(require('tree-sitter-typescript/typescript/grammar'), {
$.identifier, $.identifier,
), ),
_ui_simple_qualified_id: $ => choice(
$.identifier,
alias($.ui_simple_nested_identifier, $.nested_identifier),
),
ui_simple_nested_identifier: $ => seq(
$._ui_simple_qualified_id,
'.',
$.identifier,
),
// teach JavaScript/TypeScript grammar about QML keywords. // teach JavaScript/TypeScript grammar about QML keywords.
_reserved_identifier: ($, original) => choice( _reserved_identifier: ($, original) => choice(
original, original,
@ -308,6 +318,51 @@ module.exports = grammar(require('tree-sitter-typescript/typescript/grammar'), {
'from', 'from',
'of', 'of',
), ),
_ui_reserved_identifier: $ => choice(
// JavaScript:
'get',
'set',
'async',
'static',
'export',
'let',
// TypeScript:
'declare',
'namespace',
'type',
'public',
'private',
'protected',
'override',
'readonly',
'module',
'any',
'number',
'boolean',
'string',
'symbol',
'export',
'object',
// 'new', ('new {}' would conflict at property value position)
'readonly',
// QML (see QmlIdentifier):
'property',
'signal',
'readonly',
'on',
'from',
'of',
'required',
'component',
),
// Patch up JavaScript string rules to support multi-line string literal.
// (See also the change b16c69a70be9 in tree-sitter-javascript.)
unescaped_double_string_fragment: _ => token.immediate(prec(1, /[^"\\]+/)),
unescaped_single_string_fragment: _ => token.immediate(prec(1, /[^'\\]+/)),
}, },
}); });

@ -26,8 +26,8 @@
}, },
"devDependencies": { "devDependencies": {
"tree-sitter-cli": "^0.20.1", "tree-sitter-cli": "^0.20.1",
"tree-sitter-javascript": "github:tree-sitter/tree-sitter-javascript#7a29d06274b7cf87d643212a433d970b73969016", "tree-sitter-javascript": "0.20.3",
"tree-sitter-typescript": "github:tree-sitter/tree-sitter-typescript#faad9094f4061a43d4e9005439e9e85c6541ebe7" "tree-sitter-typescript": "0.20.5"
}, },
"tree-sitter": [ "tree-sitter": [
{ {

File diff suppressed because it is too large Load Diff

@ -11,6 +11,10 @@
"type": "conditional_type", "type": "conditional_type",
"named": true "named": true
}, },
{
"type": "const",
"named": false
},
{ {
"type": "existential_type", "type": "existential_type",
"named": true "named": true
@ -255,6 +259,10 @@
"type": "glimmer_template", "type": "glimmer_template",
"named": true "named": true
}, },
{
"type": "instantiation_expression",
"named": true
},
{ {
"type": "internal_module", "type": "internal_module",
"named": true "named": true
@ -356,7 +364,7 @@
"named": true "named": true
}, },
{ {
"type": "function", "type": "function_expression",
"named": true "named": true
}, },
{ {
@ -367,10 +375,6 @@
"type": "identifier", "type": "identifier",
"named": true "named": true
}, },
{
"type": "import",
"named": true
},
{ {
"type": "member_expression", "type": "member_expression",
"named": true "named": true
@ -620,7 +624,7 @@
"required": false, "required": false,
"types": [ "types": [
{ {
"type": "asserts", "type": "asserts_annotation",
"named": true "named": true
}, },
{ {
@ -645,12 +649,16 @@
} }
}, },
"children": { "children": {
"multiple": false, "multiple": true,
"required": false, "required": false,
"types": [ "types": [
{ {
"type": "accessibility_modifier", "type": "accessibility_modifier",
"named": true "named": true
},
{
"type": "override_modifier",
"named": true
} }
] ]
} }
@ -660,6 +668,37 @@
"named": true, "named": true,
"fields": {} "fields": {}
}, },
{
"type": "adding_type_annotation",
"named": true,
"fields": {},
"children": {
"multiple": false,
"required": true,
"types": [
{
"type": "_primary_type",
"named": true
},
{
"type": "constructor_type",
"named": true
},
{
"type": "function_type",
"named": true
},
{
"type": "infer_type",
"named": true
},
{
"type": "readonly_type",
"named": true
}
]
}
},
{ {
"type": "ambient_declaration", "type": "ambient_declaration",
"named": true, "named": true,
@ -818,7 +857,7 @@
"required": false, "required": false,
"types": [ "types": [
{ {
"type": "asserts", "type": "asserts_annotation",
"named": true "named": true
}, },
{ {
@ -901,6 +940,21 @@
] ]
} }
}, },
{
"type": "asserts_annotation",
"named": true,
"fields": {},
"children": {
"multiple": false,
"required": true,
"types": [
{
"type": "asserts",
"named": true
}
]
}
},
{ {
"type": "assignment_expression", "type": "assignment_expression",
"named": true, "named": true,
@ -1115,6 +1169,10 @@
{ {
"type": "expression", "type": "expression",
"named": true "named": true
},
{
"type": "private_property_identifier",
"named": true
} }
] ]
}, },
@ -1277,6 +1335,10 @@
{ {
"type": "expression", "type": "expression",
"named": true "named": true
},
{
"type": "import",
"named": true
} }
] ]
}, },
@ -1311,7 +1373,7 @@
"required": false, "required": false,
"types": [ "types": [
{ {
"type": "asserts", "type": "asserts_annotation",
"named": true "named": true
}, },
{ {
@ -1439,7 +1501,18 @@
{ {
"type": "class_body", "type": "class_body",
"named": true, "named": true,
"fields": {}, "fields": {
"decorator": {
"multiple": true,
"required": false,
"types": [
{
"type": "decorator",
"named": true
}
]
}
},
"children": { "children": {
"multiple": true, "multiple": true,
"required": false, "required": false,
@ -1452,10 +1525,6 @@
"type": "class_static_block", "type": "class_static_block",
"named": true "named": true
}, },
{
"type": "decorator",
"named": true
},
{ {
"type": "index_signature", "type": "index_signature",
"named": true "named": true
@ -1566,6 +1635,11 @@
} }
} }
}, },
{
"type": "comment",
"named": true,
"fields": {}
},
{ {
"type": "computed_property_name", "type": "computed_property_name",
"named": true, "named": true,
@ -2471,7 +2545,7 @@
} }
}, },
{ {
"type": "function", "type": "function_declaration",
"named": true, "named": true,
"fields": { "fields": {
"body": { "body": {
@ -2486,7 +2560,7 @@
}, },
"name": { "name": {
"multiple": false, "multiple": false,
"required": false, "required": true,
"types": [ "types": [
{ {
"type": "identifier", "type": "identifier",
@ -2509,7 +2583,7 @@
"required": false, "required": false,
"types": [ "types": [
{ {
"type": "asserts", "type": "asserts_annotation",
"named": true "named": true
}, },
{ {
@ -2535,7 +2609,7 @@
} }
}, },
{ {
"type": "function_declaration", "type": "function_expression",
"named": true, "named": true,
"fields": { "fields": {
"body": { "body": {
@ -2550,7 +2624,7 @@
}, },
"name": { "name": {
"multiple": false, "multiple": false,
"required": true, "required": false,
"types": [ "types": [
{ {
"type": "identifier", "type": "identifier",
@ -2573,7 +2647,7 @@
"required": false, "required": false,
"types": [ "types": [
{ {
"type": "asserts", "type": "asserts_annotation",
"named": true "named": true
}, },
{ {
@ -2627,7 +2701,7 @@
"required": false, "required": false,
"types": [ "types": [
{ {
"type": "asserts", "type": "asserts_annotation",
"named": true "named": true
}, },
{ {
@ -2674,6 +2748,10 @@
"type": "_primary_type", "type": "_primary_type",
"named": true "named": true
}, },
{
"type": "asserts",
"named": true
},
{ {
"type": "constructor_type", "type": "constructor_type",
"named": true "named": true
@ -2747,7 +2825,7 @@
"required": false, "required": false,
"types": [ "types": [
{ {
"type": "asserts", "type": "asserts_annotation",
"named": true "named": true
}, },
{ {
@ -2811,7 +2889,7 @@
"required": false, "required": false,
"types": [ "types": [
{ {
"type": "asserts", "type": "asserts_annotation",
"named": true "named": true
}, },
{ {
@ -2998,6 +3076,21 @@
] ]
} }
}, },
{
"type": "import_attribute",
"named": true,
"fields": {},
"children": {
"multiple": false,
"required": true,
"types": [
{
"type": "object",
"named": true
}
]
}
},
{ {
"type": "import_clause", "type": "import_clause",
"named": true, "named": true,
@ -3093,9 +3186,13 @@
} }
}, },
"children": { "children": {
"multiple": false, "multiple": true,
"required": false, "required": false,
"types": [ "types": [
{
"type": "import_attribute",
"named": true
},
{ {
"type": "import_clause", "type": "import_clause",
"named": true "named": true
@ -3151,6 +3248,10 @@
"multiple": false, "multiple": false,
"required": false, "required": false,
"types": [ "types": [
{
"type": "+",
"named": false
},
{ {
"type": "-", "type": "-",
"named": false "named": false
@ -3161,6 +3262,10 @@
"multiple": false, "multiple": false,
"required": true, "required": true,
"types": [ "types": [
{
"type": "adding_type_annotation",
"named": true
},
{ {
"type": "omitting_type_annotation", "type": "omitting_type_annotation",
"named": true "named": true
@ -3207,11 +3312,110 @@
"named": true, "named": true,
"fields": {}, "fields": {},
"children": { "children": {
"multiple": false, "multiple": true,
"required": true, "required": true,
"types": [ "types": [
{ {
"type": "type_identifier", "type": "_primary_type",
"named": true
},
{
"type": "constructor_type",
"named": true
},
{
"type": "function_type",
"named": true
},
{
"type": "infer_type",
"named": true
},
{
"type": "readonly_type",
"named": true
}
]
}
},
{
"type": "instantiation_expression",
"named": true,
"fields": {
"function": {
"multiple": false,
"required": false,
"types": [
{
"type": "identifier",
"named": true
},
{
"type": "import",
"named": true
},
{
"type": "member_expression",
"named": true
},
{
"type": "subscript_expression",
"named": true
}
]
},
"type_arguments": {
"multiple": false,
"required": true,
"types": [
{
"type": "type_arguments",
"named": true
}
]
}
},
"children": {
"multiple": false,
"required": false,
"types": [
{
"type": "expression",
"named": true
}
]
}
},
{
"type": "interface_body",
"named": true,
"fields": {},
"children": {
"multiple": true,
"required": false,
"types": [
{
"type": "call_signature",
"named": true
},
{
"type": "construct_signature",
"named": true
},
{
"type": "export_statement",
"named": true
},
{
"type": "index_signature",
"named": true
},
{
"type": "method_signature",
"named": true
},
{
"type": "property_signature",
"named": true "named": true
} }
] ]
@ -3226,7 +3430,7 @@
"required": true, "required": true,
"types": [ "types": [
{ {
"type": "object_type", "type": "interface_body",
"named": true "named": true
} }
] ]
@ -3344,10 +3548,6 @@
"type": "jsx_expression", "type": "jsx_expression",
"named": true "named": true
}, },
{
"type": "jsx_fragment",
"named": true
},
{ {
"type": "jsx_namespace_name", "type": "jsx_namespace_name",
"named": true "named": true
@ -3373,7 +3573,7 @@
"fields": { "fields": {
"name": { "name": {
"multiple": false, "multiple": false,
"required": true, "required": false,
"types": [ "types": [
{ {
"type": "identifier", "type": "identifier",
@ -3384,7 +3584,7 @@
"named": true "named": true
}, },
{ {
"type": "nested_identifier", "type": "member_expression",
"named": true "named": true
} }
] ]
@ -3421,15 +3621,15 @@
"required": false, "required": false,
"types": [ "types": [
{ {
"type": "jsx_element", "type": "html_character_reference",
"named": true "named": true
}, },
{ {
"type": "jsx_expression", "type": "jsx_element",
"named": true "named": true
}, },
{ {
"type": "jsx_fragment", "type": "jsx_expression",
"named": true "named": true
}, },
{ {
@ -3466,37 +3666,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", "type": "jsx_namespace_name",
"named": true, "named": true,
@ -3532,7 +3701,7 @@
}, },
"name": { "name": {
"multiple": false, "multiple": false,
"required": true, "required": false,
"types": [ "types": [
{ {
"type": "identifier", "type": "identifier",
@ -3543,7 +3712,7 @@
"named": true "named": true
}, },
{ {
"type": "nested_identifier", "type": "member_expression",
"named": true "named": true
} }
] ]
@ -3580,7 +3749,7 @@
}, },
"name": { "name": {
"multiple": false, "multiple": false,
"required": true, "required": false,
"types": [ "types": [
{ {
"type": "identifier", "type": "identifier",
@ -3591,7 +3760,7 @@
"named": true "named": true
}, },
{ {
"type": "nested_identifier", "type": "member_expression",
"named": true "named": true
} }
] ]
@ -3608,6 +3777,11 @@
} }
} }
}, },
{
"type": "jsx_text",
"named": true,
"fields": {}
},
{ {
"type": "labeled_statement", "type": "labeled_statement",
"named": true, "named": true,
@ -3813,6 +3987,10 @@
{ {
"type": "expression", "type": "expression",
"named": true "named": true
},
{
"type": "import",
"named": true
} }
] ]
}, },
@ -3902,7 +4080,7 @@
"required": false, "required": false,
"types": [ "types": [
{ {
"type": "asserts", "type": "asserts_annotation",
"named": true "named": true
}, },
{ {
@ -3986,7 +4164,7 @@
"required": false, "required": false,
"types": [ "types": [
{ {
"type": "asserts", "type": "asserts_annotation",
"named": true "named": true
}, },
{ {
@ -4111,10 +4289,35 @@
{ {
"type": "nested_identifier", "type": "nested_identifier",
"named": true, "named": true,
"fields": {}, "fields": {
"object": {
"multiple": false,
"required": false,
"types": [
{
"type": "identifier",
"named": true
},
{
"type": "member_expression",
"named": true
}
]
},
"property": {
"multiple": false,
"required": false,
"types": [
{
"type": "property_identifier",
"named": true
}
]
}
},
"children": { "children": {
"multiple": true, "multiple": true,
"required": true, "required": false,
"types": [ "types": [
{ {
"type": "identifier", "type": "identifier",
@ -4760,6 +4963,16 @@
"type": "public_field_definition", "type": "public_field_definition",
"named": true, "named": true,
"fields": { "fields": {
"decorator": {
"multiple": true,
"required": false,
"types": [
{
"type": "decorator",
"named": true
}
]
},
"name": { "name": {
"multiple": false, "multiple": false,
"required": true, "required": true,
@ -5084,31 +5297,16 @@
{ {
"type": "sequence_expression", "type": "sequence_expression",
"named": true, "named": true,
"fields": { "fields": {},
"left": { "children": {
"multiple": false, "multiple": true,
"required": true, "required": true,
"types": [ "types": [
{ {
"type": "expression", "type": "expression",
"named": true "named": true
} }
] ]
},
"right": {
"multiple": false,
"required": true,
"types": [
{
"type": "expression",
"named": true
},
{
"type": "sequence_expression",
"named": true
}
]
}
} }
}, },
{ {
@ -5153,6 +5351,10 @@
"type": "escape_sequence", "type": "escape_sequence",
"named": true "named": true
}, },
{
"type": "html_character_reference",
"named": true
},
{ {
"type": "string_fragment", "type": "string_fragment",
"named": true "named": true
@ -5330,6 +5532,10 @@
"type": "escape_sequence", "type": "escape_sequence",
"named": true "named": true
}, },
{
"type": "string_fragment",
"named": true
},
{ {
"type": "template_substitution", "type": "template_substitution",
"named": true "named": true
@ -5577,6 +5783,10 @@
"type": "_primary_type", "type": "_primary_type",
"named": true "named": true
}, },
{
"type": "call_expression",
"named": true
},
{ {
"type": "constructor_type", "type": "constructor_type",
"named": true "named": true
@ -5589,6 +5799,10 @@
"type": "infer_type", "type": "infer_type",
"named": true "named": true
}, },
{
"type": "member_expression",
"named": true
},
{ {
"type": "readonly_type", "type": "readonly_type",
"named": true "named": true
@ -5608,6 +5822,10 @@
"type": "_primary_type", "type": "_primary_type",
"named": true "named": true
}, },
{
"type": "call_expression",
"named": true
},
{ {
"type": "constructor_type", "type": "constructor_type",
"named": true "named": true
@ -5620,6 +5838,10 @@
"type": "infer_type", "type": "infer_type",
"named": true "named": true
}, },
{
"type": "member_expression",
"named": true
},
{ {
"type": "readonly_type", "type": "readonly_type",
"named": true "named": true
@ -5774,6 +5996,10 @@
"type": "identifier", "type": "identifier",
"named": true "named": true
}, },
{
"type": "instantiation_expression",
"named": true
},
{ {
"type": "member_expression", "type": "member_expression",
"named": true "named": true
@ -6117,12 +6343,16 @@
] ]
}, },
"value": { "value": {
"multiple": false, "multiple": true,
"required": false, "required": false,
"types": [ "types": [
{ {
"type": "identifier", "type": "identifier",
"named": true "named": true
},
{
"type": "string",
"named": true
} }
] ]
} }
@ -6637,6 +6867,10 @@
"type": "+=", "type": "+=",
"named": false "named": false
}, },
{
"type": "+?:",
"named": false
},
{ {
"type": ",", "type": ",",
"named": false "named": false
@ -6673,6 +6907,10 @@
"type": "/=", "type": "/=",
"named": false "named": false
}, },
{
"type": "/>",
"named": false
},
{ {
"type": ":", "type": ":",
"named": false "named": false
@ -6685,6 +6923,10 @@
"type": "<", "type": "<",
"named": false "named": false
}, },
{
"type": "</",
"named": false
},
{ {
"type": "</template>", "type": "</template>",
"named": false "named": false
@ -6833,10 +7075,6 @@
"type": "class", "type": "class",
"named": false "named": false
}, },
{
"type": "comment",
"named": true
},
{ {
"type": "component", "type": "component",
"named": false "named": false
@ -6921,6 +7159,14 @@
"type": "hash_bang_line", "type": "hash_bang_line",
"named": true "named": true
}, },
{
"type": "html_character_reference",
"named": true
},
{
"type": "html_comment",
"named": true
},
{ {
"type": "if", "type": "if",
"named": false "named": false
@ -6953,10 +7199,6 @@
"type": "is", "type": "is",
"named": false "named": false
}, },
{
"type": "jsx_text",
"named": true
},
{ {
"type": "keyof", "type": "keyof",
"named": false "named": false
@ -6987,11 +7229,11 @@
}, },
{ {
"type": "number", "type": "number",
"named": true "named": false
}, },
{ {
"type": "number", "type": "number",
"named": false "named": true
}, },
{ {
"type": "object", "type": "object",
@ -7149,10 +7391,18 @@
"type": "undefined", "type": "undefined",
"named": true "named": true
}, },
{
"type": "unique symbol",
"named": false
},
{ {
"type": "unknown", "type": "unknown",
"named": false "named": false
}, },
{
"type": "using",
"named": false
},
{ {
"type": "var", "type": "var",
"named": false "named": false

File diff suppressed because it is too large Load Diff

@ -1,6 +1,6 @@
/* /*
Source: Source:
github:tree-sitter/tree-sitter-typescript#0ab9d99867435a7667c5548a6617a6bf73dbd830 0.20.5
The MIT License (MIT) The MIT License (MIT)
@ -25,220 +25,300 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE. SOFTWARE.
*/ */
#include <tree_sitter/parser.h> #include "tree_sitter/parser.h"
#include <wctype.h> #include <wctype.h>
enum TokenType { enum TokenType {
AUTOMATIC_SEMICOLON, AUTOMATIC_SEMICOLON,
TEMPLATE_CHARS, TEMPLATE_CHARS,
TERNARY_QMARK, TERNARY_QMARK,
BINARY_OPERATORS, HTML_COMMENT,
FUNCTION_SIGNATURE_AUTOMATIC_SEMICOLON, LOGICAL_OR,
ESCAPE_SEQUENCE,
FUNCTION_SIGNATURE_AUTOMATIC_SEMICOLON,
ERROR_RECOVERY,
}; };
static void advance(TSLexer *lexer) { lexer->advance(lexer, false); } static void advance(TSLexer *lexer) { lexer->advance(lexer, false); }
static void skip(TSLexer *lexer) { lexer->advance(lexer, true); } static void skip(TSLexer *lexer) { lexer->advance(lexer, true); }
static bool scan_template_chars(TSLexer *lexer) { static bool scan_template_chars(TSLexer *lexer) {
lexer->result_symbol = TEMPLATE_CHARS; lexer->result_symbol = TEMPLATE_CHARS;
for (bool has_content = false;; has_content = true) { for (bool has_content = false;; has_content = true) {
lexer->mark_end(lexer); lexer->mark_end(lexer);
switch (lexer->lookahead) { switch (lexer->lookahead) {
case '`': case '`':
return has_content; return has_content;
case '\0': case '\0':
return false; return false;
case '$': case '$':
advance(lexer); advance(lexer);
if (lexer->lookahead == '{') return has_content; if (lexer->lookahead == '{') {
break; return has_content;
case '\\': }
return has_content; break;
default: case '\\':
advance(lexer); return has_content;
default:
advance(lexer);
}
} }
}
} }
static bool scan_whitespace_and_comments(TSLexer *lexer) { static bool scan_whitespace_and_comments(TSLexer *lexer, bool *scanned_comment) {
for (;;) { for (;;) {
while (iswspace(lexer->lookahead)) { while (iswspace(lexer->lookahead)) {
skip(lexer); skip(lexer);
}
if (lexer->lookahead == '/') {
skip(lexer);
if (lexer->lookahead == '/') {
skip(lexer);
while (lexer->lookahead != 0 && lexer->lookahead != '\n') {
skip(lexer);
} }
} else if (lexer->lookahead == '*') {
skip(lexer); if (lexer->lookahead == '/') {
while (lexer->lookahead != 0) {
if (lexer->lookahead == '*') {
skip(lexer); skip(lexer);
if (lexer->lookahead == '/') { if (lexer->lookahead == '/') {
skip(lexer); skip(lexer);
break; while (lexer->lookahead != 0 && lexer->lookahead != '\n') {
skip(lexer);
}
*scanned_comment = true;
} else if (lexer->lookahead == '*') {
skip(lexer);
while (lexer->lookahead != 0) {
if (lexer->lookahead == '*') {
skip(lexer);
if (lexer->lookahead == '/') {
skip(lexer);
break;
}
} else {
skip(lexer);
}
}
} else {
return false;
} }
} else { } else {
skip(lexer); return true;
}
} }
} else {
return false;
}
} else {
return true;
} }
}
} }
static bool scan_automatic_semicolon(TSLexer *lexer, const bool *valid_symbols){ static bool scan_automatic_semicolon(TSLexer *lexer, const bool *valid_symbols, bool *scanned_comment) {
lexer->result_symbol = AUTOMATIC_SEMICOLON; lexer->result_symbol = AUTOMATIC_SEMICOLON;
lexer->mark_end(lexer); lexer->mark_end(lexer);
for (;;) { for (;;) {
if (lexer->lookahead == 0) return true; if (lexer->lookahead == 0) {
if (lexer->lookahead == '}') { return true;
// Automatic semicolon insertion breaks detection of object patterns }
// in a typed context: if (lexer->lookahead == '}') {
// type F = ({a}: {a: number}) => number; // Automatic semicolon insertion breaks detection of object patterns
// Therefore, disable automatic semicolons when followed by typing // in a typed context:
do { // type F = ({a}: {a: number}) => number;
// Therefore, disable automatic semicolons when followed by typing
do {
skip(lexer);
} while (iswspace(lexer->lookahead));
if (lexer->lookahead == ':') {
return false;
}
return true;
}
if (!iswspace(lexer->lookahead)) {
return false;
}
if (lexer->lookahead == '\n') {
break;
}
skip(lexer); skip(lexer);
} while (iswspace(lexer->lookahead));
if (lexer->lookahead == ':') return false;
return true;
} }
if (!iswspace(lexer->lookahead)) return false;
if (lexer->lookahead == '\n') break;
skip(lexer); skip(lexer);
}
skip(lexer);
if (!scan_whitespace_and_comments(lexer)) return false;
switch (lexer->lookahead) {
case ',':
case '.':
case ';':
case '*':
case '%':
case '>':
case '<':
case '=':
case '?':
case '^':
case '|':
case '&':
case '/':
case ':':
return false;
case '{': if (!scan_whitespace_and_comments(lexer, scanned_comment)) {
if (valid_symbols[FUNCTION_SIGNATURE_AUTOMATIC_SEMICOLON]) return false; return false;
break; }
// Don't insert a semicolon before a '[' or '(', unless we're parsing switch (lexer->lookahead) {
// a type. Detect whether we're parsing a type or an expression using case ',':
// the validity of a binary operator token. case '.':
case '(': case ';':
case '[': case '*':
if (valid_symbols[BINARY_OPERATORS]) return false; case '%':
break; case '>':
case '<':
case '=':
case '?':
case '^':
case '|':
case '&':
case '/':
case ':':
return false;
case '{':
if (valid_symbols[FUNCTION_SIGNATURE_AUTOMATIC_SEMICOLON]) {
return false;
}
break;
// Don't insert a semicolon before a '[' or '(', unless we're parsing
// a type. Detect whether we're parsing a type or an expression using
// the validity of a binary operator token.
case '(':
case '[':
if (valid_symbols[LOGICAL_OR]) {
return false;
}
break;
// Insert a semicolon before `--` and `++`, but not before binary `+` or `-`. // Insert a semicolon before `--` and `++`, but not before binary `+` or `-`.
case '+': case '+':
skip(lexer); skip(lexer);
return lexer->lookahead == '+'; return lexer->lookahead == '+';
case '-': case '-':
skip(lexer); skip(lexer);
return lexer->lookahead == '-'; return lexer->lookahead == '-';
// Don't insert a semicolon before `!=`, but do insert one before a unary `!`. // Don't insert a semicolon before `!=`, but do insert one before a unary `!`.
case '!': case '!':
skip(lexer); skip(lexer);
return lexer->lookahead != '='; return lexer->lookahead != '=';
// Don't insert a semicolon before `in` or `instanceof`, but do insert one // Don't insert a semicolon before `in` or `instanceof`, but do insert one
// before an identifier. // before an identifier.
case 'i': case 'i':
skip(lexer); skip(lexer);
if (lexer->lookahead != 'n') return true; if (lexer->lookahead != 'n') {
skip(lexer); return true;
}
skip(lexer);
if (!iswalpha(lexer->lookahead)) return false; if (!iswalpha(lexer->lookahead)) {
return false;
}
for (unsigned i = 0; i < 8; i++) { for (unsigned i = 0; i < 8; i++) {
if (lexer->lookahead != "stanceof"[i]) return true; if (lexer->lookahead != "stanceof"[i]) {
skip(lexer); return true;
} }
skip(lexer);
}
if (!iswalpha(lexer->lookahead)) return false; if (!iswalpha(lexer->lookahead)) {
break; return false;
} }
break;
}
return true; return true;
} }
static bool scan_ternary_qmark(TSLexer *lexer) { static bool scan_ternary_qmark(TSLexer *lexer) {
for(;;) { for (;;) {
if (!iswspace(lexer->lookahead)) break; if (!iswspace(lexer->lookahead)) {
skip(lexer); break;
} }
skip(lexer);
}
if (lexer->lookahead == '?') { if (lexer->lookahead == '?') {
advance(lexer); advance(lexer);
if (lexer->lookahead == '?') return false; /* Optional chaining. */
/* Optional chaining. */ if (lexer->lookahead == '?' || lexer->lookahead == '.') {
if (lexer->lookahead == '.') return false; return false;
}
lexer->mark_end(lexer); lexer->mark_end(lexer);
lexer->result_symbol = TERNARY_QMARK; lexer->result_symbol = TERNARY_QMARK;
/* TypeScript optional arguments contain the ?: sequence, possibly
with whitespace. */
for (;;) {
if (!iswspace(lexer->lookahead)) {
break;
}
advance(lexer);
}
if (lexer->lookahead == ':' || lexer->lookahead == ')' || lexer->lookahead == ',') {
return false;
}
/* TypeScript optional arguments contain the ?: sequence, possibly if (lexer->lookahead == '.') {
with whitespace. */ advance(lexer);
for(;;) { if (iswdigit(lexer->lookahead)) {
if (!iswspace(lexer->lookahead)) break; return true;
advance(lexer); }
return false;
}
return true;
} }
if (lexer->lookahead == ':') return false; return false;
if (lexer->lookahead == ')') return false; }
if (lexer->lookahead == ',') return false;
static bool scan_closing_comment(TSLexer *lexer) {
if (lexer->lookahead == '.') { while (iswspace(lexer->lookahead) || lexer->lookahead == 0x2028 || lexer->lookahead == 0x2029) {
advance(lexer); skip(lexer);
if (iswdigit(lexer->lookahead)) return true;
return false;
} }
const char *comment_start = "<!--";
const char *comment_end = "-->";
if (lexer->lookahead == '<') {
for (unsigned i = 0; i < 4; i++) {
if (lexer->lookahead != comment_start[i]) {
return false;
}
advance(lexer);
}
} else if (lexer->lookahead == '-') {
for (unsigned i = 0; i < 3; i++) {
if (lexer->lookahead != comment_end[i]) {
return false;
}
advance(lexer);
}
} else {
return false;
}
while (lexer->lookahead != 0 && lexer->lookahead != '\n' && lexer->lookahead != 0x2028 &&
lexer->lookahead != 0x2029) {
advance(lexer);
}
lexer->result_symbol = HTML_COMMENT;
lexer->mark_end(lexer);
return true; return true;
}
return false;
} }
static inline bool external_scanner_scan(void *payload, TSLexer *lexer, const bool *valid_symbols) { static inline bool external_scanner_scan(void *payload, TSLexer *lexer, const bool *valid_symbols) {
if (valid_symbols[TEMPLATE_CHARS]) { if (valid_symbols[TEMPLATE_CHARS]) {
if (valid_symbols[AUTOMATIC_SEMICOLON]) return false; if (valid_symbols[AUTOMATIC_SEMICOLON]) {
return scan_template_chars(lexer); return false;
} else if ( }
valid_symbols[AUTOMATIC_SEMICOLON] || return scan_template_chars(lexer);
valid_symbols[FUNCTION_SIGNATURE_AUTOMATIC_SEMICOLON] }
) { if (valid_symbols[AUTOMATIC_SEMICOLON] || valid_symbols[FUNCTION_SIGNATURE_AUTOMATIC_SEMICOLON]) {
bool ret = scan_automatic_semicolon(lexer, valid_symbols); bool scanned_comment = false;
if (!ret && valid_symbols[TERNARY_QMARK] && lexer->lookahead == '?') bool ret = scan_automatic_semicolon(lexer, valid_symbols, &scanned_comment);
return scan_ternary_qmark(lexer); if (!ret && !scanned_comment && valid_symbols[TERNARY_QMARK] && lexer->lookahead == '?') {
return ret; return scan_ternary_qmark(lexer);
} }
if (valid_symbols[TERNARY_QMARK]) { return ret;
return scan_ternary_qmark(lexer); }
} if (valid_symbols[TERNARY_QMARK]) {
return scan_ternary_qmark(lexer);
return false; }
if (valid_symbols[HTML_COMMENT] && !valid_symbols[LOGICAL_OR] && !valid_symbols[ESCAPE_SEQUENCE]) {
return scan_closing_comment(lexer);
}
return false;
} }

@ -28,8 +28,7 @@ QtObject {
(statement_block (statement_block
(empty_statement)) (empty_statement))
(parenthesized_expression (parenthesized_expression
(false)) (false)))
(MISSING ";"))
(expression_statement (expression_statement
(true))))))) (true)))))))
@ -120,6 +119,50 @@ QtObject {
(ui_object_initializer)))) (ui_object_initializer))))
(ERROR)))) (ERROR))))
================================================================================
Multi-line string literal
================================================================================
// qtdeclarative/tests/auto/qml/qmllint/data/multilineString.qml
// qtdeclarative/tests/auto/qml/qqmlecmascript/data/rewriteMultiLineStrings.qml
QtObject {
property string multipart: "Hello
world"
Component.onCompleted: {
multipart = 'Hello
world' + '!';
}
}
--------------------------------------------------------------------------------
(program
(comment)
(comment)
(ui_object_definition
(identifier)
(ui_object_initializer
(ui_property
(type_identifier)
(identifier)
(expression_statement
(string
(string_fragment))))
(ui_binding
(nested_identifier
(identifier)
(identifier))
(statement_block
(expression_statement
(assignment_expression
(identifier)
(binary_expression
(string
(string_fragment))
(string
(string_fragment))))))))))
================================================================================ ================================================================================
Weird object pattern Weird object pattern
================================================================================ ================================================================================

@ -4,6 +4,8 @@ Pragma and imports
pragma Singleton pragma Singleton
pragma ListPropertyAssignBehavior: Append pragma ListPropertyAssignBehavior: Append
pragma Translator: "myTranslationContext"
pragma ValueTypeBehavior: Copy, Addressable
import QtQuick import QtQuick
import Qt.labs.platform as Platform import Qt.labs.platform as Platform
import QtQuick.Controls 2 import QtQuick.Controls 2
@ -21,6 +23,14 @@ Item {}
(ui_pragma (ui_pragma
name: (identifier) name: (identifier)
value: (identifier)) value: (identifier))
(ui_pragma
name: (identifier)
value: (string
(string_fragment)))
(ui_pragma
name: (identifier)
value: (identifier)
value: (identifier))
(ui_import (ui_import
source: (identifier)) source: (identifier))
(ui_import (ui_import
@ -290,7 +300,7 @@ MyItem {
(ui_binding (ui_binding
name: (identifier) name: (identifier)
value: (expression_statement value: (expression_statement
(function (function_expression
parameters: (formal_parameters parameters: (formal_parameters
(required_parameter (required_parameter
pattern: (identifier))) pattern: (identifier)))
@ -713,6 +723,7 @@ import QtQml
@Foo {} @Foo {}
@Bar {} @Bar {}
@Baz.Nested.Name {}
QtObject { QtObject {
@Foo {} @Foo {}
@Bar {} @Bar {}
@ -731,6 +742,13 @@ QtObject {
annotation: (ui_annotation annotation: (ui_annotation
type_name: (identifier) type_name: (identifier)
initializer: (ui_object_initializer)) initializer: (ui_object_initializer))
annotation: (ui_annotation
type_name: (nested_identifier
(nested_identifier
(identifier)
(identifier))
(identifier))
initializer: (ui_object_initializer))
definition: (ui_object_definition definition: (ui_object_definition
type_name: (identifier) type_name: (identifier)
initializer: (ui_object_initializer initializer: (ui_object_initializer

@ -3,14 +3,6 @@ Reserved words as identifiers
================================================================================ ================================================================================
MyItem { MyItem {
NumberAnimation {
required property
}
NumberAnimation {
property: "foo"
}
Component { Component {
id: component id: component
} }
@ -42,6 +34,60 @@ MyItem {
property var yield property var yield
} }
QtObject {
required any
required async
required component
required declare
required from
required get
required module
required namespace
required never
required number
required object
required of
required on
required override
required property
required readonly
required required
required set
required signal
required string
required symbol
required type
required unknown
required yield
}
QtObject {
any: "foo"
async: "foo"
component: "foo"
declare: "foo"
from: "foo"
get: "foo"
module: "foo"
namespace: "foo"
never: "foo"
number: "foo"
object: "foo"
of: "foo"
on: "foo"
override: "foo"
property: "foo"
readonly: "foo"
required: "foo"
set: "foo"
signal: "foo"
string: "foo"
symbol: "foo"
type: "foo"
unknown: "foo"
yield: "foo"
}
QtObject { QtObject {
signal any signal any
signal async signal async
@ -94,19 +140,6 @@ MyItem {
root: (ui_object_definition root: (ui_object_definition
type_name: (identifier) type_name: (identifier)
initializer: (ui_object_initializer initializer: (ui_object_initializer
(ui_object_definition
type_name: (identifier)
initializer: (ui_object_initializer
(ui_required
name: (identifier))))
(ui_object_definition
type_name: (identifier)
initializer: (ui_object_initializer
(ui_binding
name: (identifier)
value: (expression_statement
(string
(string_fragment))))))
(ui_object_definition (ui_object_definition
type_name: (identifier) type_name: (identifier)
initializer: (ui_object_initializer initializer: (ui_object_initializer
@ -189,6 +222,180 @@ MyItem {
(ui_property (ui_property
type: (type_identifier) type: (type_identifier)
name: (identifier)))) name: (identifier))))
(ui_object_definition
type_name: (identifier)
initializer: (ui_object_initializer
(ui_required
name: (identifier))
(ui_required
name: (identifier))
(ui_required
name: (identifier))
(ui_required
name: (identifier))
(ui_required
name: (identifier))
(ui_required
name: (identifier))
(ui_required
name: (identifier))
(ui_required
name: (identifier))
(ui_required
name: (identifier))
(ui_required
name: (identifier))
(ui_required
name: (identifier))
(ui_required
name: (identifier))
(ui_required
name: (identifier))
(ui_required
name: (identifier))
(ui_required
name: (identifier))
(ui_required
name: (identifier))
(ui_required
name: (identifier))
(ui_required
name: (identifier))
(ui_required
name: (identifier))
(ui_required
name: (identifier))
(ui_required
name: (identifier))
(ui_required
name: (identifier))
(ui_required
name: (identifier))
(ui_required
name: (identifier))))
(ui_object_definition
type_name: (identifier)
initializer: (ui_object_initializer
(ui_binding
name: (identifier)
value: (expression_statement
(string
(string_fragment))))
(ui_binding
name: (identifier)
value: (expression_statement
(string
(string_fragment))))
(ui_binding
name: (identifier)
value: (expression_statement
(string
(string_fragment))))
(ui_binding
name: (identifier)
value: (expression_statement
(string
(string_fragment))))
(ui_binding
name: (identifier)
value: (expression_statement
(string
(string_fragment))))
(ui_binding
name: (identifier)
value: (expression_statement
(string
(string_fragment))))
(ui_binding
name: (identifier)
value: (expression_statement
(string
(string_fragment))))
(ui_binding
name: (identifier)
value: (expression_statement
(string
(string_fragment))))
(ui_binding
name: (identifier)
value: (expression_statement
(string
(string_fragment))))
(ui_binding
name: (identifier)
value: (expression_statement
(string
(string_fragment))))
(ui_binding
name: (identifier)
value: (expression_statement
(string
(string_fragment))))
(ui_binding
name: (identifier)
value: (expression_statement
(string
(string_fragment))))
(ui_binding
name: (identifier)
value: (expression_statement
(string
(string_fragment))))
(ui_binding
name: (identifier)
value: (expression_statement
(string
(string_fragment))))
(ui_binding
name: (identifier)
value: (expression_statement
(string
(string_fragment))))
(ui_binding
name: (identifier)
value: (expression_statement
(string
(string_fragment))))
(ui_binding
name: (identifier)
value: (expression_statement
(string
(string_fragment))))
(ui_binding
name: (identifier)
value: (expression_statement
(string
(string_fragment))))
(ui_binding
name: (identifier)
value: (expression_statement
(string
(string_fragment))))
(ui_binding
name: (identifier)
value: (expression_statement
(string
(string_fragment))))
(ui_binding
name: (identifier)
value: (expression_statement
(string
(string_fragment))))
(ui_binding
name: (identifier)
value: (expression_statement
(string
(string_fragment))))
(ui_binding
name: (identifier)
value: (expression_statement
(string
(string_fragment))))
(ui_binding
name: (identifier)
value: (expression_statement
(string
(string_fragment))))))
(ui_object_definition (ui_object_definition
type_name: (identifier) type_name: (identifier)
initializer: (ui_object_initializer initializer: (ui_object_initializer