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
Updated JavaScript and TypeScript parser.
Updated JavaScript, TypeScript and QML parsers.
## 0.55 (released 1st February 2024)

@ -1,4 +1,6 @@
GIT = git
GIT_LOG_FLAGS = -p --reverse
QTDECLARATIVE_GIT_ID = 49ec094b7fb1eb6675fdc1db8348409cd3ff8184
.PHONY: all
all: qtdeclarative
@ -7,4 +9,11 @@ all: qtdeclarative
qtdeclarative:
[ -d $@ ] || $(GIT) clone git://code.qt.io/qt/qtdeclarative.git $@
$(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/qmlformat/data/settings/Example1.formatted_mac_cr.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.2.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.5.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/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/
// compiler/qqmlirbuilder.cpp
// parser/{qqmljs.g,qqmljsast_p.h,qqmljslexer.cpp}
// 6ac764a4d9e3bd723e955e8e9d5efd8ef6900214
// 49ec094b7fb1eb6675fdc1db8348409cd3ff8184
module.exports = grammar(require('tree-sitter-typescript/typescript/grammar'), {
name: 'qmljs',
@ -21,6 +21,8 @@ module.exports = grammar(require('tree-sitter-typescript/typescript/grammar'), {
$._ui_script_statement,
$._ui_qualified_id,
$._ui_identifier,
$._ui_simple_qualified_id,
$._ui_reserved_identifier,
]),
conflicts: ($, original) => original.concat([
@ -45,7 +47,8 @@ module.exports = grammar(require('tree-sitter-typescript/typescript/grammar'), {
field('name', $.identifier), // PragmaId
optional(seq(
':',
field('value', $.identifier),
// TODO: or insert 'values': (ui_pragma_value_list ..)?
sep1(field('value', choice($.identifier, $.string)), ','),
)),
$._semicolon,
),
@ -54,9 +57,8 @@ module.exports = grammar(require('tree-sitter-typescript/typescript/grammar'), {
'import',
field('source', choice(
$.string,
$.identifier,
$.nested_identifier,
)), // ImportId
$._ui_qualified_id,
)), // ImportId: MemberExpression
optional(field('version', $.ui_version_specifier)),
optional(seq(
'as',
@ -94,10 +96,7 @@ module.exports = grammar(require('tree-sitter-typescript/typescript/grammar'), {
ui_annotation: $ => seq(
'@',
field('type_name', choice(
$.identifier,
$.nested_identifier,
)), // UiSimpleQualifiedId
field('type_name', $._ui_simple_qualified_id),
field('initializer', $.ui_object_initializer),
),
@ -286,7 +285,7 @@ module.exports = grammar(require('tree-sitter-typescript/typescript/grammar'), {
_ui_identifier: $ => choice(
$.identifier,
alias($._reserved_identifier, $.identifier),
alias($._ui_reserved_identifier, $.identifier),
),
ui_nested_identifier: $ => seq(
@ -295,6 +294,17 @@ module.exports = grammar(require('tree-sitter-typescript/typescript/grammar'), {
$.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.
_reserved_identifier: ($, original) => choice(
original,
@ -308,6 +318,51 @@ module.exports = grammar(require('tree-sitter-typescript/typescript/grammar'), {
'from',
'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": {
"tree-sitter-cli": "^0.20.1",
"tree-sitter-javascript": "github:tree-sitter/tree-sitter-javascript#7a29d06274b7cf87d643212a433d970b73969016",
"tree-sitter-typescript": "github:tree-sitter/tree-sitter-typescript#faad9094f4061a43d4e9005439e9e85c6541ebe7"
"tree-sitter-javascript": "0.20.3",
"tree-sitter-typescript": "0.20.5"
},
"tree-sitter": [
{

File diff suppressed because it is too large Load Diff

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

File diff suppressed because it is too large Load Diff

@ -1,6 +1,6 @@
/*
Source:
github:tree-sitter/tree-sitter-typescript#0ab9d99867435a7667c5548a6617a6bf73dbd830
0.20.5
The MIT License (MIT)
@ -25,18 +25,23 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
*/
#include <tree_sitter/parser.h>
#include "tree_sitter/parser.h"
#include <wctype.h>
enum TokenType {
AUTOMATIC_SEMICOLON,
TEMPLATE_CHARS,
TERNARY_QMARK,
BINARY_OPERATORS,
HTML_COMMENT,
LOGICAL_OR,
ESCAPE_SEQUENCE,
FUNCTION_SIGNATURE_AUTOMATIC_SEMICOLON,
ERROR_RECOVERY,
};
static void advance(TSLexer *lexer) { lexer->advance(lexer, false); }
static void skip(TSLexer *lexer) { lexer->advance(lexer, true); }
static bool scan_template_chars(TSLexer *lexer) {
@ -50,7 +55,9 @@ static bool scan_template_chars(TSLexer *lexer) {
return false;
case '$':
advance(lexer);
if (lexer->lookahead == '{') return has_content;
if (lexer->lookahead == '{') {
return has_content;
}
break;
case '\\':
return has_content;
@ -60,7 +67,7 @@ static bool scan_template_chars(TSLexer *lexer) {
}
}
static bool scan_whitespace_and_comments(TSLexer *lexer) {
static bool scan_whitespace_and_comments(TSLexer *lexer, bool *scanned_comment) {
for (;;) {
while (iswspace(lexer->lookahead)) {
skip(lexer);
@ -74,6 +81,7 @@ static bool scan_whitespace_and_comments(TSLexer *lexer) {
while (lexer->lookahead != 0 && lexer->lookahead != '\n') {
skip(lexer);
}
*scanned_comment = true;
} else if (lexer->lookahead == '*') {
skip(lexer);
while (lexer->lookahead != 0) {
@ -96,12 +104,14 @@ static bool scan_whitespace_and_comments(TSLexer *lexer) {
}
}
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->mark_end(lexer);
for (;;) {
if (lexer->lookahead == 0) return true;
if (lexer->lookahead == 0) {
return true;
}
if (lexer->lookahead == '}') {
// Automatic semicolon insertion breaks detection of object patterns
// in a typed context:
@ -110,17 +120,25 @@ static bool scan_automatic_semicolon(TSLexer *lexer, const bool *valid_symbols){
do {
skip(lexer);
} while (iswspace(lexer->lookahead));
if (lexer->lookahead == ':') return false;
if (lexer->lookahead == ':') {
return false;
}
return true;
}
if (!iswspace(lexer->lookahead)) return false;
if (lexer->lookahead == '\n') break;
if (!iswspace(lexer->lookahead)) {
return false;
}
if (lexer->lookahead == '\n') {
break;
}
skip(lexer);
}
skip(lexer);
if (!scan_whitespace_and_comments(lexer)) return false;
if (!scan_whitespace_and_comments(lexer, scanned_comment)) {
return false;
}
switch (lexer->lookahead) {
case ',':
@ -140,7 +158,9 @@ static bool scan_automatic_semicolon(TSLexer *lexer, const bool *valid_symbols){
return false;
case '{':
if (valid_symbols[FUNCTION_SIGNATURE_AUTOMATIC_SEMICOLON]) return false;
if (valid_symbols[FUNCTION_SIGNATURE_AUTOMATIC_SEMICOLON]) {
return false;
}
break;
// Don't insert a semicolon before a '[' or '(', unless we're parsing
@ -148,7 +168,9 @@ static bool scan_automatic_semicolon(TSLexer *lexer, const bool *valid_symbols){
// the validity of a binary operator token.
case '(':
case '[':
if (valid_symbols[BINARY_OPERATORS]) return false;
if (valid_symbols[LOGICAL_OR]) {
return false;
}
break;
// Insert a semicolon before `--` and `++`, but not before binary `+` or `-`.
@ -169,17 +191,25 @@ static bool scan_automatic_semicolon(TSLexer *lexer, const bool *valid_symbols){
case 'i':
skip(lexer);
if (lexer->lookahead != 'n') return true;
if (lexer->lookahead != 'n') {
return true;
}
skip(lexer);
if (!iswalpha(lexer->lookahead)) return false;
if (!iswalpha(lexer->lookahead)) {
return false;
}
for (unsigned i = 0; i < 8; i++) {
if (lexer->lookahead != "stanceof"[i]) return true;
if (lexer->lookahead != "stanceof"[i]) {
return true;
}
skip(lexer);
}
if (!iswalpha(lexer->lookahead)) return false;
if (!iswalpha(lexer->lookahead)) {
return false;
}
break;
}
@ -188,16 +218,19 @@ static bool scan_automatic_semicolon(TSLexer *lexer, const bool *valid_symbols){
static bool scan_ternary_qmark(TSLexer *lexer) {
for (;;) {
if (!iswspace(lexer->lookahead)) break;
if (!iswspace(lexer->lookahead)) {
break;
}
skip(lexer);
}
if (lexer->lookahead == '?') {
advance(lexer);
if (lexer->lookahead == '?') return false;
/* Optional chaining. */
if (lexer->lookahead == '.') return false;
if (lexer->lookahead == '?' || lexer->lookahead == '.') {
return false;
}
lexer->mark_end(lexer);
lexer->result_symbol = TERNARY_QMARK;
@ -205,16 +238,21 @@ static bool scan_ternary_qmark(TSLexer *lexer) {
/* TypeScript optional arguments contain the ?: sequence, possibly
with whitespace. */
for (;;) {
if (!iswspace(lexer->lookahead)) break;
if (!iswspace(lexer->lookahead)) {
break;
}
advance(lexer);
}
if (lexer->lookahead == ':') return false;
if (lexer->lookahead == ')') return false;
if (lexer->lookahead == ',') return false;
if (lexer->lookahead == ':' || lexer->lookahead == ')' || lexer->lookahead == ',') {
return false;
}
if (lexer->lookahead == '.') {
advance(lexer);
if (iswdigit(lexer->lookahead)) return true;
if (iswdigit(lexer->lookahead)) {
return true;
}
return false;
}
return true;
@ -222,23 +260,65 @@ static bool scan_ternary_qmark(TSLexer *lexer) {
return false;
}
static bool scan_closing_comment(TSLexer *lexer) {
while (iswspace(lexer->lookahead) || lexer->lookahead == 0x2028 || lexer->lookahead == 0x2029) {
skip(lexer);
}
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;
}
static inline bool external_scanner_scan(void *payload, TSLexer *lexer, const bool *valid_symbols) {
if (valid_symbols[TEMPLATE_CHARS]) {
if (valid_symbols[AUTOMATIC_SEMICOLON]) return false;
if (valid_symbols[AUTOMATIC_SEMICOLON]) {
return false;
}
return scan_template_chars(lexer);
} else if (
valid_symbols[AUTOMATIC_SEMICOLON] ||
valid_symbols[FUNCTION_SIGNATURE_AUTOMATIC_SEMICOLON]
) {
bool ret = scan_automatic_semicolon(lexer, valid_symbols);
if (!ret && valid_symbols[TERNARY_QMARK] && lexer->lookahead == '?')
}
if (valid_symbols[AUTOMATIC_SEMICOLON] || valid_symbols[FUNCTION_SIGNATURE_AUTOMATIC_SEMICOLON]) {
bool scanned_comment = false;
bool ret = scan_automatic_semicolon(lexer, valid_symbols, &scanned_comment);
if (!ret && !scanned_comment && valid_symbols[TERNARY_QMARK] && lexer->lookahead == '?') {
return scan_ternary_qmark(lexer);
}
return ret;
}
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
(empty_statement))
(parenthesized_expression
(false))
(MISSING ";"))
(false)))
(expression_statement
(true)))))))
@ -120,6 +119,50 @@ QtObject {
(ui_object_initializer))))
(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
================================================================================

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

@ -3,14 +3,6 @@ Reserved words as identifiers
================================================================================
MyItem {
NumberAnimation {
required property
}
NumberAnimation {
property: "foo"
}
Component {
id: component
}
@ -42,6 +34,60 @@ MyItem {
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 {
signal any
signal async
@ -94,19 +140,6 @@ MyItem {
root: (ui_object_definition
type_name: (identifier)
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
type_name: (identifier)
initializer: (ui_object_initializer
@ -189,6 +222,180 @@ MyItem {
(ui_property
type: (type_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
type_name: (identifier)
initializer: (ui_object_initializer