Merge commit '49e82b1bce36d6046df911901684cd66b5345d58'

pull/315/head
Wilfred Hughes 2022-07-10 23:42:32 +07:00
commit 1edf6c488e
11 changed files with 255908 additions and 259045 deletions

@ -11,6 +11,7 @@ examples/desktop
examples/redux
examples/vscode
log.html
yarn.lock
# These files would be generated by 'tree-sitter generate' with the default
# settings. We don't want them because there's already a copy at the root.

@ -767,7 +767,7 @@ type T = typeof array[number];
(type_alias_declaration (type_identifier)
(intersection_type (index_type_query (type_identifier)) (type_identifier)))
(type_alias_declaration (type_identifier)
(type_query (subscript_expression (identifier) (predefined_type)))))
(lookup_type (type_query (identifier)) (predefined_type))))
=======================================
Lookup types
@ -876,6 +876,30 @@ function isT(t: T): t is T {
(type_identifier)))
(statement_block (return_statement (true)))))
==================================
Type predicate and predefined types
==================================
function isFish(pet: Fish): pet is Fish {
}
function isFish(object: Fish): object is Fish {
}
---
(program
(function_declaration (identifier)
(formal_parameters
(required_parameter (identifier) (type_annotation (type_identifier))))
(type_predicate_annotation (type_predicate (identifier) (type_identifier)))
(statement_block))
(function_declaration (identifier)
(formal_parameters
(required_parameter (identifier) (type_annotation (type_identifier))))
(type_predicate_annotation (type_predicate (identifier) (type_identifier)))
(statement_block))
)
==================================
Read-only arrays
==================================
@ -1318,9 +1342,10 @@ type T = Foo<Bar<typeof bar["baz"]>>
(generic_type
(type_identifier)
(type_arguments
(type_query
(subscript_expression
(identifier)
(lookup_type
(type_query
(identifier))
(literal_type
(string
(string_fragment))))))))))
@ -1356,3 +1381,84 @@ type T = Foo<any, unknown, number, string, void, true, false, null, undefined, 0
(literal_type
(string
(string_fragment)))))))
==================================
Extends
==================================
type Foo<T extends abstract new (...args: any) => any> = T;
type Foo<T extends new (...args: any) => any> = T;
---
(program
(type_alias_declaration
(type_identifier)
(type_parameters
(type_parameter
(type_identifier)
(constraint
(constructor_type
(formal_parameters
(required_parameter
(rest_pattern
(identifier))
(type_annotation
(predefined_type))))
(predefined_type)))))
(type_identifier))
(type_alias_declaration
(type_identifier)
(type_parameters
(type_parameter
(type_identifier)
(constraint
(constructor_type
(formal_parameters
(required_parameter
(rest_pattern
(identifier))
(type_annotation
(predefined_type))))
(predefined_type)))))
(type_identifier)))
========
Abstract
========
type Foo<T> = abstract new () => T;
---
(program (type_alias_declaration (type_identifier) (type_parameters (type_parameter (type_identifier))) (constructor_type (formal_parameters) (type_identifier))))
=========================
Indexed Access Precedence
=========================
// These should generate the same AST aside from the parenthesized_type node
type X1 = typeof Y[keyof typeof Z];
type X2 = (typeof Y)[keyof typeof Z];
---
(program
(comment)
(type_alias_declaration
(type_identifier)
(lookup_type
(type_query
(identifier))
(index_type_query
(type_query
(identifier)))))
(type_alias_declaration
(type_identifier)
(lookup_type
(parenthesized_type
(type_query
(identifier)))
(index_type_query
(type_query
(identifier))))))

@ -45,6 +45,7 @@ module.exports = function defineGrammar(dialect) {
[$.readonly_type, $.pattern],
[$.readonly_type, $.primary_expression],
[$.type_query, $.subscript_expression, $.expression],
[$.type_query, $._type_query_subscript_expression],
[$.nested_type_identifier, $.generic_type, $._primary_type, $.lookup_type, $.index_type_query, $._type],
[$.as_expression, $._primary_type],
[$._type_query_member_expression, $.member_expression],
@ -624,6 +625,7 @@ module.exports = function defineGrammar(dialect) {
),
constructor_type: $ => prec.left(seq(
optional('abstract'),
'new',
field('type_parameters', optional($.type_parameters)),
field('parameters', $.formal_parameters),
@ -685,7 +687,16 @@ module.exports = function defineGrammar(dialect) {
)),
type_predicate: $ => seq(
field('name', choice($.identifier, $.this)),
field('name', choice(
$.identifier,
$.this,
// Sometimes tree-sitter contextual lexing is not good enough to know
// that 'object' in ':object is foo' is really an identifier and not
// a predefined_type, so we must explicitely list all possibilities.
// TODO: should we use '_reserved_identifier'? Should all the element in
// 'predefined_type' be added to '_reserved_identifier'?
alias($.predefined_type, $.identifier)
)),
'is',
field('type', $._type)
),
@ -857,6 +868,7 @@ module.exports = function defineGrammar(dialect) {
),
construct_signature: $ => seq(
optional('abstract'),
'new',
field('type_parameters', optional($.type_parameters)),
field('parameters', $.formal_parameters),

@ -172,19 +172,19 @@ static bool scan_ternary_qmark(TSLexer *lexer) {
/* Optional chaining. */
if (lexer->lookahead == '.') return false;
lexer->mark_end(lexer);
lexer->result_symbol = TERNARY_QMARK;
/* TypeScript optional arguments contain the ?: sequence, possibly
with whitespace. */
for(;;) {
if (!iswspace(lexer->lookahead)) break;
skip(lexer);
advance(lexer);
}
if (lexer->lookahead == ':') return false;
if (lexer->lookahead == ')') return false;
if (lexer->lookahead == ',') return false;
lexer->mark_end(lexer);
lexer->result_symbol = TERNARY_QMARK;
if (lexer->lookahead == '.') {
advance(lexer);
if (iswdigit(lexer->lookahead)) return true;

@ -8503,6 +8503,18 @@
"content": {
"type": "SEQ",
"members": [
{
"type": "CHOICE",
"members": [
{
"type": "STRING",
"value": "abstract"
},
{
"type": "BLANK"
}
]
},
{
"type": "STRING",
"value": "new"
@ -8803,6 +8815,15 @@
{
"type": "SYMBOL",
"name": "this"
},
{
"type": "ALIAS",
"content": {
"type": "SYMBOL",
"name": "predefined_type"
},
"named": true,
"value": "identifier"
}
]
}
@ -9787,6 +9808,18 @@
"construct_signature": {
"type": "SEQ",
"members": [
{
"type": "CHOICE",
"members": [
{
"type": "STRING",
"value": "abstract"
},
{
"type": "BLANK"
}
]
},
{
"type": "STRING",
"value": "new"
@ -10790,6 +10823,16 @@
"name": "expression"
}
],
[
{
"type": "SYMBOL",
"name": "type_query"
},
{
"type": "SYMBOL",
"name": "_type_query_subscript_expression"
}
],
[
{
"type": "SYMBOL",

@ -2742,6 +2742,11 @@
}
}
},
{
"type": "identifier",
"named": true,
"fields": {}
},
{
"type": "if_statement",
"named": true,
@ -6111,10 +6116,6 @@
"type": "hash_bang_line",
"named": true
},
{
"type": "identifier",
"named": true
},
{
"type": "if",
"named": false

File diff suppressed because it is too large Load Diff

@ -8499,6 +8499,18 @@
"content": {
"type": "SEQ",
"members": [
{
"type": "CHOICE",
"members": [
{
"type": "STRING",
"value": "abstract"
},
{
"type": "BLANK"
}
]
},
{
"type": "STRING",
"value": "new"
@ -8799,6 +8811,15 @@
{
"type": "SYMBOL",
"name": "this"
},
{
"type": "ALIAS",
"content": {
"type": "SYMBOL",
"name": "predefined_type"
},
"named": true,
"value": "identifier"
}
]
}
@ -9783,6 +9804,18 @@
"construct_signature": {
"type": "SEQ",
"members": [
{
"type": "CHOICE",
"members": [
{
"type": "STRING",
"value": "abstract"
},
{
"type": "BLANK"
}
]
},
{
"type": "STRING",
"value": "new"
@ -10786,6 +10819,16 @@
"name": "expression"
}
],
[
{
"type": "SYMBOL",
"name": "type_query"
},
{
"type": "SYMBOL",
"name": "_type_query_subscript_expression"
}
],
[
{
"type": "SYMBOL",

@ -2734,6 +2734,11 @@
}
}
},
{
"type": "identifier",
"named": true,
"fields": {}
},
{
"type": "if_statement",
"named": true,
@ -6122,10 +6127,6 @@
"type": "hash_bang_line",
"named": true
},
{
"type": "identifier",
"named": true
},
{
"type": "if",
"named": false

File diff suppressed because it is too large Load Diff

@ -1,19 +0,0 @@
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1
"nan@^2.12.1", "nan@^2.14.0":
"integrity" "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ=="
"resolved" "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz"
"version" "2.15.0"
"tree-sitter-cli@^0.20.0":
"integrity" "sha512-4D1qapWbJXZ5rrSUGM5rcw5Vuq/smzn9KbiFRhlON6KeuuXjra+KAtDYVrDgAoLIG4ku+jbEEGrJxCptUGi3dg=="
"resolved" "https://registry.npmjs.org/tree-sitter-cli/-/tree-sitter-cli-0.20.0.tgz"
"version" "0.20.0"
"tree-sitter-javascript@github:tree-sitter/tree-sitter-javascript#fdeb68a":
"resolved" "git+ssh://git@github.com/tree-sitter/tree-sitter-javascript.git#fdeb68ac8d2bd5a78b943528bb68ceda3aade2eb"
"version" "0.20.0"
dependencies:
"nan" "^2.12.1"