Constant tree_sitter_rust::GRAMMAR
source · [−]pub const GRAMMAR: &str = "const PREC = {\n range: 15,\n call: 14,\n field: 13,\n unary: 11,\n multiplicative: 10,\n additive: 9,\n shift: 8,\n bitand: 7,\n bitxor: 6,\n bitor: 5,\n comparative: 4,\n and: 3,\n or: 2,\n assign: 0,\n closure: -1,\n}\n\nconst numeric_types = [\n \'u8\',\n \'i8\',\n \'u16\',\n \'i16\',\n \'u32\',\n \'i32\',\n \'u64\',\n \'i64\',\n \'u128\',\n \'i128\',\n \'isize\',\n \'usize\',\n \'f32\',\n \'f64\'\n]\n\nconst primitive_types = numeric_types.concat([\'bool\', \'str\', \'char\'])\n\nmodule.exports = grammar({\n name: \'rust\',\n\n extras: $ => [/\\s/, $.line_comment, $.block_comment],\n\n externals: $ => [\n $._string_content,\n $.raw_string_literal,\n $.float_literal,\n $.block_comment,\n ],\n\n supertypes: $ => [\n $._expression,\n $._type,\n $._literal,\n $._literal_pattern,\n $._declaration_statement,\n $._pattern,\n ],\n\n inline: $ => [\n $._path,\n $._type_identifier,\n $._tokens,\n $._field_identifier,\n $._non_special_token,\n $._declaration_statement,\n $._reserved_identifier,\n $._expression_ending_with_block\n ],\n\n conflicts: $ => [\n // Local ambiguity due to anonymous types:\n // See https://internals.rust-lang.org/t/pre-rfc-deprecating-anonymous-parameters/3710\n [$._type, $._pattern],\n [$.unit_type, $.tuple_pattern],\n [$.scoped_identifier, $.scoped_type_identifier],\n [$.parameters, $._pattern],\n [$.parameters, $.tuple_struct_pattern],\n [$.type_parameters, $.for_lifetimes],\n ],\n\n word: $ => $.identifier,\n\n rules: {\n source_file: $ => repeat($._statement),\n\n _statement: $ => choice(\n $.expression_statement,\n $._declaration_statement\n ),\n\n empty_statement: $ => \';\',\n\n expression_statement: $ => choice(\n seq($._expression, \';\'),\n prec(1, $._expression_ending_with_block)\n ),\n\n _declaration_statement: $ => choice(\n $.const_item,\n $.macro_invocation,\n $.macro_definition,\n $.empty_statement,\n $.attribute_item,\n $.inner_attribute_item,\n $.mod_item,\n $.foreign_mod_item,\n $.struct_item,\n $.union_item,\n $.enum_item,\n $.type_item,\n $.function_item,\n $.function_signature_item,\n $.impl_item,\n $.trait_item,\n $.associated_type,\n $.let_declaration,\n $.use_declaration,\n $.extern_crate_declaration,\n $.static_item\n ),\n\n // Section - Macro definitions\n\n macro_definition: $ => {\n const rules = seq(\n repeat(seq($.macro_rule, \';\')),\n optional($.macro_rule)\n )\n\n return seq(\n \'macro_rules!\',\n field(\'name\', choice(\n $.identifier,\n $._reserved_identifier,\n )),\n choice(\n seq(\'(\', rules, \')\', \';\'),\n seq(\'{\', rules, \'}\')\n )\n )\n },\n\n macro_rule: $ => seq(\n field(\'left\', $.token_tree_pattern),\n \'=>\',\n field(\'right\', $.token_tree)\n ),\n\n _token_pattern: $ => choice(\n $.token_tree_pattern,\n $.token_repetition_pattern,\n $.token_binding_pattern,\n $._non_special_token\n ),\n\n token_tree_pattern: $ => choice(\n seq(\'(\', repeat($._token_pattern), \')\'),\n seq(\'[\', repeat($._token_pattern), \']\'),\n seq(\'{\', repeat($._token_pattern), \'}\')\n ),\n\n token_binding_pattern: $ => prec(1, seq(\n field(\'name\', $.metavariable),\n \':\',\n field(\'type\', $.fragment_specifier)\n )),\n\n token_repetition_pattern: $ => seq(\n \'$\', \'(\', repeat($._token_pattern), \')\', optional(/[^+*?]+/), choice(\'+\', \'*\', \'?\')\n ),\n\n fragment_specifier: $ => choice(\n \'block\', \'expr\', \'ident\', \'item\', \'lifetime\', \'literal\', \'meta\', \'pat\',\n \'path\', \'stmt\', \'tt\', \'ty\', \'vis\'\n ),\n\n _tokens: $ => choice(\n $.token_tree,\n $.token_repetition,\n $._non_special_token\n ),\n\n token_tree: $ => choice(\n seq(\'(\', repeat($._tokens), \')\'),\n seq(\'[\', repeat($._tokens), \']\'),\n seq(\'{\', repeat($._tokens), \'}\')\n ),\n\n token_repetition: $ => seq(\n \'$\', \'(\', repeat($._tokens), \')\', optional(/[^+*?]+/), choice(\'+\', \'*\', \'?\')\n ),\n\n _non_special_token: $ => choice(\n $._literal, $.identifier, $.metavariable, $.mutable_specifier, $.self, $.super, $.crate,\n alias(choice(...primitive_types), $.primitive_type),\n /[/_\\-=->,;:::!=?.@*&#%^+<>|~]+/,\n \'\\\'\',\n \'as\', \'async\', \'await\', \'break\', \'const\', \'continue\', \'default\', \'enum\', \'fn\', \'for\', \'if\', \'impl\',\n \'let\', \'loop\', \'match\', \'mod\', \'pub\', \'return\', \'static\', \'struct\', \'trait\', \'type\',\n \'union\', \'unsafe\', \'use\', \'where\', \'while\'\n ),\n\n // Section - Declarations\n\n attribute_item: $ => seq(\n \'#\',\n \'[\',\n $.meta_item,\n \']\'\n ),\n\n inner_attribute_item: $ => seq(\n \'#\',\n \'!\',\n \'[\',\n $.meta_item,\n \']\'\n ),\n\n meta_item: $ => seq(\n $._path,\n optional(choice(\n seq(\'=\', field(\'value\', $._literal)),\n field(\'arguments\', $.meta_arguments)\n ))\n ),\n\n meta_arguments: $ => seq(\n \'(\',\n sepBy(\',\', choice(\n $.meta_item,\n $._literal\n )),\n optional(\',\'),\n \')\'\n ),\n\n mod_item: $ => seq(\n optional($.visibility_modifier),\n \'mod\',\n field(\'name\', $.identifier),\n choice(\n \';\',\n field(\'body\', $.declaration_list)\n )\n ),\n\n foreign_mod_item: $ => seq(\n optional($.visibility_modifier),\n $.extern_modifier,\n choice(\n \';\',\n field(\'body\', $.declaration_list)\n )\n ),\n\n declaration_list: $ => seq(\n \'{\',\n repeat($._declaration_statement),\n \'}\'\n ),\n\n struct_item: $ => seq(\n optional($.visibility_modifier),\n \'struct\',\n field(\'name\', $._type_identifier),\n field(\'type_parameters\', optional($.type_parameters)),\n choice(\n seq(\n optional($.where_clause),\n field(\'body\', $.field_declaration_list)\n ),\n seq(\n field(\'body\', $.ordered_field_declaration_list),\n optional($.where_clause),\n \';\'\n ),\n \';\'\n ),\n ),\n\n union_item: $ => seq(\n optional($.visibility_modifier),\n \'union\',\n field(\'name\', $._type_identifier),\n field(\'type_parameters\', optional($.type_parameters)),\n optional($.where_clause),\n field(\'body\', $.field_declaration_list),\n ),\n\n enum_item: $ => seq(\n optional($.visibility_modifier),\n \'enum\',\n field(\'name\', $._type_identifier),\n field(\'type_parameters\', optional($.type_parameters)),\n optional($.where_clause),\n field(\'body\', $.enum_variant_list)\n ),\n\n enum_variant_list: $ => seq(\n \'{\',\n sepBy(\',\', seq(repeat($.attribute_item), $.enum_variant)),\n optional(\',\'),\n \'}\'\n ),\n\n enum_variant: $ => seq(\n optional($.visibility_modifier),\n field(\'name\', $.identifier),\n field(\'body\', optional(choice(\n $.field_declaration_list,\n $.ordered_field_declaration_list\n ))),\n optional(seq(\n \'=\',\n field(\'value\', $._expression)\n ))\n ),\n\n field_declaration_list: $ => seq(\n \'{\',\n sepBy(\',\', seq(repeat($.attribute_item), $.field_declaration)),\n optional(\',\'),\n \'}\'\n ),\n\n field_declaration: $ => seq(\n optional($.visibility_modifier),\n field(\'name\', $._field_identifier),\n \':\',\n field(\'type\', $._type)\n ),\n\n ordered_field_declaration_list: $ => seq(\n \'(\',\n sepBy(\',\', seq(\n repeat($.attribute_item),\n optional($.visibility_modifier),\n field(\'type\', $._type)\n )),\n optional(\',\'),\n \')\'\n ),\n\n extern_crate_declaration: $ => seq(\n optional($.visibility_modifier),\n \'extern\',\n $.crate,\n field(\'name\', $.identifier),\n optional(seq(\n \'as\',\n field(\'alias\', $.identifier)\n )),\n \';\'\n ),\n\n const_item: $ => seq(\n optional($.visibility_modifier),\n \'const\',\n field(\'name\', $.identifier),\n \':\',\n field(\'type\', $._type),\n optional(\n seq(\n \'=\',\n field(\'value\', $._expression),\n ),\n ),\n \';\'\n ),\n\n static_item: $ => seq(\n optional($.visibility_modifier),\n \'static\',\n\n // Not actual rust syntax, but made popular by the lazy_static crate.\n optional(\'ref\'),\n\n optional($.mutable_specifier),\n field(\'name\', $.identifier),\n \':\',\n field(\'type\', $._type),\n optional(seq(\n \'=\',\n field(\'value\', $._expression)\n )),\n \';\'\n ),\n\n type_item: $ => seq(\n optional($.visibility_modifier),\n \'type\',\n field(\'name\', $._type_identifier),\n field(\'type_parameters\', optional($.type_parameters)),\n \'=\',\n field(\'type\', $._type),\n \';\'\n ),\n\n function_item: $ => seq(\n optional($.visibility_modifier),\n optional($.function_modifiers),\n \'fn\',\n field(\'name\', choice($.identifier, $.metavariable)),\n field(\'type_parameters\', optional($.type_parameters)),\n field(\'parameters\', $.parameters),\n optional(seq(\'->\', field(\'return_type\', $._type))),\n optional($.where_clause),\n field(\'body\', $.block)\n ),\n\n function_signature_item: $ => seq(\n optional($.visibility_modifier),\n optional($.function_modifiers),\n \'fn\',\n field(\'name\', choice($.identifier, $.metavariable)),\n field(\'type_parameters\', optional($.type_parameters)),\n field(\'parameters\', $.parameters),\n optional(seq(\'->\', field(\'return_type\', $._type))),\n optional($.where_clause),\n \';\'\n ),\n\n function_modifiers: $ => repeat1(choice(\n \'async\',\n \'default\',\n \'const\',\n \'unsafe\',\n $.extern_modifier\n )),\n\n where_clause: $ => seq(\n \'where\',\n sepBy1(\',\', $.where_predicate),\n optional(\',\')\n ),\n\n where_predicate: $ => seq(\n field(\'left\', choice(\n $.lifetime,\n $._type_identifier,\n $.scoped_type_identifier,\n $.generic_type,\n $.reference_type,\n $.pointer_type,\n $.tuple_type,\n $.higher_ranked_trait_bound,\n alias(choice(...primitive_types), $.primitive_type)\n )),\n field(\'bounds\', $.trait_bounds)\n ),\n\n impl_item: $ => seq(\n optional(\'unsafe\'),\n \'impl\',\n field(\'type_parameters\', optional($.type_parameters)),\n optional(seq(\n field(\'trait\', choice(\n $._type_identifier,\n $.scoped_type_identifier,\n $.generic_type\n )),\n \'for\'\n )),\n field(\'type\', $._type),\n optional($.where_clause),\n choice(field(\'body\', $.declaration_list), \';\')\n ),\n\n trait_item: $ => seq(\n optional($.visibility_modifier),\n optional(\'unsafe\'),\n \'trait\',\n field(\'name\', $._type_identifier),\n field(\'type_parameters\', optional($.type_parameters)),\n field(\'bounds\', optional($.trait_bounds)),\n optional($.where_clause),\n field(\'body\', $.declaration_list)\n ),\n\n associated_type: $ => seq(\n \'type\',\n field(\'name\', $._type_identifier),\n field(\'type_parameters\', optional($.type_parameters)),\n field(\'bounds\', optional($.trait_bounds)),\n \';\'\n ),\n\n trait_bounds: $ => seq(\n \':\',\n sepBy1(\'+\', choice(\n $._type,\n $.lifetime,\n $.higher_ranked_trait_bound,\n $.removed_trait_bound\n ))\n ),\n\n higher_ranked_trait_bound: $ => seq(\n \'for\',\n field(\'type_parameters\', $.type_parameters),\n field(\'type\', $._type)\n ),\n\n removed_trait_bound: $ => seq(\n \'?\',\n $._type\n ),\n\n type_parameters: $ => prec(1, seq(\n \'<\',\n sepBy1(\',\', choice(\n $.lifetime,\n $.metavariable,\n $._type_identifier,\n $.constrained_type_parameter,\n $.optional_type_parameter,\n $.const_parameter,\n )),\n optional(\',\'),\n \'>\'\n )),\n\n const_parameter: $ => seq(\n \'const\',\n field(\'name\', $.identifier),\n \':\',\n field(\'type\', $._type),\n ),\n\n constrained_type_parameter: $ => seq(\n field(\'left\', choice($.lifetime, $._type_identifier)),\n field(\'bounds\', $.trait_bounds)\n ),\n\n optional_type_parameter: $ => seq(\n field(\'name\', choice(\n $._type_identifier,\n $.constrained_type_parameter\n )),\n \'=\',\n field(\'default_type\', $._type)\n ),\n\n let_declaration: $ => seq(\n \'let\',\n optional($.mutable_specifier),\n field(\'pattern\', $._pattern),\n optional(seq(\n \':\',\n field(\'type\', $._type)\n )),\n optional(seq(\n \'=\',\n field(\'value\', $._expression)\n )),\n \';\'\n ),\n\n use_declaration: $ => seq(\n optional($.visibility_modifier),\n \'use\',\n field(\'argument\', $._use_clause),\n \';\'\n ),\n\n _use_clause: $ => choice(\n $._path,\n $.use_as_clause,\n $.use_list,\n $.scoped_use_list,\n $.use_wildcard\n ),\n\n scoped_use_list: $ => seq(\n field(\'path\', optional($._path)),\n \'::\',\n field(\'list\', $.use_list)\n ),\n\n use_list: $ => seq(\n \'{\',\n sepBy(\',\', choice(\n $._use_clause\n )),\n optional(\',\'),\n \'}\'\n ),\n\n use_as_clause: $ => seq(\n field(\'path\', $._path),\n \'as\',\n field(\'alias\', $.identifier)\n ),\n\n use_wildcard: $ => seq(\n optional(seq($._path, \'::\')),\n \'*\'\n ),\n\n parameters: $ => seq(\n \'(\',\n sepBy(\',\', seq(\n optional($.attribute_item),\n choice(\n $.parameter,\n $.self_parameter,\n $.variadic_parameter,\n \'_\',\n $._type\n ))),\n optional(\',\'),\n \')\'\n ),\n\n self_parameter: $ => seq(\n optional(\'&\'),\n optional($.lifetime),\n optional($.mutable_specifier),\n $.self\n ),\n\n variadic_parameter: $ => \'...\',\n\n parameter: $ => seq(\n optional($.mutable_specifier),\n field(\'pattern\', choice(\n $._pattern,\n $.self,\n $._reserved_identifier,\n )),\n \':\',\n field(\'type\', $._type)\n ),\n\n extern_modifier: $ => seq(\n \'extern\',\n optional($.string_literal)\n ),\n\n visibility_modifier: $ => prec.right(\n choice(\n $.crate,\n seq(\n \'pub\',\n optional(seq(\n \'(\',\n choice(\n $.self,\n $.super,\n $.crate,\n seq(\'in\', $._path)\n ),\n \')\'\n )),\n ),\n )),\n\n // Section - Types\n\n _type: $ => choice(\n $.abstract_type,\n $.reference_type,\n $.metavariable,\n $.pointer_type,\n $.generic_type,\n $.scoped_type_identifier,\n $.tuple_type,\n $.unit_type,\n $.array_type,\n $.function_type,\n $._type_identifier,\n $.macro_invocation,\n $.empty_type,\n $.dynamic_type,\n $.bounded_type,\n alias(choice(...primitive_types), $.primitive_type)\n ),\n\n bracketed_type: $ => seq(\n \'<\',\n choice(\n $._type,\n $.qualified_type\n ),\n \'>\'\n ),\n\n qualified_type: $ => seq(\n field(\'type\', $._type),\n \'as\',\n field(\'alias\', $._type)\n ),\n\n lifetime: $ => seq(\"\'\", $.identifier),\n\n array_type: $ => seq(\n \'[\',\n field(\'element\', $._type),\n optional(seq(\n \';\',\n field(\'length\', $._expression)\n )),\n \']\'\n ),\n\n for_lifetimes: $ => seq(\n \'for\',\n \'<\',\n sepBy1(\',\', $.lifetime),\n optional(\',\'),\n \'>\'\n ),\n\n function_type: $ => seq(\n optional($.for_lifetimes),\n prec(PREC.call, seq(\n choice(\n field(\'trait\', choice(\n $._type_identifier,\n $.scoped_type_identifier\n )),\n seq(\n optional($.function_modifiers),\n \'fn\'\n )\n ),\n field(\'parameters\', $.parameters)\n )),\n optional(seq(\'->\', field(\'return_type\', $._type)))\n ),\n\n tuple_type: $ => seq(\n \'(\',\n sepBy1(\',\', $._type),\n optional(\',\'),\n \')\'\n ),\n\n unit_type: $ => seq(\'(\', \')\'),\n\n generic_function: $ => prec(1, seq(\n field(\'function\', choice(\n $.identifier,\n $.scoped_identifier,\n $.field_expression\n )),\n \'::\',\n field(\'type_arguments\', $.type_arguments)\n )),\n\n generic_type: $ => prec(1, seq(\n field(\'type\', choice(\n $._type_identifier,\n $.scoped_type_identifier\n )),\n field(\'type_arguments\', $.type_arguments)\n )),\n\n generic_type_with_turbofish: $ => seq(\n field(\'type\', choice(\n $._type_identifier,\n $.scoped_identifier\n )),\n \'::\',\n field(\'type_arguments\', $.type_arguments)\n ),\n\n bounded_type: $ => prec.left(-1, choice(\n seq($.lifetime, \'+\', $._type),\n seq($._type, \'+\', $._type),\n seq($._type, \'+\', $.lifetime)\n )),\n\n type_arguments: $ => seq(\n token(prec(1, \'<\')),\n sepBy1(\',\', choice(\n $._type,\n $.type_binding,\n $.lifetime,\n $._literal,\n $.block,\n )),\n optional(\',\'),\n \'>\'\n ),\n\n type_binding: $ => seq(\n field(\'name\', $._type_identifier),\n field(\'type_arguments\', optional($.type_arguments)),\n \'=\',\n field(\'type\', $._type)\n ),\n\n reference_type: $ => seq(\n \'&\',\n optional($.lifetime),\n optional($.mutable_specifier),\n field(\'type\', $._type)\n ),\n\n pointer_type: $ => seq(\n \'*\',\n choice(\'const\', $.mutable_specifier),\n field(\'type\', $._type)\n ),\n\n empty_type: $ => \'!\',\n\n abstract_type: $ => seq(\n \'impl\',\n field(\'trait\', choice(\n $._type_identifier,\n $.scoped_type_identifier,\n $.generic_type,\n $.function_type\n ))\n ),\n\n dynamic_type: $ => seq(\n \'dyn\',\n field(\'trait\', choice(\n $._type_identifier,\n $.scoped_type_identifier,\n $.generic_type,\n $.function_type\n ))\n ),\n\n mutable_specifier: $ => \'mut\',\n\n // Section - Expressions\n\n _expression_except_range: $ => choice(\n $.unary_expression,\n $.reference_expression,\n $.try_expression,\n $.binary_expression,\n $.assignment_expression,\n $.compound_assignment_expr,\n $.type_cast_expression,\n $.call_expression,\n $.return_expression,\n $.yield_expression,\n $._literal,\n prec.left($.identifier),\n alias(choice(...primitive_types), $.identifier),\n prec.left($._reserved_identifier),\n $.self,\n $.scoped_identifier,\n $.generic_function,\n $.await_expression,\n $.field_expression,\n $.array_expression,\n $.tuple_expression,\n prec(1, $.macro_invocation),\n $.unit_expression,\n $.break_expression,\n $.continue_expression,\n $.index_expression,\n $.metavariable,\n $.closure_expression,\n $.parenthesized_expression,\n $.struct_expression,\n $._expression_ending_with_block,\n ),\n\n _expression: $ => choice(\n $._expression_except_range,\n $.range_expression,\n ),\n\n _expression_ending_with_block: $ => choice(\n $.unsafe_block,\n $.async_block,\n $.block,\n $.if_expression,\n $.if_let_expression,\n $.match_expression,\n $.while_expression,\n $.while_let_expression,\n $.loop_expression,\n $.for_expression,\n $.const_block\n ),\n\n macro_invocation: $ => seq(\n field(\'macro\', choice(\n $.scoped_identifier,\n $.identifier,\n $._reserved_identifier,\n )),\n \'!\',\n $.token_tree\n ),\n\n scoped_identifier: $ => seq(\n field(\'path\', optional(choice(\n $._path,\n $.bracketed_type,\n alias($.generic_type_with_turbofish, $.generic_type)\n ))),\n \'::\',\n field(\'name\', $.identifier)\n ),\n\n scoped_type_identifier_in_expression_position: $ => prec(-2, seq(\n field(\'path\', optional(choice(\n $._path,\n alias($.generic_type_with_turbofish, $.generic_type)\n ))),\n \'::\',\n field(\'name\', $._type_identifier)\n )),\n\n scoped_type_identifier: $ => seq(\n field(\'path\', optional(choice(\n $._path,\n alias($.generic_type_with_turbofish, $.generic_type),\n $.bracketed_type,\n $.generic_type\n ))),\n \'::\',\n field(\'name\', $._type_identifier)\n ),\n\n range_expression: $ => prec.left(PREC.range, choice(\n seq($._expression, choice(\'..\', \'...\', \'..=\'), $._expression),\n seq($._expression, \'..\'),\n seq(\'..\', $._expression),\n \'..\'\n )),\n\n unary_expression: $ => prec(PREC.unary, seq(\n choice(\'-\', \'*\', \'!\'),\n $._expression\n )),\n\n try_expression: $ => seq(\n $._expression,\n \'?\'\n ),\n\n reference_expression: $ => prec(PREC.unary, seq(\n \'&\',\n optional($.mutable_specifier),\n field(\'value\', $._expression)\n )),\n\n binary_expression: $ => {\n const table = [\n [PREC.and, \'&&\'],\n [PREC.or, \'||\'],\n [PREC.bitand, \'&\'],\n [PREC.bitor, \'|\'],\n [PREC.bitxor, \'^\'],\n [PREC.comparative, choice(\'==\', \'!=\', \'<\', \'<=\', \'>\', \'>=\')],\n [PREC.shift, choice(\'<<\', \'>>\')],\n [PREC.additive, choice(\'+\', \'-\')],\n [PREC.multiplicative, choice(\'*\', \'/\', \'%\')],\n ];\n\n return choice(...table.map(([precedence, operator]) => prec.left(precedence, seq(\n field(\'left\', $._expression),\n field(\'operator\', operator),\n field(\'right\', $._expression),\n ))));\n },\n\n assignment_expression: $ => prec.left(PREC.assign, seq(\n field(\'left\', $._expression),\n \'=\',\n field(\'right\', $._expression)\n )),\n\n compound_assignment_expr: $ => prec.left(PREC.assign, seq(\n field(\'left\', $._expression),\n field(\'operator\', choice(\'+=\', \'-=\', \'*=\', \'/=\', \'%=\', \'&=\', \'|=\', \'^=\', \'<<=\', \'>>=\')),\n field(\'right\', $._expression)\n )),\n\n type_cast_expression: $ => seq(\n field(\'value\', $._expression),\n \'as\',\n field(\'type\', $._type)\n ),\n\n return_expression: $ => choice(\n prec.left(seq(\'return\', $._expression)),\n prec(-1, \'return\'),\n ),\n\n yield_expression: $ => choice(\n prec.left(seq(\'yield\', $._expression)),\n prec(-1, \'yield\'),\n ),\n\n call_expression: $ => prec(PREC.call, seq(\n field(\'function\', $._expression_except_range),\n field(\'arguments\', $.arguments)\n )),\n\n arguments: $ => seq(\n \'(\',\n sepBy(\',\', seq(repeat($.attribute_item), $._expression)),\n optional(\',\'),\n \')\'\n ),\n\n array_expression: $ => seq(\n \'[\',\n repeat($.attribute_item),\n choice(\n seq(\n $._expression,\n \';\',\n field(\'length\', $._expression)\n ),\n seq(\n sepBy(\',\', $._expression),\n optional(\',\')\n )\n ),\n \']\'\n ),\n\n parenthesized_expression: $ => seq(\n \'(\',\n $._expression,\n \')\'\n ),\n\n tuple_expression: $ => seq(\n \'(\',\n repeat($.attribute_item),\n seq($._expression, \',\'),\n repeat(seq($._expression, \',\')),\n optional($._expression),\n \')\'\n ),\n\n unit_expression: $ => seq(\'(\', \')\'),\n\n struct_expression: $ => seq(\n field(\'name\', choice(\n $._type_identifier,\n alias($.scoped_type_identifier_in_expression_position, $.scoped_type_identifier),\n $.generic_type_with_turbofish\n )),\n field(\'body\', $.field_initializer_list)\n ),\n\n field_initializer_list: $ => seq(\n \'{\',\n sepBy(\',\', choice(\n $.shorthand_field_initializer,\n $.field_initializer,\n $.base_field_initializer\n )),\n optional(\',\'),\n \'}\'\n ),\n\n shorthand_field_initializer: $ => seq(\n repeat($.attribute_item),\n $.identifier\n ),\n\n field_initializer: $ => seq(\n repeat($.attribute_item),\n field(\'name\', $._field_identifier),\n \':\',\n field(\'value\', $._expression)\n ),\n\n base_field_initializer: $ => seq(\n \'..\',\n $._expression\n ),\n\n if_expression: $ => seq(\n \'if\',\n field(\'condition\', $._expression),\n field(\'consequence\', $.block),\n optional(field(\"alternative\", $.else_clause))\n ),\n\n if_let_expression: $ => seq(\n \'if\',\n \'let\',\n field(\'pattern\', $._pattern),\n \'=\',\n field(\'value\', $._expression),\n field(\'consequence\', $.block),\n optional(field(\'alternative\', $.else_clause))\n ),\n\n else_clause: $ => seq(\n \'else\',\n choice(\n $.block,\n $.if_expression,\n $.if_let_expression\n )\n ),\n\n match_expression: $ => seq(\n \'match\',\n field(\'value\', $._expression),\n field(\'body\', $.match_block)\n ),\n\n match_block: $ => seq(\n \'{\',\n optional(seq(\n repeat($.match_arm),\n alias($.last_match_arm, $.match_arm)\n )),\n \'}\'\n ),\n\n match_arm: $ => seq(\n repeat($.attribute_item),\n field(\'pattern\', choice(\n $.macro_invocation,\n $.match_pattern\n )),\n \'=>\',\n choice(\n seq(field(\'value\', $._expression), \',\'),\n field(\'value\', prec(1, $._expression_ending_with_block))\n )\n ),\n\n last_match_arm: $ => seq(\n repeat($.attribute_item),\n field(\'pattern\', $.match_pattern),\n \'=>\',\n field(\'value\', $._expression),\n optional(\',\')\n ),\n\n match_pattern: $ => seq(\n $._pattern,\n optional(seq(\'if\', field(\'condition\', $._expression)))\n ),\n\n while_expression: $ => seq(\n optional(seq($.loop_label, \':\')),\n \'while\',\n field(\'condition\', $._expression),\n field(\'body\', $.block)\n ),\n\n while_let_expression: $ => seq(\n optional(seq($.loop_label, \':\')),\n \'while\',\n \'let\',\n field(\'pattern\', $._pattern),\n \'=\',\n field(\'value\', $._expression),\n field(\'body\', $.block)\n ),\n\n loop_expression: $ => seq(\n optional(seq($.loop_label, \':\')),\n \'loop\',\n field(\'body\', $.block)\n ),\n\n for_expression: $ => seq(\n optional(seq($.loop_label, \':\')),\n \'for\',\n field(\'pattern\', $._pattern),\n \'in\',\n field(\'value\', $._expression),\n field(\'body\', $.block)\n ),\n\n const_block: $ => seq(\n \'const\',\n field(\'body\', $.block)\n ),\n\n closure_expression: $ => prec(PREC.closure, seq(\n optional(\'move\'),\n field(\'parameters\', $.closure_parameters),\n choice(\n seq(\n optional(seq(\'->\', field(\'return_type\', $._type))),\n field(\'body\', $.block)\n ),\n field(\'body\', $._expression)\n )\n )),\n\n closure_parameters: $ => seq(\n \'|\',\n sepBy(\',\', choice(\n $._pattern,\n $.parameter\n )),\n \'|\'\n ),\n\n loop_label: $ => seq(\'\\\'\', $.identifier),\n\n break_expression: $ => prec.left(seq(\'break\', optional($.loop_label), optional($._expression))),\n\n continue_expression: $ => prec.left(seq(\'continue\', optional($.loop_label))),\n\n index_expression: $ => prec(PREC.call, seq($._expression, \'[\', $._expression, \']\')),\n\n await_expression: $ => prec(PREC.field, seq(\n $._expression,\n \'.\',\n \'await\'\n )),\n\n field_expression: $ => prec(PREC.field, seq(\n field(\'value\', $._expression),\n \'.\',\n field(\'field\', choice(\n $._field_identifier,\n $.integer_literal\n ))\n )),\n\n unsafe_block: $ => seq(\n \'unsafe\',\n $.block\n ),\n\n async_block: $ => seq(\n \'async\',\n optional(\"move\"),\n $.block\n ),\n\n block: $ => seq(\n \'{\',\n repeat($._statement),\n optional($._expression),\n \'}\'\n ),\n\n // Section - Patterns\n\n _pattern: $ => choice(\n $._literal_pattern,\n alias(choice(...primitive_types), $.identifier),\n $.identifier,\n $.scoped_identifier,\n $.tuple_pattern,\n $.tuple_struct_pattern,\n $.struct_pattern,\n $.ref_pattern,\n $.slice_pattern,\n $.captured_pattern,\n $.reference_pattern,\n $.remaining_field_pattern,\n $.mut_pattern,\n $.range_pattern,\n $.or_pattern,\n $.const_block,\n \'_\'\n ),\n\n tuple_pattern: $ => seq(\n \'(\',\n sepBy(\',\', $._pattern),\n optional(\',\'),\n \')\'\n ),\n\n slice_pattern: $ => seq(\n \'[\',\n sepBy(\',\', $._pattern),\n optional(\',\'),\n \']\'\n ),\n\n tuple_struct_pattern: $ => seq(\n field(\'type\', choice(\n $.identifier,\n $.scoped_identifier\n )),\n \'(\',\n sepBy(\',\', $._pattern),\n optional(\',\'),\n \')\'\n ),\n\n struct_pattern: $ => seq(\n field(\'type\', choice(\n $._type_identifier,\n $.scoped_type_identifier\n )),\n \'{\',\n sepBy(\',\', choice($.field_pattern, $.remaining_field_pattern)),\n optional(\',\'),\n \'}\'\n ),\n\n field_pattern: $ => seq(\n optional(\'ref\'),\n optional($.mutable_specifier),\n choice(\n field(\'name\', alias($.identifier, $.shorthand_field_identifier)),\n seq(\n field(\'name\', $._field_identifier),\n \':\',\n field(\'pattern\', $._pattern)\n )\n )\n ),\n\n remaining_field_pattern: $ => \'..\',\n\n mut_pattern: $ => prec(-1, seq(\n $.mutable_specifier,\n $._pattern\n )),\n\n range_pattern: $ => seq(\n choice(\n $._literal_pattern,\n $._path,\n ),\n choice(\'...\', \'..=\'),\n choice(\n $._literal_pattern,\n $._path,\n ),\n ),\n\n ref_pattern: $ => seq(\n \'ref\',\n $._pattern\n ),\n\n captured_pattern: $ => seq(\n $.identifier,\n \'@\',\n $._pattern,\n ),\n\n reference_pattern: $ => seq(\n \'&\',\n optional($.mutable_specifier),\n $._pattern\n ),\n\n or_pattern: $ => prec.left(-2, seq(\n $._pattern,\n \'|\',\n $._pattern,\n )),\n\n // Section - Literals\n\n _literal: $ => choice(\n $.string_literal,\n $.raw_string_literal,\n $.char_literal,\n $.boolean_literal,\n $.integer_literal,\n $.float_literal,\n ),\n\n _literal_pattern: $ => choice(\n $.string_literal,\n $.raw_string_literal,\n $.char_literal,\n $.boolean_literal,\n $.integer_literal,\n $.float_literal,\n $.negative_literal,\n ),\n\n negative_literal: $ => seq(\'-\', choice($.integer_literal, $.float_literal)),\n\n integer_literal: $ => token(seq(\n choice(\n /[0-9][0-9_]*/,\n /0x[0-9a-fA-F_]+/,\n /0b[01_]+/,\n /0o[0-7_]+/\n ),\n optional(choice(...numeric_types))\n )),\n\n string_literal: $ => seq(\n alias(/b?\"/, \'\"\'),\n repeat(choice(\n $.escape_sequence,\n $._string_content\n )),\n token.immediate(\'\"\')\n ),\n\n char_literal: $ => token(seq(\n optional(\'b\'),\n \'\\\'\',\n optional(choice(\n seq(\'\\\\\', choice(\n /[^xu]/,\n /u[0-9a-fA-F]{4}/,\n /u{[0-9a-fA-F]+}/,\n /x[0-9a-fA-F]{2}/\n )),\n /[^\\\\\']/\n )),\n \'\\\'\'\n )),\n\n escape_sequence: $ => token.immediate(\n seq(\'\\\\\',\n choice(\n /[^xu]/,\n /u[0-9a-fA-F]{4}/,\n /u{[0-9a-fA-F]+}/,\n /x[0-9a-fA-F]{2}/\n )\n )),\n\n boolean_literal: $ => choice(\'true\', \'false\'),\n\n comment: $ => choice(\n $.line_comment,\n $.block_comment\n ),\n\n line_comment: $ => token(seq(\n \'//\', /.*/\n )),\n\n _path: $ => choice(\n $.self,\n alias(choice(...primitive_types), $.identifier),\n $.metavariable,\n $.super,\n $.crate,\n $.identifier,\n $.scoped_identifier,\n $._reserved_identifier,\n ),\n\n identifier: $ => /(r#)?[_\\p{XID_Start}][_\\p{XID_Continue}]*/,\n\n _reserved_identifier: $ => alias(choice(\n \'default\',\n \'union\',\n ), $.identifier),\n\n _type_identifier: $ => alias($.identifier, $.type_identifier),\n _field_identifier: $ => alias($.identifier, $.field_identifier),\n\n self: $ => \'self\',\n super: $ => \'super\',\n crate: $ => \'crate\',\n\n metavariable: $ => /\\$[a-zA-Z_]\\w*/\n }\n})\n\nfunction sepBy1(sep, rule) {\n return seq(rule, repeat(seq(sep, rule)))\n}\n\nfunction sepBy(sep, rule) {\n return optional(sepBy1(sep, rule))\n}\n";
Expand description
The source of the Rust tree-sitter grammar description.