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.