unified: Add more fields

A lot of changes, but for the most part these are just adding named
fields in places where they make sense.

After this, there are still ~20 instances of unnamed children appearing.
This commit is contained in:
Taus
2026-05-12 13:59:56 +00:00
parent c75d819a92
commit d6ef467fba
2 changed files with 343 additions and 251 deletions

View File

@@ -291,7 +291,7 @@ module.exports = grammar({
"package",
$._parameter_ownership_modifier
),
identifier: ($) => sep1($.simple_identifier, $._dot),
identifier: ($) => sep1(field("part", $.simple_identifier), $._dot),
// Literals
_basic_literal: ($) =>
choice(
@@ -355,13 +355,13 @@ module.exports = grammar({
seq(
field("text", $.raw_str_part),
field("interpolation", $.raw_str_interpolation),
optional($.raw_str_continuing_indicator)
field("continuing", optional($.raw_str_continuing_indicator))
)
),
field("text", $.raw_str_end_part)
),
raw_str_interpolation: ($) =>
seq($.raw_str_interpolation_start, $._interpolation_contents, ")"),
seq(field("start", $.raw_str_interpolation_start), $._interpolation_contents, ")"),
raw_str_interpolation_start: ($) => /\\#*\(/,
_multi_line_string_content: ($) =>
choice($.multi_line_str_text, $.str_escaped_char, '"'),
@@ -410,7 +410,7 @@ module.exports = grammar({
_possibly_implicitly_unwrapped_type: ($) =>
choice($.type, $.implicitly_unwrapped_type),
implicitly_unwrapped_type: ($) =>
seq($.type, token.immediate("!")),
seq(field("name", $.type), token.immediate("!")),
type: ($) =>
prec.right(
PRECS.ty,
@@ -436,7 +436,7 @@ module.exports = grammar({
)
),
// The grammar just calls this whole thing a `type-identifier` but that's a bit confusing.
user_type: ($) => sep1($._simple_user_type, $._dot),
user_type: ($) => sep1(field("part", $._simple_user_type), $._dot),
_simple_user_type: ($) =>
prec.right(
PRECS.ty,
@@ -459,7 +459,7 @@ module.exports = grammar({
PRECS.expr,
seq(
optional($._tuple_type_item_identifier),
optional($.parameter_modifiers),
field("modifiers", optional($.parameter_modifiers)),
field("type", $.type)
)
),
@@ -475,8 +475,8 @@ module.exports = grammar({
function_type: ($) =>
seq(
field("params", choice($.tuple_type, $.unannotated_type)),
optional($._async_keyword),
optional(choice($.throws_clause, $.throws)),
field("async", optional($._async_keyword)),
field("throws", optional(choice($.throws_clause, $.throws))),
$._arrow_operator,
field("return_type", $.type)
),
@@ -493,18 +493,18 @@ module.exports = grammar({
repeat1(alias($._immediate_quest, "?"))
)
),
metatype: ($) => seq($.unannotated_type, ".", choice("Type", "Protocol")),
metatype: ($) => seq(field("name", $.unannotated_type), ".", choice("Type", "Protocol")),
_quest: ($) => "?",
_immediate_quest: ($) => token.immediate("?"),
opaque_type: ($) => prec.right(seq("some", $.unannotated_type)),
existential_type: ($) => prec.right(seq("any", $.unannotated_type)),
type_parameter_pack: ($) => prec.left(seq("each", $.unannotated_type)),
type_pack_expansion: ($) => prec.left(seq("repeat", $.unannotated_type)),
opaque_type: ($) => prec.right(seq("some", field("name", $.unannotated_type))),
existential_type: ($) => prec.right(seq("any", field("name", $.unannotated_type))),
type_parameter_pack: ($) => prec.left(seq("each", field("name", $.unannotated_type))),
type_pack_expansion: ($) => prec.left(seq("repeat", field("name", $.unannotated_type))),
protocol_composition_type: ($) =>
prec.left(
seq(
$.unannotated_type,
repeat1(seq("&", prec.right($.unannotated_type)))
field("type", $.unannotated_type),
repeat1(seq("&", prec.right(field("type", $.unannotated_type))))
)
),
suppressed_constraint: ($) =>
@@ -535,7 +535,7 @@ module.exports = grammar({
)
),
optional_chain_marker: ($) =>
seq($.expression, alias($._immediate_quest, "?")),
seq(field("expr", $.expression), alias($._immediate_quest, "?")),
// Unary expressions
_unary_expression: ($) =>
choice(
@@ -568,7 +568,7 @@ module.exports = grammar({
"constructed_type",
choice($.array_type, $.dictionary_type, $.user_type)
),
$.constructor_suffix
field("suffix", $.constructor_suffix)
)
),
_parenthesized_type: ($) =>
@@ -626,7 +626,7 @@ module.exports = grammar({
as_expression: ($) =>
prec.left(
PRECS.as,
seq(field("expr", $.expression), $.as_operator, field("type", $.type))
seq(field("expr", $.expression), field("operator", $.as_operator), field("type", $.type))
),
selector_expression: ($) =>
seq(
@@ -634,7 +634,7 @@ module.exports = grammar({
"selector",
"(",
optional(choice("getter:", "setter:")),
$.expression,
field("expr", $.expression),
")"
),
// Binary expressions
@@ -778,15 +778,15 @@ module.exports = grammar({
)
),
_constructor_value_arguments: ($) =>
seq("(", optional(sep1Opt($.value_argument, ",")), ")"),
seq("(", optional(sep1Opt(field("argument", $.value_argument), ",")), ")"),
_fn_call_lambda_arguments: ($) =>
sep1($.lambda_literal, seq(field("name", $.simple_identifier), ":")),
type_arguments: ($) => prec.left(seq("<", sep1Opt($.type, ","), ">")),
type_arguments: ($) => prec.left(seq("<", sep1Opt(field("argument", $.type), ","), ">")),
value_arguments: ($) =>
seq(
choice(
seq("(", optional(sep1Opt($.value_argument, ",")), ")"),
seq("[", optional(sep1Opt($.value_argument, ",")), "]")
seq("(", optional(sep1Opt(field("argument", $.value_argument), ",")), ")"),
seq("[", optional(sep1Opt(field("argument", $.value_argument), ",")), "]")
)
),
value_argument_label: ($) =>
@@ -802,7 +802,7 @@ module.exports = grammar({
value_argument: ($) =>
prec.left(
seq(
optional($.type_modifiers),
field("type_modifiers", optional($.type_modifiers)),
choice(
repeat1(
seq(field("reference_specifier", $.value_argument_label), ":")
@@ -818,7 +818,7 @@ module.exports = grammar({
prec.right(
PRECS["try"],
seq(
$.try_operator,
field("operator", $.try_operator),
field(
"expr",
choice(
@@ -885,7 +885,7 @@ module.exports = grammar({
call_expression: ($) =>
prec(
PRECS.call,
prec.dynamic(DYNAMIC_PRECS.call, seq($.expression, $.call_suffix))
prec.dynamic(DYNAMIC_PRECS.call, seq(field("function", $.expression), field("suffix", $.call_suffix)))
),
macro_invocation: ($) =>
prec(
@@ -894,9 +894,9 @@ module.exports = grammar({
DYNAMIC_PRECS.call,
seq(
$._hash_symbol,
$.simple_identifier,
optional($.type_parameters),
$.call_suffix
field("name", $.simple_identifier),
field("type_parameters", optional($.type_parameters)),
field("suffix", $.call_suffix)
)
)
),
@@ -965,7 +965,7 @@ module.exports = grammar({
$._hash_symbol,
choice("colorLiteral", "fileLiteral", "imageLiteral"),
"(",
sep1Opt(seq($.simple_identifier, ":", $.expression), ","),
sep1Opt(seq(field("name", $.simple_identifier), ":", field("value", $.expression)), ","),
")"
),
lambda_literal: ($) =>
@@ -974,25 +974,25 @@ module.exports = grammar({
seq(
choice("{", "^{"),
optional($._lambda_type_declaration),
optional($.statements),
field("body", optional($.statements)),
"}"
)
),
_lambda_type_declaration: ($) =>
seq(
repeat($.attribute),
repeat(field("attribute", $.attribute)),
prec(PRECS.expr, optional(field("captures", $.capture_list))),
optional(field("type", $.lambda_function_type)),
"in"
),
capture_list: ($) => seq("[", sep1Opt($.capture_list_item, ","), "]"),
capture_list: ($) => seq("[", sep1Opt(field("item", $.capture_list_item), ","), "]"),
capture_list_item: ($) =>
choice(
field("name", $.self_expression),
prec(
PRECS.expr,
seq(
optional($.ownership_modifier),
field("ownership", optional($.ownership_modifier)),
field("name", $.simple_identifier),
optional(seq($._equal_sign, field("value", $.expression)))
)
@@ -1003,11 +1003,11 @@ module.exports = grammar({
PRECS.expr,
seq(
choice(
$.lambda_function_type_parameters,
seq("(", optional($.lambda_function_type_parameters), ")")
field("params", $.lambda_function_type_parameters),
seq("(", field("params", optional($.lambda_function_type_parameters)), ")")
),
optional($._async_keyword),
optional(choice($.throws_clause, $.throws)),
field("async", optional($._async_keyword)),
field("throws", optional(choice($.throws_clause, $.throws))),
optional(
seq(
$._arrow_operator,
@@ -1016,11 +1016,11 @@ module.exports = grammar({
)
)
),
lambda_function_type_parameters: ($) => sep1Opt($.lambda_parameter, ","),
lambda_function_type_parameters: ($) => sep1Opt(field("parameter", $.lambda_parameter), ","),
lambda_parameter: ($) =>
seq(
choice(
$.self_expression,
field("name", $.self_expression),
prec(PRECS.expr, field("name", $.simple_identifier)),
prec(
PRECS.expr,
@@ -1028,7 +1028,7 @@ module.exports = grammar({
optional(field("external_name", $.simple_identifier)),
field("name", $.simple_identifier),
":",
optional($.parameter_modifiers),
field("modifiers", optional($.parameter_modifiers)),
field("type", $._possibly_implicitly_unwrapped_type)
)
)
@@ -1036,7 +1036,7 @@ module.exports = grammar({
),
self_expression: ($) => "self",
super_expression: ($) => seq("super"),
_else_options: ($) => choice($._block, $.if_statement),
_else_options: ($) => choice($._block, field("else_branch", $.if_statement)),
if_statement: ($) =>
prec.right(
PRECS["if"],
@@ -1044,16 +1044,16 @@ module.exports = grammar({
"if",
sep1(field("condition", $.if_condition), ","),
$._block,
optional(seq($["else"], $._else_options))
optional(seq(field("else_keyword", $["else"]), $._else_options))
)
),
if_condition: ($) =>
choice($.if_let_binding, $.expression, $.availability_condition),
field("kind", choice($.if_let_binding, $.expression, $.availability_condition)),
if_let_binding: ($) =>
seq(
$._direct_or_indirect_binding,
optional(seq($._equal_sign, $.expression)),
optional($.where_clause)
optional(seq($._equal_sign, field("value", $.expression))),
field("where", optional($.where_clause))
),
guard_statement: ($) =>
prec.right(
@@ -1061,7 +1061,7 @@ module.exports = grammar({
seq(
"guard",
sep1(field("condition", $.if_condition), ","),
$["else"],
field("else_keyword", $["else"]),
$._block
)
),
@@ -1072,7 +1072,7 @@ module.exports = grammar({
"switch",
field("expr", $.expression),
"{",
repeat($.switch_entry),
repeat(field("entry", $.switch_entry)),
"}"
)
),
@@ -1096,15 +1096,15 @@ module.exports = grammar({
),
switch_pattern: ($) => alias($._binding_pattern_with_expr, $.pattern),
do_statement: ($) =>
prec.right(PRECS["do"], seq("do", $._block, repeat($.catch_block))),
prec.right(PRECS["do"], seq("do", $._block, repeat(field("catch", $.catch_block)))),
catch_block: ($) =>
seq(
$.catch_keyword,
field("keyword", $.catch_keyword),
field("error", optional(alias($._binding_pattern_no_expr, $.pattern))),
optional($.where_clause),
field("where", optional($.where_clause)),
$._block
),
where_clause: ($) => prec.left(seq($.where_keyword, $.expression)),
where_clause: ($) => prec.left(seq(field("keyword", $.where_keyword), field("expr", $.expression))),
key_path_expression: ($) =>
prec.right(
PRECS.keypath,
@@ -1117,7 +1117,7 @@ module.exports = grammar({
)
),
key_path_string_expression: ($) =>
prec.left(seq($._hash_symbol, "keyPath", "(", $.expression, ")")),
prec.left(seq($._hash_symbol, "keyPath", "(", field("expr", $.expression), ")")),
_key_path_component: ($) =>
prec.left(
choice(
@@ -1173,7 +1173,7 @@ module.exports = grammar({
),
_bitwise_binary_operator: ($) => choice("&", "|", "^", "<<", ">>"),
_postfix_unary_operator: ($) => choice("++", "--", $.bang),
directly_assignable_expression: ($) => $.expression,
directly_assignable_expression: ($) => field("expr", $.expression),
////////////////////////////////
// Statements - https://docs.swift.org/swift-book/ReferenceManual/Statements.html
@@ -1201,7 +1201,7 @@ module.exports = grammar({
$._labeled_statement,
$._throw_statement
),
_block: ($) => prec(PRECS.block, seq("{", optional($.statements), "}")),
_block: ($) => prec(PRECS.block, seq("{", field("body", optional($.statements)), "}")),
_labeled_statement: ($) =>
seq(
optional($.statement_label),
@@ -1221,13 +1221,13 @@ module.exports = grammar({
PRECS.loop,
seq(
"for",
optional($.try_operator),
field("try", optional($.try_operator)),
optional($._await_operator),
field("item", alias($._binding_pattern_no_expr, $.pattern)),
optional($.type_annotation),
field("type", optional($.type_annotation)),
"in",
field("collection", $._for_statement_collection),
optional($.where_clause),
field("where", optional($.where_clause)),
$._block
)
),
@@ -1246,7 +1246,7 @@ module.exports = grammar({
"while",
sep1(field("condition", $.if_condition), ","),
"{",
optional($.statements),
field("body", optional($.statements)),
"}"
)
),
@@ -1256,7 +1256,7 @@ module.exports = grammar({
seq(
"repeat",
"{",
optional($.statements),
field("body", optional($.statements)),
"}",
// Make sure we make it to the `while` before assuming this is a parameter pack.
repeat($._implicit_semi),
@@ -1270,7 +1270,7 @@ module.exports = grammar({
prec.right(
PRECS.control_transfer,
seq(
$._optionally_valueful_control_keyword,
field("kind", $._optionally_valueful_control_keyword),
field("result", optional($.expression))
)
)
@@ -1289,9 +1289,9 @@ module.exports = grammar({
)
),
value_parameter_pack: ($) =>
prec.left(PRECS.parameter_pack, seq("each", $.expression)),
prec.left(PRECS.parameter_pack, seq("each", field("expr", $.expression))),
value_pack_expansion: ($) =>
prec.left(PRECS.parameter_pack, seq("repeat", $.expression)),
prec.left(PRECS.parameter_pack, seq("repeat", field("expr", $.expression))),
availability_condition: ($) =>
seq(
$._hash_symbol,
@@ -1343,30 +1343,30 @@ module.exports = grammar({
),
_local_property_declaration: ($) =>
seq(
optional($._locally_permitted_modifiers),
field("modifiers", optional($._locally_permitted_modifiers)),
$._modifierless_property_declaration
),
_local_typealias_declaration: ($) =>
seq(
optional($._locally_permitted_modifiers),
field("modifiers", optional($._locally_permitted_modifiers)),
$._modifierless_typealias_declaration
),
_local_function_declaration: ($) =>
seq(
optional($._locally_permitted_modifiers),
field("modifiers", optional($._locally_permitted_modifiers)),
$._modifierless_function_declaration
),
_local_class_declaration: ($) =>
seq(
optional($._locally_permitted_modifiers),
field("modifiers", optional($._locally_permitted_modifiers)),
$._modifierless_class_declaration
),
import_declaration: ($) =>
seq(
optional($.modifiers),
field("modifiers", optional($.modifiers)),
"import",
optional($._import_kind),
$.identifier
field("name", $.identifier)
),
_import_kind: ($) =>
choice(
@@ -1382,17 +1382,17 @@ module.exports = grammar({
protocol_property_declaration: ($) =>
prec.right(
seq(
optional($.modifiers),
field("modifiers", optional($.modifiers)),
field("name", alias($._binding_kind_and_pattern, $.pattern)),
optional($.type_annotation),
optional($.type_constraints),
$.protocol_property_requirements
field("type", optional($.type_annotation)),
field("type_constraints", optional($.type_constraints)),
field("requirements", $.protocol_property_requirements)
)
),
protocol_property_requirements: ($) =>
seq("{", repeat(choice($.getter_specifier, $.setter_specifier)), "}"),
seq("{", repeat(field("accessor", choice($.getter_specifier, $.setter_specifier))), "}"),
property_declaration: ($) =>
seq(optional($.modifiers), $._modifierless_property_declaration),
seq(field("modifiers", optional($.modifiers)), $._modifierless_property_declaration),
_modifierless_property_declaration: ($) =>
prec.right(
seq(
@@ -1429,30 +1429,30 @@ module.exports = grammar({
seq($._equal_sign, field("value", $.expression)),
willset_didset_block: ($) =>
choice(
seq("{", $.willset_clause, optional($.didset_clause), "}"),
seq("{", $.didset_clause, optional($.willset_clause), "}")
seq("{", field("willset", $.willset_clause), field("didset", optional($.didset_clause)), "}"),
seq("{", field("didset", $.didset_clause), field("willset", optional($.willset_clause)), "}")
),
willset_clause: ($) =>
seq(
optional($.modifiers),
field("modifiers", optional($.modifiers)),
"willSet",
optional(seq("(", $.simple_identifier, ")")),
optional(seq("(", field("parameter", $.simple_identifier), ")")),
$._block
),
didset_clause: ($) =>
seq(
optional($.modifiers),
field("modifiers", optional($.modifiers)),
"didSet",
optional(seq("(", $.simple_identifier, ")")),
optional(seq("(", field("parameter", $.simple_identifier), ")")),
$._block
),
typealias_declaration: ($) =>
seq(optional($.modifiers), $._modifierless_typealias_declaration),
seq(field("modifiers", optional($.modifiers)), $._modifierless_typealias_declaration),
_modifierless_typealias_declaration: ($) =>
seq(
"typealias",
field("name", alias($.simple_identifier, $.type_identifier)),
optional($.type_parameters),
field("type_parameters", optional($.type_parameters)),
$._equal_sign,
field("value", $.type)
),
@@ -1469,7 +1469,7 @@ module.exports = grammar({
),
_bodyless_function_declaration: ($) =>
seq(
optional($.modifiers),
field("modifiers", optional($.modifiers)),
optional("class"), // XXX: This should be possible in non-last position, but that creates parsing ambiguity
$._modifierless_function_declaration_no_body
),
@@ -1477,17 +1477,17 @@ module.exports = grammar({
prec.right(
seq(
$._non_constructor_function_decl,
optional($.type_parameters),
field("type_parameters", optional($.type_parameters)),
$._function_value_parameters,
optional($._async_keyword),
optional(choice($.throws_clause, $.throws)),
field("async", optional($._async_keyword)),
field("throws", optional(choice($.throws_clause, $.throws))),
optional(
seq(
$._arrow_operator,
field("return_type", $._possibly_implicitly_unwrapped_type)
)
),
optional($.type_constraints)
field("type_constraints", optional($.type_constraints))
)
),
function_body: ($) => $._block,
@@ -1513,36 +1513,36 @@ module.exports = grammar({
),
external_macro_definition: ($) =>
seq($._hash_symbol, "externalMacro", $.value_arguments),
seq($._hash_symbol, "externalMacro", field("arguments", $.value_arguments)),
class_declaration: ($) =>
seq(optional($.modifiers), $._modifierless_class_declaration),
seq(field("modifiers", optional($.modifiers)), $._modifierless_class_declaration),
_modifierless_class_declaration: ($) =>
prec.right(
choice(
seq(
field("declaration_kind", choice("class", "struct", "actor")),
field("name", alias($.simple_identifier, $.type_identifier)),
optional($.type_parameters),
field("type_parameters", optional($.type_parameters)),
optional(seq(":", $._inheritance_specifiers)),
optional($.type_constraints),
field("type_constraints", optional($.type_constraints)),
field("body", $.class_body)
),
seq(
field("declaration_kind", "extension"),
field("name", $.unannotated_type),
optional($.type_parameters),
field("type_parameters", optional($.type_parameters)),
optional(seq(":", $._inheritance_specifiers)),
optional($.type_constraints),
field("type_constraints", optional($.type_constraints)),
field("body", $.class_body)
),
seq(
optional("indirect"),
field("declaration_kind", "enum"),
field("name", alias($.simple_identifier, $.type_identifier)),
optional($.type_parameters),
field("type_parameters", optional($.type_parameters)),
optional(seq(":", $._inheritance_specifiers)),
optional($.type_constraints),
field("type_constraints", optional($.type_constraints)),
field("body", $.enum_class_body)
)
)
@@ -1550,6 +1550,8 @@ module.exports = grammar({
class_body: ($) => seq("{", optional($._class_member_declarations), "}"),
_inheritance_specifiers: ($) =>
prec.left(sep1($._annotated_inheritance_specifier, choice(",", "&"))),
_annotated_inheritance_specifier: ($) =>
seq(repeat(field("attribute", $.attribute)), $.inheritance_specifier),
inheritance_specifier: ($) =>
prec.left(
field(
@@ -1557,20 +1559,18 @@ module.exports = grammar({
choice($.user_type, $.function_type, $.suppressed_constraint)
)
),
_annotated_inheritance_specifier: ($) =>
seq(repeat($.attribute), $.inheritance_specifier),
type_parameters: ($) =>
seq(
"<",
sep1Opt($.type_parameter, ","),
optional($.type_constraints),
sep1Opt(field("parameter", $.type_parameter), ","),
field("constraints", optional($.type_constraints)),
">"
),
type_parameter: ($) =>
seq(
optional($.type_parameter_modifiers),
$._type_parameter_possibly_packed,
optional(seq(":", $.type))
field("modifiers", optional($.type_parameter_modifiers)),
field("name", $._type_parameter_possibly_packed),
optional(seq(":", field("type", $.type)))
),
_type_parameter_possibly_packed: ($) =>
choice(
@@ -1579,19 +1579,19 @@ module.exports = grammar({
),
type_constraints: ($) =>
prec.right(seq($.where_keyword, sep1Opt($.type_constraint, ","))),
prec.right(seq(field("keyword", $.where_keyword), sep1Opt(field("constraint", $.type_constraint), ","))),
type_constraint: ($) =>
choice($.inheritance_constraint, $.equality_constraint),
field("constraint", choice($.inheritance_constraint, $.equality_constraint)),
inheritance_constraint: ($) =>
seq(
repeat($.attribute),
repeat(field("attribute", $.attribute)),
field("constrained_type", $._constrained_type),
":",
field("inherits_from", $._possibly_implicitly_unwrapped_type)
),
equality_constraint: ($) =>
seq(
repeat($.attribute),
repeat(field("attribute", $.attribute)),
field("constrained_type", $._constrained_type),
choice($._equal_sign, $._eq_eq),
field("must_equal", $.type)
@@ -1599,8 +1599,8 @@ module.exports = grammar({
_constrained_type: ($) => choice($.identifier, $.nested_type_identifier),
nested_type_identifier: ($) =>
seq(
$.unannotated_type,
optional(seq(".", sep1($.simple_identifier, ".")))
field("base", $.unannotated_type),
optional(seq(".", sep1(field("member", $.simple_identifier), ".")))
),
_class_member_separator: ($) => choice($._semi, $.multiline_comment),
_class_member_declarations: ($) =>
@@ -1614,8 +1614,8 @@ module.exports = grammar({
),
_function_value_parameter: ($) =>
seq(
optional($.attribute),
$.parameter,
field("attribute", optional($.attribute)),
field("parameter", $.parameter),
optional(seq($._equal_sign, field("default_value", $.expression)))
),
parameter: ($) =>
@@ -1623,7 +1623,7 @@ module.exports = grammar({
optional(field("external_name", $.simple_identifier)),
field("name", $.simple_identifier),
":",
optional($.parameter_modifiers),
field("modifiers", optional($.parameter_modifiers)),
field("type", $._possibly_implicitly_unwrapped_type),
optional($._three_dot_operator)
),
@@ -1633,7 +1633,7 @@ module.exports = grammar({
field("name", choice($.simple_identifier, $.referenceable_operator))
),
referenceable_operator: ($) =>
choice(
field("operator", choice(
$.custom_operator,
$._comparison_operator,
$._additive_operator,
@@ -1649,7 +1649,7 @@ module.exports = grammar({
"<<",
">>",
"&"
),
)),
// Hide the fact that certain symbols come from the custom scanner by aliasing them to their
// string variants. This keeps us from having to see them in the syntax tree (which would be
// noisy) but allows callers to refer to them as nodes by their text form like with any
@@ -1676,7 +1676,7 @@ module.exports = grammar({
seq("{", repeat(field("member", choice($.enum_entry, $.type_level_declaration))), "}"),
enum_entry: ($) =>
seq(
optional($.modifiers),
field("modifiers", optional($.modifiers)),
optional("indirect"),
"case",
sep1(
@@ -1713,12 +1713,12 @@ module.exports = grammar({
protocol_declaration: ($) =>
prec.right(
seq(
optional($.modifiers),
field("modifiers", optional($.modifiers)),
field("declaration_kind", "protocol"),
field("name", alias($.simple_identifier, $.type_identifier)),
optional($.type_parameters),
field("type_parameters", optional($.type_parameters)),
optional(seq(":", $._inheritance_specifiers)),
optional($.type_constraints),
field("type_constraints", optional($.type_constraints)),
field("body", $.protocol_body)
)
),
@@ -1744,28 +1744,28 @@ module.exports = grammar({
init_declaration: ($) =>
prec.right(
seq(
optional($.modifiers),
field("modifiers", optional($.modifiers)),
optional("class"),
field("name", "init"),
optional(choice($._quest, $.bang)),
optional($.type_parameters),
optional(choice($._quest, field("bang", $.bang))),
field("type_parameters", optional($.type_parameters)),
$._function_value_parameters,
optional($._async_keyword),
optional(choice($.throws_clause, $.throws)),
optional($.type_constraints),
field("async", optional($._async_keyword)),
field("throws", optional(choice($.throws_clause, $.throws))),
field("type_constraints", optional($.type_constraints)),
optional(field("body", $.function_body))
)
),
deinit_declaration: ($) =>
prec.right(
seq(optional($.modifiers), "deinit", field("body", $.function_body))
seq(field("modifiers", optional($.modifiers)), "deinit", field("body", $.function_body))
),
subscript_declaration: ($) =>
prec.right(
seq(
optional($.modifiers),
field("modifiers", optional($.modifiers)),
"subscript",
optional($.type_parameters),
field("type_parameters", optional($.type_parameters)),
$._function_value_parameters,
optional(
seq(
@@ -1773,45 +1773,45 @@ module.exports = grammar({
field("return_type", $._possibly_implicitly_unwrapped_type)
)
),
optional($.type_constraints),
$.computed_property
field("type_constraints", optional($.type_constraints)),
field("body", $.computed_property)
)
),
computed_property: ($) =>
seq(
"{",
choice(
optional($.statements),
field("body", optional($.statements)),
repeat(
choice($.computed_getter, $.computed_setter, $.computed_modify)
field("accessor", choice($.computed_getter, $.computed_setter, $.computed_modify))
)
),
"}"
),
computed_getter: ($) =>
seq(repeat($.attribute), $.getter_specifier, optional($._block)),
seq(repeat(field("attribute", $.attribute)), field("specifier", $.getter_specifier), optional($._block)),
computed_modify: ($) =>
seq(repeat($.attribute), $.modify_specifier, optional($._block)),
seq(repeat(field("attribute", $.attribute)), field("specifier", $.modify_specifier), optional($._block)),
computed_setter: ($) =>
seq(
repeat($.attribute),
$.setter_specifier,
optional(seq("(", $.simple_identifier, ")")),
repeat(field("attribute", $.attribute)),
field("specifier", $.setter_specifier),
optional(seq("(", field("parameter", $.simple_identifier), ")")),
optional($._block)
),
getter_specifier: ($) =>
seq(optional($.mutation_modifier), "get", optional($._getter_effects)),
setter_specifier: ($) => seq(optional($.mutation_modifier), "set"),
modify_specifier: ($) => seq(optional($.mutation_modifier), "_modify"),
seq(field("mutation", optional($.mutation_modifier)), "get", optional($._getter_effects)),
setter_specifier: ($) => seq(field("mutation", optional($.mutation_modifier)), "set"),
modify_specifier: ($) => seq(field("mutation", optional($.mutation_modifier)), "_modify"),
_getter_effects: ($) =>
repeat1(field("effect", choice(alias($._async_keyword, $.async_keyword), $.throws_clause, $.throws))),
operator_declaration: ($) =>
seq(
choice("prefix", "infix", "postfix"),
field("kind", choice("prefix", "infix", "postfix")),
"operator",
$.referenceable_operator,
optional(seq(":", $.simple_identifier)),
optional($.deprecated_operator_declaration_body)
field("name", $.referenceable_operator),
optional(seq(":", field("precedence_group", $.simple_identifier))),
field("body", optional($.deprecated_operator_declaration_body))
),
// The Swift compiler no longer accepts these, but some very old code still uses it.
deprecated_operator_declaration_body: ($) =>
@@ -1819,25 +1819,25 @@ module.exports = grammar({
precedence_group_declaration: ($) =>
seq(
"precedencegroup",
$.simple_identifier,
field("name", $.simple_identifier),
"{",
optional($.precedence_group_attributes),
field("attributes", optional($.precedence_group_attributes)),
"}"
),
precedence_group_attributes: ($) => repeat1($.precedence_group_attribute),
precedence_group_attributes: ($) => repeat1(field("attribute", $.precedence_group_attribute)),
precedence_group_attribute: ($) =>
seq(
$.simple_identifier,
field("name", $.simple_identifier),
":",
choice($.simple_identifier, $.boolean_literal)
field("value", choice($.simple_identifier, $.boolean_literal))
),
associatedtype_declaration: ($) =>
seq(
optional($.modifiers),
field("modifiers", optional($.modifiers)),
"associatedtype",
field("name", alias($.simple_identifier, $.type_identifier)),
optional(seq(":", field("must_inherit", $.type))),
optional($.type_constraints),
field("type_constraints", optional($.type_constraints)),
optional(seq($._equal_sign, field("default_value", $.type)))
),
////////////////////////////////
@@ -1846,20 +1846,20 @@ module.exports = grammar({
attribute: ($) =>
seq(
"@",
$.user_type,
field("name", $.user_type),
// attribute arguments are a mess of special cases, maybe this is good enough?
optional(seq("(", sep1Opt($._attribute_argument, ","), ")"))
),
_attribute_argument: ($) =>
choice(
// labeled function parameters, used in custom property wrappers
seq($.simple_identifier, ":", $.expression),
seq(field("argument_name", $.simple_identifier), ":", field("argument", $.expression)),
// Unlabeled function parameters, simple identifiers, or `*`
$.expression,
field("argument", $.expression),
// References to param names (used in `@objc(foo:bar:)`)
repeat1(seq($.simple_identifier, ":")),
repeat1(seq(field("param_ref", $.simple_identifier), ":")),
// Version restrictions (iOS 3.4.5, Swift 5.0.0)
seq(repeat1($.simple_identifier), sep1($.integer_literal, "."))
seq(repeat1(field("platform", $.simple_identifier)), sep1(field("version", $.integer_literal), "."))
),
////////////////////////////////
// Patterns - https://docs.swift.org/swift-book/ReferenceManual/Patterns.html
@@ -1952,12 +1952,12 @@ module.exports = grammar({
modifiers: ($) =>
repeat1(
prec.left(
choice($._non_local_scope_modifier, $._locally_permitted_modifiers)
field("modifier", choice($._non_local_scope_modifier, $._locally_permitted_modifiers))
)
),
_locally_permitted_modifiers: ($) =>
repeat1(choice($.attribute, $._locally_permitted_modifier)),
parameter_modifiers: ($) => repeat1($.parameter_modifier),
parameter_modifiers: ($) => repeat1(field("modifier", $.parameter_modifier)),
_modifier: ($) =>
choice($._non_local_scope_modifier, $._locally_permitted_modifier),
_non_local_scope_modifier: ($) =>
@@ -1976,7 +1976,7 @@ module.exports = grammar({
$.property_behavior_modifier
),
property_behavior_modifier: ($) => "lazy",
type_modifiers: ($) => repeat1($.attribute),
type_modifiers: ($) => repeat1(field("attribute", $.attribute)),
member_modifier: ($) =>
choice("override", "convenience", "required", "nonisolated"),
visibility_modifier: ($) =>
@@ -1991,7 +1991,7 @@ module.exports = grammar({
),
optional(seq("(", "set", ")"))
),
type_parameter_modifiers: ($) => repeat1($.attribute),
type_parameter_modifiers: ($) => repeat1(field("attribute", $.attribute)),
function_modifier: ($) => choice("infix", "postfix", "prefix"),
mutation_modifier: ($) => choice("mutating", "nonmutating"),
property_modifier: ($) =>

View File

@@ -119,8 +119,8 @@ named:
array_type:
element: type
as_expression:
$children: as_operator
expr: expression
operator: as_operator
type: type
as_operator:
assignment:
@@ -128,13 +128,19 @@ named:
result: expression
target: directly_assignable_expression
associatedtype_declaration:
$children*: [modifiers, type_constraints]
default_value?: type
modifiers?: modifiers
must_inherit?: type
name: type_identifier
type_constraints?: type_constraints
async_keyword:
attribute:
$children+: [expression, user_type]
argument*: expression
argument_name*: simple_identifier
name: user_type
param_ref*: simple_identifier
platform*: simple_identifier
version*: integer_literal
availability_condition:
$children*: [identifier, integer_literal]
await_expression:
@@ -148,19 +154,23 @@ named:
rhs: expression
boolean_literal:
call_expression:
$children+: [call_suffix, expression]
$children*: [call_suffix, expression]
function?: expression
suffix?: call_suffix
call_suffix:
$children+: [lambda_literal, value_arguments]
name*: simple_identifier
capture_list:
$children+: capture_list_item
item+: capture_list_item
capture_list_item:
$children?: ownership_modifier
name: [self_expression, simple_identifier]
ownership?: ownership_modifier
value?: expression
catch_block:
$children+: [catch_keyword, statements, where_clause]
body?: statements
error?: pattern
keyword: catch_keyword
where?: where_clause
catch_keyword:
check_expression:
op: "is"
@@ -170,41 +180,54 @@ named:
$children*: multiline_comment
member*: type_level_declaration
class_declaration:
$children*: [attribute, inheritance_modifier, inheritance_specifier, modifiers, ownership_modifier, property_behavior_modifier, type_constraints, type_parameters]
$children*: inheritance_specifier
attribute*: attribute
body: [class_body, enum_class_body]
declaration_kind: ["actor", "class", "enum", "extension", "struct"]
modifiers*: [attribute, inheritance_modifier, modifiers, ownership_modifier, property_behavior_modifier]
name: [type_identifier, unannotated_type]
type_constraints?: type_constraints
type_parameters?: type_parameters
comment:
comparison_expression:
lhs: expression
op: ["<", "<=", ">", ">="]
rhs: expression
computed_getter:
$children+: [attribute, getter_specifier, statements]
attribute*: attribute
body?: statements
specifier: getter_specifier
computed_modify:
$children+: [attribute, modify_specifier, statements]
attribute*: attribute
body?: statements
specifier: modify_specifier
computed_property:
$children*: [computed_getter, computed_modify, computed_setter, statements]
accessor*: [computed_getter, computed_modify, computed_setter]
body?: statements
computed_setter:
$children+: [attribute, setter_specifier, simple_identifier, statements]
attribute*: attribute
body?: statements
parameter?: simple_identifier
specifier: setter_specifier
conjunction_expression:
lhs: expression
op: "&&"
rhs: expression
constructor_expression:
$children: constructor_suffix
constructed_type: [array_type, dictionary_type, user_type]
suffix: constructor_suffix
constructor_suffix:
$children+: [lambda_literal, value_arguments]
name*: simple_identifier
control_transfer_statement:
$children*: [expression, throw_keyword]
kind?: ["break", "continue", "return", "yield"]
result?: expression
custom_operator:
default_keyword:
deinit_declaration:
$children?: modifiers
body: function_body
modifiers?: modifiers
deprecated_operator_declaration_body:
$children*: [bin_literal, boolean_literal, hex_literal, integer_literal, line_string_literal, multi_line_string_literal, oct_literal, raw_string_literal, real_literal, regex_literal, simple_identifier]
diagnostic:
@@ -215,29 +238,32 @@ named:
key: type
value: type
didset_clause:
$children*: [modifiers, simple_identifier, statements]
body?: statements
modifiers?: modifiers
parameter?: simple_identifier
directive:
$children*: [boolean_literal, integer_literal, simple_identifier]
directly_assignable_expression:
$children: expression
expr: expression
disjunction_expression:
lhs: expression
op: "||"
rhs: expression
do_statement:
$children*: [catch_block, statements]
body?: statements
catch*: catch_block
else:
enum_class_body:
member*: [enum_entry, type_level_declaration]
enum_entry:
$children?: modifiers
data_contents*: enum_type_parameters
modifiers?: modifiers
name+: simple_identifier
raw_value*: expression
enum_type_parameters:
$children*: [expression, type, wildcard_pattern]
equality_constraint:
$children*: attribute
attribute*: attribute
constrained_type: [identifier, nested_type_identifier]
must_equal: type
equality_expression:
@@ -245,107 +271,137 @@ named:
op: ["!=", "!==", "==", "==="]
rhs: expression
existential_type:
$children: unannotated_type
name: unannotated_type
external_macro_definition:
$children: value_arguments
arguments: value_arguments
for_statement:
$children*: [statements, try_operator, type_annotation, where_clause]
body?: statements
collection: expression
item: pattern
try?: try_operator
type?: type_annotation
where?: where_clause
fully_open_range:
function_body:
$children?: statements
body?: statements
function_declaration:
$children*: [attribute, inheritance_modifier, modifiers, ownership_modifier, parameter, property_behavior_modifier, throws, throws_clause, type_constraints, type_parameters]
async?: "async"
attribute*: attribute
body: function_body
default_value*: expression
modifiers*: [attribute, inheritance_modifier, modifiers, ownership_modifier, property_behavior_modifier]
name: [referenceable_operator, simple_identifier]
parameter*: parameter
return_type?: [implicitly_unwrapped_type, type]
throws?: [throws, throws_clause]
type_constraints?: type_constraints
type_parameters?: type_parameters
function_modifier:
function_type:
$children?: [throws, throws_clause]
async?: "async"
params: unannotated_type
return_type: type
throws?: [throws, throws_clause]
getter_specifier:
$children?: mutation_modifier
effect*: [async_keyword, throws, throws_clause]
mutation?: mutation_modifier
guard_statement:
$children+: [else, statements]
body?: statements
condition+: if_condition
else_keyword: else
hex_literal:
identifier:
$children+: simple_identifier
part+: simple_identifier
if_condition:
$children: [availability_condition, expression, if_let_binding]
kind: [availability_condition, expression, if_let_binding]
if_let_binding:
$children*: [expression, pattern, type, type_annotation, user_type, value_binding_pattern, where_clause, wildcard_pattern]
$children*: [pattern, simple_identifier, type, type_annotation, user_type, value_binding_pattern, wildcard_pattern]
bound_identifier?: simple_identifier
value?: expression
where?: where_clause
if_statement:
$children*: [else, if_statement, statements]
body*: statements
condition+: if_condition
else_branch?: if_statement
else_keyword?: else
implicitly_unwrapped_type:
$children: type
name: type
import_declaration:
$children+: [identifier, modifiers]
modifiers?: modifiers
name: identifier
infix_expression:
lhs: expression
op: custom_operator
rhs: expression
inheritance_constraint:
$children*: attribute
attribute*: attribute
constrained_type: [identifier, nested_type_identifier]
inherits_from: [implicitly_unwrapped_type, type]
inheritance_modifier:
inheritance_specifier:
inherits_from: [function_type, suppressed_constraint, user_type]
init_declaration:
$children*: [attribute, bang, modifiers, parameter, throws, throws_clause, type_constraints, type_parameters]
async?: "async"
attribute*: attribute
bang?: bang
body?: function_body
default_value*: expression
modifiers?: modifiers
name: "init"
parameter*: parameter
throws?: [throws, throws_clause]
type_constraints?: type_constraints
type_parameters?: type_parameters
integer_literal:
interpolated_expression:
$children?: type_modifiers
name?: value_argument_label
reference_specifier*: value_argument_label
type_modifiers?: type_modifiers
value?: expression
key_path_expression:
$children*: [array_type, bang, dictionary_type, simple_identifier, type_arguments, type_identifier, value_argument]
key_path_string_expression:
$children: expression
expr: expression
lambda_function_type:
$children*: [lambda_function_type_parameters, throws, throws_clause]
async?: "async"
params?: lambda_function_type_parameters
return_type?: [implicitly_unwrapped_type, type]
throws?: [throws, throws_clause]
lambda_function_type_parameters:
$children+: lambda_parameter
parameter+: lambda_parameter
lambda_literal:
$children*: [attribute, statements]
attribute*: attribute
body?: statements
captures?: capture_list
type?: lambda_function_type
lambda_parameter:
$children?: [parameter_modifiers, self_expression]
external_name?: simple_identifier
name?: simple_identifier
modifiers?: parameter_modifiers
name: [self_expression, simple_identifier]
type?: [implicitly_unwrapped_type, type]
line_str_text:
line_string_literal:
interpolation*: interpolated_expression
text*: [line_str_text, str_escaped_char]
macro_declaration:
$children+: [attribute, modifiers, parameter, simple_identifier, type_constraints, type_parameters, unannotated_type]
$children+: [modifiers, simple_identifier, type_constraints, type_parameters, unannotated_type]
attribute*: attribute
default_value*: expression
definition?: macro_definition
parameter*: parameter
macro_definition:
body: [expression, external_macro_definition]
macro_invocation:
$children+: [call_suffix, simple_identifier, type_parameters]
name: simple_identifier
suffix: call_suffix
type_parameters?: type_parameters
member_modifier:
metatype:
$children: unannotated_type
name: unannotated_type
modifiers:
$children+: [attribute, function_modifier, inheritance_modifier, member_modifier, mutation_modifier, ownership_modifier, parameter_modifier, property_behavior_modifier, property_modifier, visibility_modifier]
modifier+: [attribute, function_modifier, inheritance_modifier, member_modifier, mutation_modifier, ownership_modifier, parameter_modifier, property_behavior_modifier, property_modifier, visibility_modifier]
modify_specifier:
$children?: mutation_modifier
mutation?: mutation_modifier
multi_line_str_text:
multi_line_string_literal:
interpolation*: interpolated_expression
@@ -362,76 +418,97 @@ named:
navigation_suffix:
suffix: [integer_literal, simple_identifier]
nested_type_identifier:
$children+: [simple_identifier, unannotated_type]
base: unannotated_type
member*: simple_identifier
nil_coalescing_expression:
if_nil: expression
value: expression
oct_literal:
opaque_type:
$children: unannotated_type
name: unannotated_type
open_end_range_expression:
start: expression
open_start_range_expression:
end: expression
operator_declaration:
$children+: [deprecated_operator_declaration_body, referenceable_operator, simple_identifier]
body?: deprecated_operator_declaration_body
kind: ["infix", "postfix", "prefix"]
name: referenceable_operator
precedence_group?: simple_identifier
optional_chain_marker:
$children: expression
expr: expression
optional_type:
wrapped: [array_type, dictionary_type, tuple_type, user_type]
ownership_modifier:
parameter:
$children?: parameter_modifiers
external_name?: simple_identifier
modifiers?: parameter_modifiers
name: simple_identifier
type: [implicitly_unwrapped_type, type]
parameter_modifier:
parameter_modifiers:
$children+: parameter_modifier
modifier+: parameter_modifier
pattern:
$children*: [expression, pattern, type, user_type, value_binding_pattern, wildcard_pattern]
bound_identifier?: simple_identifier
playground_literal:
$children+: expression
name+: simple_identifier
value+: expression
postfix_expression:
operation: ["++", "--", bang]
target: expression
precedence_group_attribute:
$children+: [boolean_literal, simple_identifier]
name: simple_identifier
value: [boolean_literal, simple_identifier]
precedence_group_attributes:
$children+: precedence_group_attribute
attribute+: precedence_group_attribute
precedence_group_declaration:
$children+: [precedence_group_attributes, simple_identifier]
attributes?: precedence_group_attributes
name: simple_identifier
prefix_expression:
operation: ["&", "+", "++", "-", "--", ".", bang, custom_operator, "~"]
target: expression
property_behavior_modifier:
property_declaration:
$children*: [attribute, inheritance_modifier, modifiers, ownership_modifier, property_behavior_modifier, type_annotation, type_constraints, value_binding_pattern, willset_didset_block]
$children*: [type_annotation, type_constraints, value_binding_pattern, willset_didset_block]
computed_value*: computed_property
modifiers*: [attribute, inheritance_modifier, modifiers, ownership_modifier, property_behavior_modifier]
name+: pattern
value*: expression
property_modifier:
protocol_body:
member*: protocol_member_declaration
protocol_composition_type:
$children+: unannotated_type
type+: unannotated_type
protocol_declaration:
$children*: [attribute, inheritance_specifier, modifiers, type_constraints, type_parameters]
$children*: inheritance_specifier
attribute*: attribute
body: protocol_body
declaration_kind: "protocol"
modifiers?: modifiers
name: type_identifier
type_constraints?: type_constraints
type_parameters?: type_parameters
protocol_function_declaration:
$children*: [attribute, modifiers, parameter, throws, throws_clause, type_constraints, type_parameters]
async?: "async"
attribute*: attribute
body?: function_body
default_value*: expression
modifiers?: modifiers
name: [referenceable_operator, simple_identifier]
parameter*: parameter
return_type?: [implicitly_unwrapped_type, type]
throws?: [throws, throws_clause]
type_constraints?: type_constraints
type_parameters?: type_parameters
protocol_property_declaration:
$children+: [modifiers, protocol_property_requirements, type_annotation, type_constraints]
modifiers?: modifiers
name: pattern
requirements: protocol_property_requirements
type?: type_annotation
type_constraints?: type_constraints
protocol_property_requirements:
$children*: [getter_specifier, setter_specifier]
accessor*: [getter_specifier, setter_specifier]
range_expression:
end: expression
op: ["...", "..<"]
@@ -439,26 +516,26 @@ named:
raw_str_continuing_indicator:
raw_str_end_part:
raw_str_interpolation:
$children: raw_str_interpolation_start
interpolation+: interpolated_expression
start: raw_str_interpolation_start
raw_str_interpolation_start:
raw_str_part:
raw_string_literal:
$children*: raw_str_continuing_indicator
continuing*: raw_str_continuing_indicator
interpolation*: raw_str_interpolation
text+: [raw_str_end_part, raw_str_part]
real_literal:
referenceable_operator:
$children?: [bang, custom_operator]
operator: ["!=", "!==", "%", "%=", "&", "*", "*=", "+", "++", "+=", "-", "--", "-=", "/", "/=", "<", "<<", "<=", "=", "==", "===", ">", ">=", ">>", "^", bang, custom_operator, "|", "~"]
regex_literal:
repeat_while_statement:
$children?: statements
body?: statements
condition+: if_condition
selector_expression:
$children: expression
expr: expression
self_expression:
setter_specifier:
$children?: mutation_modifier
mutation?: mutation_modifier
shebang_line:
simple_identifier:
source_file:
@@ -470,9 +547,14 @@ named:
statement+: [control_transfer_statement, do_statement, expression, for_statement, guard_statement, local_declaration, repeat_while_statement, statement_label, while_statement]
str_escaped_char:
subscript_declaration:
$children+: [attribute, computed_property, modifiers, parameter, type_constraints, type_parameters]
attribute*: attribute
body: computed_property
default_value*: expression
modifiers?: modifiers
parameter*: parameter
return_type?: [implicitly_unwrapped_type, type]
type_constraints?: type_constraints
type_parameters?: type_parameters
super_expression:
suppressed_constraint:
suppressed: type_identifier
@@ -481,7 +563,7 @@ named:
switch_pattern:
$children: pattern
switch_statement:
$children*: switch_entry
entry*: switch_entry
expr: expression
ternary_expression:
condition: expression
@@ -492,8 +574,8 @@ named:
throws_clause:
type: unannotated_type
try_expression:
$children: try_operator
expr: expression
operator: try_operator
try_operator:
tuple_expression:
name*: simple_identifier
@@ -502,7 +584,8 @@ named:
$children?: tuple_type_item
element*: tuple_type_item
tuple_type_item:
$children*: [dictionary_type, existential_type, opaque_type, parameter_modifiers, wildcard_pattern]
$children?: [dictionary_type, existential_type, opaque_type, wildcard_pattern]
modifiers?: parameter_modifiers
name?: simple_identifier
type?: type
type:
@@ -511,57 +594,66 @@ named:
type_annotation:
type: [implicitly_unwrapped_type, type]
type_arguments:
$children+: type
argument+: type
type_constraint:
$children: [equality_constraint, inheritance_constraint]
constraint: [equality_constraint, inheritance_constraint]
type_constraints:
$children+: [type_constraint, where_keyword]
constraint+: type_constraint
keyword: where_keyword
type_identifier:
type_modifiers:
$children+: attribute
attribute+: attribute
type_pack_expansion:
$children: unannotated_type
name: unannotated_type
type_parameter:
$children+: [type, type_identifier, type_parameter_modifiers, type_parameter_pack]
modifiers?: type_parameter_modifiers
name: [type_identifier, type_parameter_pack]
type?: type
type_parameter_modifiers:
$children+: attribute
attribute+: attribute
type_parameter_pack:
$children: unannotated_type
name: unannotated_type
type_parameters:
$children+: [type_constraints, type_parameter]
constraints?: type_constraints
parameter+: type_parameter
typealias_declaration:
$children*: [attribute, inheritance_modifier, modifiers, ownership_modifier, property_behavior_modifier, type_parameters]
modifiers*: [attribute, inheritance_modifier, modifiers, ownership_modifier, property_behavior_modifier]
name: type_identifier
type_parameters?: type_parameters
value: type
user_type:
$children+: [type_arguments, type_identifier]
part+: [type_arguments, type_identifier]
value_argument:
$children?: type_modifiers
name?: value_argument_label
reference_specifier*: value_argument_label
type_modifiers?: type_modifiers
value?: expression
value_argument_label:
$children: simple_identifier
value_arguments:
$children*: value_argument
argument*: value_argument
value_binding_pattern:
mutability: ["let", "var"]
value_pack_expansion:
$children: expression
expr: expression
value_parameter_pack:
$children: expression
expr: expression
visibility_modifier:
where_clause:
$children+: [expression, where_keyword]
expr: expression
keyword: where_keyword
where_keyword:
while_statement:
$children?: statements
body?: statements
condition+: if_condition
wildcard_pattern:
willset_clause:
$children*: [modifiers, simple_identifier, statements]
body?: statements
modifiers?: modifiers
parameter?: simple_identifier
willset_didset_block:
$children+: [didset_clause, willset_clause]
didset?: didset_clause
willset?: willset_clause
unnamed:
- "?"