Merge commit '06dfec714e2424be9d19aacb739771746f5aec2b'

pull/261/head
Wilfred Hughes 2022-04-17 19:09:58 +07:00
commit a7e298dfa1
16 changed files with 139000 additions and 101065 deletions

@ -7,7 +7,7 @@ Added support for Kotlin and TOML.
Fixed an issue with YAML and `|` block strings.
Updated to the latest upstream C++, C#, Elixir, Go, Haskell, Java,
Python, Ruby and TypeScript parsers.
Python, Ruby, Rust and TypeScript parsers.
### Diffing

@ -1,7 +1,7 @@
[package]
name = "tree-sitter-rust"
description = "Rust grammar for the tree-sitter parsing library"
version = "0.19.1"
version = "0.20.1"
authors = ["Max Brunsfeld <maxbrunsfeld@gmail.com>"]
license = "MIT"
readme = "bindings/rust/README.md"
@ -23,7 +23,7 @@ autoexamples = false
path = "bindings/rust/lib.rs"
[dependencies]
tree-sitter = "0.19"
tree-sitter = "0.20"
[build-dependencies]
cc = "1.0"

@ -1,6 +1,6 @@
============================================
================================================================================
Async function
============================================
================================================================================
async fn abc() {}
@ -8,7 +8,7 @@ async fn main() {
let x = futures.await?;
}
---
--------------------------------------------------------------------------------
(source_file
(function_item
@ -16,56 +16,73 @@ async fn main() {
(identifier)
(parameters)
(block))
(function_item (function_modifiers) (identifier) (parameters)
(function_item
(function_modifiers)
(identifier)
(parameters)
(block
(let_declaration (identifier) (try_expression
(await_expression (identifier)))))))
(let_declaration
(identifier)
(try_expression
(await_expression
(identifier)))))))
============================================
================================================================================
Await expression
============================================
================================================================================
futures.await;
futures.await?;
futures.await?.await?;
futures.await?.function().await?;
---
--------------------------------------------------------------------------------
(source_file
(await_expression (identifier))
(try_expression
(await_expression (identifier)))
(try_expression
(expression_statement
(await_expression
(try_expression
(await_expression (identifier)))))
(try_expression
(await_expression
(call_expression
(field_expression
(try_expression
(await_expression (identifier)))
(field_identifier))
(arguments)))))
(identifier)))
(expression_statement
(try_expression
(await_expression
(identifier))))
(expression_statement
(try_expression
(await_expression
(try_expression
(await_expression
(identifier))))))
(expression_statement
(try_expression
(await_expression
(call_expression
(field_expression
(try_expression
(await_expression
(identifier)))
(field_identifier))
(arguments))))))
============================================
================================================================================
Async Block
============================================
================================================================================
async {}
async { let x = 10; }
async move {}
---
--------------------------------------------------------------------------------
(source_file
(async_block
(block))
(async_block
(block
(let_declaration
(identifier)
(integer_literal))))
(async_block
(block)))
(expression_statement
(async_block
(block)))
(expression_statement
(async_block
(block
(let_declaration
(identifier)
(integer_literal)))))
(expression_statement
(async_block
(block))))

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

@ -1,6 +1,6 @@
============================================
================================================================================
Integer literals
============================================
================================================================================
0;
0___0;
@ -14,24 +14,35 @@ Integer literals
0b1111_1111_1001_0000_i32;
1u128;
---
--------------------------------------------------------------------------------
(source_file
(integer_literal)
(integer_literal)
(integer_literal)
(integer_literal)
(integer_literal)
(integer_literal)
(integer_literal)
(integer_literal)
(integer_literal)
(integer_literal)
(integer_literal))
============================================
(expression_statement
(integer_literal))
(expression_statement
(integer_literal))
(expression_statement
(integer_literal))
(expression_statement
(integer_literal))
(expression_statement
(integer_literal))
(expression_statement
(integer_literal))
(expression_statement
(integer_literal))
(expression_statement
(integer_literal))
(expression_statement
(integer_literal))
(expression_statement
(integer_literal))
(expression_statement
(integer_literal)))
================================================================================
Floating-point literals
============================================
================================================================================
123.123;
2.;
@ -40,19 +51,25 @@ Floating-point literals
0.1f32;
12E+99_f64;
---
--------------------------------------------------------------------------------
(source_file
(float_literal)
(float_literal)
(float_literal)
(float_literal)
(float_literal)
(float_literal))
============================================
(expression_statement
(float_literal))
(expression_statement
(float_literal))
(expression_statement
(float_literal))
(expression_statement
(float_literal))
(expression_statement
(float_literal))
(expression_statement
(float_literal)))
================================================================================
String literals
============================================
================================================================================
"";
"abc";
@ -64,52 +81,75 @@ b"foo\nbar";
"foo\x42\x43bar";
"foo \x42 \x43 bar";
---
--------------------------------------------------------------------------------
(source_file
(string_literal)
(string_literal)
(string_literal (escape_sequence))
(string_literal (escape_sequence))
(string_literal (escape_sequence) (escape_sequence))
(string_literal)
(string_literal (escape_sequence) (escape_sequence))
(string_literal (escape_sequence) (escape_sequence)))
============================================
(expression_statement
(string_literal))
(expression_statement
(string_literal))
(expression_statement
(string_literal
(escape_sequence)))
(expression_statement
(string_literal
(escape_sequence)))
(expression_statement
(string_literal
(escape_sequence)
(escape_sequence)))
(expression_statement
(string_literal))
(expression_statement
(string_literal
(escape_sequence)
(escape_sequence)))
(expression_statement
(string_literal
(escape_sequence)
(escape_sequence))))
================================================================================
Raw string literals
============================================
================================================================================
r#"abc"#; r##"ok"##;
r##"foo #"# bar"##;
r###"foo ##"## bar"###;
r######"foo ##### bar"######;
---
--------------------------------------------------------------------------------
(source_file
(raw_string_literal)
(raw_string_literal)
(raw_string_literal)
(raw_string_literal)
(raw_string_literal))
============================================
(expression_statement
(raw_string_literal))
(expression_statement
(raw_string_literal))
(expression_statement
(raw_string_literal))
(expression_statement
(raw_string_literal))
(expression_statement
(raw_string_literal)))
================================================================================
Raw byte string literals
============================================
================================================================================
br#"abc"#;
br##"abc"##;
---
--------------------------------------------------------------------------------
(source_file
(raw_string_literal)
(raw_string_literal))
(expression_statement
(raw_string_literal))
(expression_statement
(raw_string_literal)))
============================================
================================================================================
Character literals
============================================
================================================================================
'a';
'\'';
@ -119,24 +159,35 @@ b'x';
'\xff';
'\\';
---
--------------------------------------------------------------------------------
(source_file
(char_literal)
(char_literal)
(char_literal)
(char_literal)
(char_literal)
(char_literal)
(char_literal))
============================================
(expression_statement
(char_literal))
(expression_statement
(char_literal))
(expression_statement
(char_literal))
(expression_statement
(char_literal))
(expression_statement
(char_literal))
(expression_statement
(char_literal))
(expression_statement
(char_literal)))
================================================================================
Boolean literals
============================================
================================================================================
true;
false;
---
--------------------------------------------------------------------------------
(source_file (boolean_literal) (boolean_literal))
(source_file
(expression_statement
(boolean_literal))
(expression_statement
(boolean_literal)))

@ -1,6 +1,6 @@
============================================
================================================================================
Macro invocation - no arguments
============================================
================================================================================
a!();
b![];
@ -8,18 +8,39 @@ c!{};
d::e!();
f::g::h!{};
---
--------------------------------------------------------------------------------
(source_file
(macro_invocation (identifier) (token_tree))
(macro_invocation (identifier) (token_tree))
(macro_invocation (identifier) (token_tree))
(macro_invocation (scoped_identifier (identifier) (identifier)) (token_tree))
(macro_invocation (scoped_identifier (scoped_identifier (identifier) (identifier)) (identifier)) (token_tree)))
(expression_statement
(macro_invocation
(identifier)
(token_tree)))
(expression_statement
(macro_invocation
(identifier)
(token_tree)))
(expression_statement
(macro_invocation
(identifier)
(token_tree)))
(expression_statement
(macro_invocation
(scoped_identifier
(identifier)
(identifier))
(token_tree)))
(expression_statement
(macro_invocation
(scoped_identifier
(scoped_identifier
(identifier)
(identifier))
(identifier))
(token_tree))))
============================================
================================================================================
Macro invocation - arbitrary tokens
============================================
================================================================================
a!(* a *);
a!(& a &);
@ -30,57 +51,129 @@ a!('\u{0}'..='\u{2}');
a!('lifetime)
default!(a);
union!(a);
a!($);
a!($());
a!($ a $);
a!(${$([ a ])});
a!($a $a:ident $($a);*);
----
--------------------------------------------------------------------------------
(source_file
(expression_statement
(macro_invocation
(identifier)
(token_tree
(non_special_punctuation)
(identifier)
(non_special_punctuation))))
(expression_statement
(macro_invocation
(identifier)
(token_tree
(non_special_punctuation)
(identifier)
(non_special_punctuation))))
(expression_statement
(macro_invocation
(identifier)
(token_tree
(non_special_punctuation)
(identifier)
(non_special_punctuation))))
(expression_statement
(macro_invocation
(identifier)
(token_tree
(identifier)
(non_special_punctuation)
(identifier)
(non_special_punctuation)
(non_special_punctuation))))
(expression_statement
(macro_invocation
(identifier)
(token_tree
(char_literal)
(non_special_punctuation)
(char_literal))))
(expression_statement
(macro_invocation
(identifier)
(token_tree
(char_literal)
(non_special_punctuation)
(char_literal))))
(macro_invocation
(identifier)
(token_tree (identifier)))
(macro_invocation
(identifier)
(token_tree (identifier)))
(macro_invocation
(identifier)
(token_tree (identifier)))
(macro_invocation
(identifier)
(token_tree (identifier) (identifier)))
(macro_invocation
(identifier)
(token_tree (char_literal) (char_literal)))
(macro_invocation
(identifier)
(token_tree (char_literal) (char_literal)))
(macro_invocation
(identifier)
(token_tree (identifier)))
(macro_invocation
(identifier)
(token_tree (identifier)))
(macro_invocation
(identifier)
(token_tree (identifier))))
(token_tree
(identifier)))
(expression_statement
(macro_invocation
(identifier)
(token_tree
(identifier))))
(expression_statement
(macro_invocation
(identifier)
(token_tree
(identifier))))
(expression_statement
(macro_invocation
(identifier)
(token_tree)))
(expression_statement
(macro_invocation
(identifier)
(token_tree
(token_tree))))
(expression_statement
(macro_invocation
(identifier)
(token_tree
(identifier))))
(expression_statement
(macro_invocation
(identifier)
(token_tree
(token_tree
(token_tree
(token_tree
(identifier)))))))
(expression_statement
(macro_invocation
(identifier)
(token_tree
(identifier)
(identifier)
(non_special_punctuation)
(identifier)
(token_tree
(identifier))
(non_special_punctuation)
(non_special_punctuation)))))
=====================================
================================================================================
Macro invocation with comments
=====================================
================================================================================
ok! {
// one
/* two */
}
---
--------------------------------------------------------------------------------
(source_file
(macro_invocation
(identifier)
(token_tree (line_comment) (block_comment))))
(token_tree
(line_comment)
(block_comment))))
============================================
================================================================================
Macro definition
============================================
================================================================================
macro_rules! say_hello {
() => (
@ -111,7 +204,7 @@ macro_rules! zero_or_one {
};
}
----
--------------------------------------------------------------------------------
(source_file
(macro_definition
@ -120,38 +213,47 @@ macro_rules! zero_or_one {
left: (token_tree_pattern)
right: (token_tree
(identifier)
(non_special_punctuation)
(token_tree
(string_literal)))))
(string_literal))
(non_special_punctuation))))
(macro_definition
name: (identifier)
(macro_rule
left: (token_tree_pattern)
right: (token_tree
(integer_literal)
(non_special_punctuation)
(integer_literal))))
(macro_definition
name: (identifier)
(macro_rule
left: (token_tree_pattern
(identifier)
(non_special_punctuation)
(token_binding_pattern
name: (metavariable)
type: (fragment_specifier)))
right: (token_tree
(identifier)
(non_special_punctuation)
(token_tree
(string_literal)
(non_special_punctuation)
(metavariable))))
(macro_rule
left: (token_tree_pattern
(identifier)
(non_special_punctuation)
(token_binding_pattern
name: (metavariable)
type: (fragment_specifier)))
right: (token_tree
(identifier)
(non_special_punctuation)
(token_tree
(string_literal)
(non_special_punctuation)
(metavariable)))))
(macro_definition
name: (identifier)
@ -161,6 +263,7 @@ macro_rules! zero_or_one {
(token_binding_pattern
name: (metavariable)
type: (fragment_specifier))
(non_special_punctuation)
(token_tree_pattern
(token_repetition_pattern
(token_binding_pattern
@ -170,6 +273,7 @@ macro_rules! zero_or_one {
(token_repetition
(token_repetition
(metavariable)
(non_special_punctuation)
(metavariable))))))
(macro_definition
name: (identifier)

@ -1,26 +1,36 @@
=================================
================================================================================
Tuple struct patterns
=================================
================================================================================
match x {
Some(x) => "some",
std::None() => "none"
}
---
--------------------------------------------------------------------------------
(source_file
(match_expression (identifier) (match_block
(match_arm
(match_pattern (tuple_struct_pattern (identifier) (identifier)))
(string_literal))
(match_arm
(match_pattern (tuple_struct_pattern (scoped_identifier (identifier) (identifier))))
(string_literal)))))
=================================
(expression_statement
(match_expression
(identifier)
(match_block
(match_arm
(match_pattern
(tuple_struct_pattern
(identifier)
(identifier)))
(string_literal))
(match_arm
(match_pattern
(tuple_struct_pattern
(scoped_identifier
(identifier)
(identifier))))
(string_literal))))))
================================================================================
Reference patterns
=================================
================================================================================
match x {
A(ref x) => x.0,
@ -28,51 +38,82 @@ match x {
& mut z => z,
}
---
--------------------------------------------------------------------------------
(source_file
(match_expression (identifier) (match_block
(match_arm
(match_pattern (tuple_struct_pattern (identifier) (ref_pattern (identifier))))
(field_expression (identifier) (integer_literal)))
(match_arm
(match_pattern (ref_pattern (mut_pattern (mutable_specifier) (identifier))))
(identifier))
(match_arm
(match_pattern (reference_pattern (mutable_specifier) (identifier)))
(identifier)))))
=================================
(expression_statement
(match_expression
(identifier)
(match_block
(match_arm
(match_pattern
(tuple_struct_pattern
(identifier)
(ref_pattern
(identifier))))
(field_expression
(identifier)
(integer_literal)))
(match_arm
(match_pattern
(ref_pattern
(mut_pattern
(mutable_specifier)
(identifier))))
(identifier))
(match_arm
(match_pattern
(reference_pattern
(mutable_specifier)
(identifier)))
(identifier))))))
================================================================================
Struct patterns
=================================
================================================================================
match x {
Person{name, age} if age < 5 => ("toddler", name),
Person{name: adult_name, age: _} => ("adult", adult_name),
}
---
--------------------------------------------------------------------------------
(source_file
(match_expression (identifier) (match_block
(match_arm
(match_pattern (struct_pattern
(type_identifier)
(field_pattern (shorthand_field_identifier))
(field_pattern (shorthand_field_identifier)))
(binary_expression (identifier) (integer_literal)))
(tuple_expression (string_literal) (identifier)))
(match_arm
(match_pattern
(struct_pattern
(type_identifier)
(field_pattern (field_identifier) (identifier))
(field_pattern (field_identifier))))
(tuple_expression (string_literal) (identifier))))))
=================================
(expression_statement
(match_expression
(identifier)
(match_block
(match_arm
(match_pattern
(struct_pattern
(type_identifier)
(field_pattern
(shorthand_field_identifier))
(field_pattern
(shorthand_field_identifier)))
(binary_expression
(identifier)
(integer_literal)))
(tuple_expression
(string_literal)
(identifier)))
(match_arm
(match_pattern
(struct_pattern
(type_identifier)
(field_pattern
(field_identifier)
(identifier))
(field_pattern
(field_identifier))))
(tuple_expression
(string_literal)
(identifier)))))))
================================================================================
Ignored patterns
=================================
================================================================================
match x {
(a, ..) => a,
@ -80,29 +121,40 @@ match x {
D::E{f: g, ..} => g
}
---
--------------------------------------------------------------------------------
(source_file
(match_expression (identifier) (match_block
(match_arm
(match_pattern
(tuple_pattern (identifier) (remaining_field_pattern)))
(identifier))
(match_arm
(match_pattern
(tuple_struct_pattern (identifier) (remaining_field_pattern)))
(identifier))
(match_arm
(match_pattern
(struct_pattern
(scoped_type_identifier (identifier) (type_identifier))
(field_pattern (field_identifier) (identifier))
(remaining_field_pattern)))
(identifier)))))
=================================
(expression_statement
(match_expression
(identifier)
(match_block
(match_arm
(match_pattern
(tuple_pattern
(identifier)
(remaining_field_pattern)))
(identifier))
(match_arm
(match_pattern
(tuple_struct_pattern
(identifier)
(remaining_field_pattern)))
(identifier))
(match_arm
(match_pattern
(struct_pattern
(scoped_type_identifier
(identifier)
(type_identifier))
(field_pattern
(field_identifier)
(identifier))
(remaining_field_pattern)))
(identifier))))))
================================================================================
Captured patterns
=================================
================================================================================
match x {
a @ A(_) | b @ B(..) => a,
@ -112,61 +164,62 @@ match x {
a @ b..=c => a,
}
---
--------------------------------------------------------------------------------
(source_file
(match_expression
value: (identifier)
body: (match_block
(match_arm
pattern: (match_pattern
(or_pattern
(expression_statement
(match_expression
value: (identifier)
body: (match_block
(match_arm
pattern: (match_pattern
(or_pattern
(captured_pattern
(identifier)
(tuple_struct_pattern
type: (identifier)))
(captured_pattern
(identifier)
(tuple_struct_pattern
type: (identifier)
(remaining_field_pattern)))))
value: (identifier))
(match_arm
pattern: (match_pattern
(captured_pattern
(identifier)
(tuple_struct_pattern
type: (identifier)))
(range_pattern
(integer_literal)
(integer_literal))))
value: (identifier))
(match_arm
pattern: (match_pattern
(tuple_struct_pattern
type: (identifier)
(range_pattern
(integer_literal)
(integer_literal))))
value: (identifier))
(match_arm
pattern: (match_pattern
(captured_pattern
(identifier)
(tuple_struct_pattern
type: (identifier)
(remaining_field_pattern)))))
value: (identifier))
(match_arm
pattern: (match_pattern
(captured_pattern
(identifier)
(range_pattern
(integer_literal)
(integer_literal))))
value: (identifier))
(match_arm
pattern: (match_pattern
(tuple_struct_pattern
type: (identifier)
(range_pattern
(integer_literal)
(integer_literal))))
value: (identifier))
(match_arm
pattern: (match_pattern
(captured_pattern
(identifier)
(range_pattern
(identifier)
(identifier))))
value: (identifier))
(match_arm
pattern: (match_pattern
(captured_pattern
(identifier)
(range_pattern
(range_pattern
(identifier)
(identifier))))
value: (identifier))
(match_arm
pattern: (match_pattern
(captured_pattern
(identifier)
(identifier))))
value: (identifier)))))
(range_pattern
(identifier)
(identifier))))
value: (identifier))))))
=================================
================================================================================
Or patterns
=================================
================================================================================
if let A(x) | B(x) = expr {
do_stuff_with(x);
@ -196,37 +249,41 @@ fn foo((1 | 2 | 3): u8) {}
// Not handled cause devs didn't got into agreement if should be acceptd or not
// |Ok(x) | Err(x)| expr();
---
--------------------------------------------------------------------------------
(source_file
(if_let_expression
pattern: (or_pattern
(tuple_struct_pattern
type: (identifier)
(identifier))
(tuple_struct_pattern
type: (identifier)
(identifier)))
value: (identifier)
consequence: (block
(call_expression
function: (identifier)
arguments: (arguments
(identifier)))))
(while_let_expression
pattern: (or_pattern
(tuple_struct_pattern
type: (identifier)
(identifier))
(tuple_struct_pattern
type: (identifier)
(identifier)))
value: (identifier)
body: (block
(call_expression
function: (identifier)
arguments: (arguments
(identifier)))))
(expression_statement
(if_let_expression
pattern: (or_pattern
(tuple_struct_pattern
type: (identifier)
(identifier))
(tuple_struct_pattern
type: (identifier)
(identifier)))
value: (identifier)
consequence: (block
(expression_statement
(call_expression
function: (identifier)
arguments: (arguments
(identifier)))))))
(expression_statement
(while_let_expression
pattern: (or_pattern
(tuple_struct_pattern
type: (identifier)
(identifier))
(tuple_struct_pattern
type: (identifier)
(identifier)))
value: (identifier)
body: (block
(expression_statement
(call_expression
function: (identifier)
arguments: (arguments
(identifier)))))))
(let_declaration
pattern: (or_pattern
(tuple_struct_pattern
@ -242,13 +299,14 @@ fn foo((1 | 2 | 3): u8) {}
arguments: (arguments
(reference_expression
value: (identifier)))))
(for_expression
pattern: (or_pattern
(ref_pattern
(expression_statement
(for_expression
pattern: (or_pattern
(ref_pattern
(identifier))
(identifier))
(identifier))
value: (identifier)
body: (block))
value: (identifier)
body: (block)))
(let_declaration
pattern: (or_pattern
(tuple_struct_pattern
@ -261,27 +319,29 @@ fn foo((1 | 2 | 3): u8) {}
function: (identifier)
arguments: (arguments
(identifier))))
(for_expression
pattern: (or_pattern
(or_pattern
(identifier)
(identifier))
(identifier))
value: (identifier)
body: (block))
(closure_expression
parameters: (closure_parameters
(tuple_pattern
(expression_statement
(for_expression
pattern: (or_pattern
(or_pattern
(tuple_struct_pattern
type: (identifier)
(identifier))
(tuple_struct_pattern
type: (identifier)
(identifier)))))
body: (call_expression
function: (identifier)
arguments: (arguments)))
(identifier)
(identifier))
(identifier))
value: (identifier)
body: (block)))
(expression_statement
(closure_expression
parameters: (closure_parameters
(tuple_pattern
(or_pattern
(tuple_struct_pattern
type: (identifier)
(identifier))
(tuple_struct_pattern
type: (identifier)
(identifier)))))
body: (call_expression
function: (identifier)
arguments: (arguments))))
(let_declaration
pattern: (ref_pattern
(mut_pattern
@ -311,9 +371,9 @@ fn foo((1 | 2 | 3): u8) {}
(line_comment)
(line_comment))
===========================================
================================================================================
Inline const or Const blocks as pattern
===========================================
================================================================================
fn foo(x: i32) {
const CUBE: i32 = 3.pow(3);
@ -330,7 +390,7 @@ fn foo(x: i32) {
}
}
---
--------------------------------------------------------------------------------
(source_file
(function_item
@ -349,19 +409,20 @@ fn foo(x: i32) {
field: (field_identifier))
arguments: (arguments
(integer_literal))))
(match_expression
value: (identifier)
body: (match_block
(match_arm
pattern: (match_pattern
(identifier))
value: (macro_invocation
macro: (identifier)
(token_tree
(string_literal))))
(match_arm
pattern: (match_pattern)
value: (block))))))
(expression_statement
(match_expression
value: (identifier)
body: (match_block
(match_arm
pattern: (match_pattern
(identifier))
value: (macro_invocation
macro: (identifier)
(token_tree
(string_literal))))
(match_arm
pattern: (match_pattern)
value: (block)))))))
(function_item
name: (identifier)
parameters: (parameters
@ -369,23 +430,24 @@ fn foo(x: i32) {
pattern: (identifier)
type: (primitive_type)))
body: (block
(match_expression
value: (identifier)
body: (match_block
(match_arm
pattern: (match_pattern
(const_block
body: (block
(call_expression
function: (field_expression
value: (integer_literal)
field: (field_identifier))
arguments: (arguments
(integer_literal))))))
value: (macro_invocation
macro: (identifier)
(token_tree
(string_literal))))
(match_arm
pattern: (match_pattern)
value: (block)))))))
(expression_statement
(match_expression
value: (identifier)
body: (match_block
(match_arm
pattern: (match_pattern
(const_block
body: (block
(call_expression
function: (field_expression
value: (integer_literal)
field: (field_identifier))
arguments: (arguments
(integer_literal))))))
value: (macro_invocation
macro: (identifier)
(token_tree
(string_literal))))
(match_arm
pattern: (match_pattern)
value: (block))))))))

@ -1,123 +1,187 @@
=====================
================================================================================
The unit type
=====================
================================================================================
type A = ();
---
--------------------------------------------------------------------------------
(source_file
(type_item (type_identifier) (unit_type)))
(type_item
(type_identifier)
(unit_type)))
=====================
================================================================================
Tuple types
=====================
================================================================================
type A = (i32, String);
---
--------------------------------------------------------------------------------
(source_file
(type_item (type_identifier) (tuple_type (primitive_type) (type_identifier))))
(type_item
(type_identifier)
(tuple_type
(primitive_type)
(type_identifier))))
=====================
================================================================================
Reference types
=====================
================================================================================
type A = &B;
type C = &'a str;
type D = &'a mut str;
---
--------------------------------------------------------------------------------
(source_file
(type_item (type_identifier) (reference_type (type_identifier)))
(type_item (type_identifier) (reference_type (lifetime (identifier)) (primitive_type)))
(type_item (type_identifier) (reference_type (lifetime (identifier)) (mutable_specifier) (primitive_type))))
(type_item
(type_identifier)
(reference_type
(type_identifier)))
(type_item
(type_identifier)
(reference_type
(lifetime
(identifier))
(primitive_type)))
(type_item
(type_identifier)
(reference_type
(lifetime
(identifier))
(mutable_specifier)
(primitive_type))))
=====================
================================================================================
Raw pointer types
=====================
================================================================================
type A = *mut B;
type C = *const str;
---
--------------------------------------------------------------------------------
(source_file
(type_item (type_identifier) (pointer_type (mutable_specifier) (type_identifier)))
(type_item (type_identifier) (pointer_type (primitive_type))))
(type_item
(type_identifier)
(pointer_type
(mutable_specifier)
(type_identifier)))
(type_item
(type_identifier)
(pointer_type
(primitive_type))))
=====================
================================================================================
Generic types
=====================
================================================================================
type A = B<C>;
type D = E<F, str>;
type G = H<'a, I>;
type J = H<K=L>;
---
--------------------------------------------------------------------------------
(source_file
(type_item
(type_identifier)
(generic_type (type_identifier) (type_arguments (type_identifier))))
(generic_type
(type_identifier)
(type_arguments
(type_identifier))))
(type_item
(type_identifier)
(generic_type (type_identifier) (type_arguments (type_identifier) (primitive_type))))
(generic_type
(type_identifier)
(type_arguments
(type_identifier)
(primitive_type))))
(type_item
(type_identifier)
(generic_type (type_identifier) (type_arguments (lifetime (identifier)) (type_identifier))))
(generic_type
(type_identifier)
(type_arguments
(lifetime
(identifier))
(type_identifier))))
(type_item
(type_identifier)
(generic_type (type_identifier) (type_arguments (type_binding (type_identifier) (type_identifier))))))
(generic_type
(type_identifier)
(type_arguments
(type_binding
(type_identifier)
(type_identifier))))))
=====================
================================================================================
Scoped types
=====================
================================================================================
type A = B::C;
type D = E::F::G;
type H = I::J<K>;
type L = M<N>::O;
---
--------------------------------------------------------------------------------
(source_file
(type_item
(type_identifier)
(scoped_type_identifier (identifier) (type_identifier)))
(scoped_type_identifier
(identifier)
(type_identifier)))
(type_item
(type_identifier)
(scoped_type_identifier (scoped_identifier (identifier) (identifier)) (type_identifier)))
(scoped_type_identifier
(scoped_identifier
(identifier)
(identifier))
(type_identifier)))
(type_item
(type_identifier)
(generic_type
(scoped_type_identifier (identifier) (type_identifier))
(type_arguments (type_identifier))))
(scoped_type_identifier
(identifier)
(type_identifier))
(type_arguments
(type_identifier))))
(type_item
(type_identifier)
(scoped_type_identifier
(generic_type (type_identifier) (type_arguments (type_identifier)))
(generic_type
(type_identifier)
(type_arguments
(type_identifier)))
(type_identifier))))
=====================
================================================================================
Array types
=====================
================================================================================
type A = [B; 4];
type C = &[D];
---
--------------------------------------------------------------------------------
(source_file
(type_item (type_identifier) (array_type (type_identifier) (integer_literal)))
(type_item (type_identifier) (reference_type (array_type (type_identifier)))))
(type_item
(type_identifier)
(array_type
(type_identifier)
(integer_literal)))
(type_item
(type_identifier)
(reference_type
(array_type
(type_identifier)))))
============================
================================================================================
Function types
============================
================================================================================
fn high_order1(value: i32, f: fn(i32)) -> i32 {}
@ -131,107 +195,190 @@ fn high_order3(value: i32, f: &FnOnce(i32) -> i32) -> i32 {
type F = for<'a, 'b> fn(x: &'a A, y: &'a mut B<'i, 't>,) -> C;
---
--------------------------------------------------------------------------------
(source_file
(function_item
(identifier)
(parameters
(parameter (identifier) (primitive_type))
(parameter (identifier) (function_type (parameters (primitive_type)))))
(parameter
(identifier)
(primitive_type))
(parameter
(identifier)
(function_type
(parameters
(primitive_type)))))
(primitive_type)
(block))
(function_item
(identifier)
(parameters
(parameter (identifier) (primitive_type))
(parameter (identifier) (function_type (parameters (primitive_type)) (primitive_type))))
(parameter
(identifier)
(primitive_type))
(parameter
(identifier)
(function_type
(parameters
(primitive_type))
(primitive_type))))
(primitive_type)
(block (call_expression (identifier) (arguments (identifier)))))
(block
(call_expression
(identifier)
(arguments
(identifier)))))
(function_item
(identifier)
(parameters
(parameter (identifier) (primitive_type))
(parameter (identifier) (reference_type (function_type (type_identifier) (parameters (primitive_type)) (primitive_type)))))
(primitive_type) (block (call_expression (identifier) (arguments (identifier)))))
(parameter
(identifier)
(primitive_type))
(parameter
(identifier)
(reference_type
(function_type
(type_identifier)
(parameters
(primitive_type))
(primitive_type)))))
(primitive_type)
(block
(call_expression
(identifier)
(arguments
(identifier)))))
(type_item
(type_identifier)
(function_type
(for_lifetimes (lifetime (identifier)) (lifetime (identifier)))
(parameters (parameter (identifier) (reference_type (lifetime (identifier)) (type_identifier))) (parameter (identifier) (reference_type (lifetime (identifier)) (mutable_specifier) (generic_type (type_identifier) (type_arguments (lifetime (identifier)) (lifetime (identifier)))))))
(for_lifetimes
(lifetime
(identifier))
(lifetime
(identifier)))
(parameters
(parameter
(identifier)
(reference_type
(lifetime
(identifier))
(type_identifier)))
(parameter
(identifier)
(reference_type
(lifetime
(identifier))
(mutable_specifier)
(generic_type
(type_identifier)
(type_arguments
(lifetime
(identifier))
(lifetime
(identifier)))))))
(type_identifier))))
=================================
================================================================================
Unsafe and extern function types
=================================
================================================================================
type a = extern "C" fn(*mut c_void);
type b = unsafe extern "C" fn() -> *mut c_void;
---
--------------------------------------------------------------------------------
(source_file
(type_item
(type_identifier)
(function_type
(function_modifiers (extern_modifier (string_literal)))
(parameters (pointer_type (mutable_specifier) (type_identifier)))))
(function_modifiers
(extern_modifier
(string_literal)))
(parameters
(pointer_type
(mutable_specifier)
(type_identifier)))))
(type_item
(type_identifier)
(function_type
(function_modifiers (extern_modifier (string_literal)))
(function_modifiers
(extern_modifier
(string_literal)))
(parameters)
(pointer_type (mutable_specifier) (type_identifier)))))
(pointer_type
(mutable_specifier)
(type_identifier)))))
===================================
================================================================================
Trait objects
===================================
================================================================================
type a = Box<Something + 'a>;
type b = Rc<dyn Something>;
type c = A<&dyn Fn(&B) -> C>;
---
--------------------------------------------------------------------------------
(source_file
(type_item
(type_identifier)
(generic_type
(type_identifier)
(type_arguments (bounded_type (type_identifier) (lifetime (identifier))))))
(type_arguments
(bounded_type
(type_identifier)
(lifetime
(identifier))))))
(type_item
(type_identifier)
(generic_type
(type_identifier)
(type_arguments (dynamic_type (type_identifier)))))
(type_arguments
(dynamic_type
(type_identifier)))))
(type_item
(type_identifier)
(generic_type
(type_identifier)
(type_arguments
(reference_type
(dynamic_type (function_type (type_identifier) (parameters (reference_type (type_identifier))) (type_identifier))))))))
====================================
(dynamic_type
(function_type
(type_identifier)
(parameters
(reference_type
(type_identifier)))
(type_identifier))))))))
================================================================================
Type cast expressions with generics
====================================
================================================================================
a as B<C>;
d as *mut E<<F as E>::G>;
---
--------------------------------------------------------------------------------
(source_file
(type_cast_expression
(identifier)
(generic_type (type_identifier) (type_arguments (type_identifier))))
(type_cast_expression
(identifier)
(pointer_type
(mutable_specifier)
(expression_statement
(type_cast_expression
(identifier)
(generic_type
(type_identifier)
(type_arguments
(scoped_type_identifier
(bracketed_type (qualified_type (type_identifier) (type_identifier)))
(type_identifier)))))))
(type_identifier)))))
(expression_statement
(type_cast_expression
(identifier)
(pointer_type
(mutable_specifier)
(generic_type
(type_identifier)
(type_arguments
(scoped_type_identifier
(bracketed_type
(qualified_type
(type_identifier)
(type_identifier)))
(type_identifier))))))))

@ -35,6 +35,54 @@ const numeric_types = [
const primitive_types = numeric_types.concat(['bool', 'str', 'char'])
const built_in_attributes = [
'cfg',
'cfg_attr',
'test',
'ignore',
'should_panic',
'derive',
'automatically_derived',
'macro_export',
'macro_use',
'proc_macro',
'proc_macro_derive',
'proc_macro_attribute',
'allow',
'warn',
'deny',
'forbid',
'deprecated',
'must_use',
'link',
'link_name',
'no_link',
'repr',
'crate_type',
'no_main',
'export_name',
'link_section',
'no_mangle',
'used',
'crate_name',
'inline',
'cold',
'no_builtins',
'target_feature',
'track_caller',
'doc',
'no_std',
'no_implicit_prelude',
'path',
'recursion_limit',
'type_length_limit',
'panic_handler',
'global_allocator',
'windows_subsystem',
'feature',
'non_exhaustive'
]
module.exports = grammar({
name: 'rust',
@ -84,13 +132,13 @@ module.exports = grammar({
source_file: $ => repeat($._statement),
_statement: $ => choice(
$._expression_statement,
$.expression_statement,
$._declaration_statement
),
empty_statement: $ => ';',
_expression_statement: $ => choice(
expression_statement: $ => choice(
seq($._expression, ';'),
prec(1, $._expression_ending_with_block)
),
@ -150,6 +198,7 @@ module.exports = grammar({
$.token_tree_pattern,
$.token_repetition_pattern,
$.token_binding_pattern,
$.metavariable,
$._non_special_token
),
@ -177,6 +226,7 @@ module.exports = grammar({
_tokens: $ => choice(
$.token_tree,
$.token_repetition,
$.metavariable,
$._non_special_token
),
@ -190,10 +240,19 @@ module.exports = grammar({
'$', '(', repeat($._tokens), ')', optional(/[^+*?]+/), choice('+', '*', '?')
),
non_special_punctuation: $ => /[/_\-=->,;:::!=?.@*&#%^+<>|~]+/,
non_special_punctuation: $ => choice(
// https://doc.rust-lang.org/reference/tokens.html#punctuation
"+", "-", "*", "/", "%", "^", "!", "&", "|", "&&", "||", "<<",
">>", "+=", "-=", "*=", "/=", "%=", "^=", "&=", "|=", "<<=",
">>=", "=", "==", "!=", ">", "<", ">=", "<=", "@", "_", ".",
"..", "...", "..=", ",", ";", ":", "::", "->", "=>", "#", "?",
),
// Matches non-delimiter tokens common to both macro invocations and
// definitions. This is everything except $ and metavariables (which begin
// with $).
_non_special_token: $ => choice(
$._literal, $.identifier, $.metavariable, $.mutable_specifier, $.self, $.super, $.crate,
$._literal, $.identifier, $.mutable_specifier, $.self, $.super, $.crate,
alias(choice(...primitive_types), $.primitive_type),
$.non_special_punctuation,
'\'',
@ -207,7 +266,7 @@ module.exports = grammar({
attribute_item: $ => seq(
'#',
'[',
$.meta_item,
$._attr,
']'
),
@ -215,14 +274,39 @@ module.exports = grammar({
'#',
'!',
'[',
$.meta_item,
$._attr,
']'
),
_attr: $ => choice(
alias($.built_in_attr, $.meta_item),
alias($.custom_attr, $.attr_item),
),
custom_attr: $ => seq(
$._path,
optional(choice(
seq('=', field('value', $._expression)),
field('arguments', alias($.delim_token_tree, $.token_tree))
))
),
built_in_attr: $ => seq(
$._built_in_attr_path,
optional(choice(
seq('=', field('value', $._expression)),
field('arguments', $.meta_arguments)
))
),
_built_in_attr_path: $ => choice(
...built_in_attributes.map(name => alias(name, $.identifier))
),
meta_item: $ => seq(
$._path,
optional(choice(
seq('=', field('value', $._literal)),
seq('=', field('value', $._expression)),
field('arguments', $.meta_arguments)
))
),
@ -466,7 +550,7 @@ module.exports = grammar({
)),
field('type', $._type),
optional($.where_clause),
field('body', $.declaration_list)
choice(field('body', $.declaration_list), ';')
),
trait_item: $ => seq(
@ -483,6 +567,7 @@ module.exports = grammar({
associated_type: $ => seq(
'type',
field('name', $._type_identifier),
field('type_parameters', optional($.type_parameters)),
field('bounds', optional($.trait_bounds)),
';'
),
@ -788,6 +873,7 @@ module.exports = grammar({
type_binding: $ => seq(
field('name', $._type_identifier),
field('type_arguments', optional($.type_arguments)),
'=',
field('type', $._type)
),
@ -831,7 +917,7 @@ module.exports = grammar({
// Section - Expressions
_expression: $ => choice(
_expression_except_range: $ => choice(
$.unary_expression,
$.reference_expression,
$.try_expression,
@ -839,9 +925,9 @@ module.exports = grammar({
$.assignment_expression,
$.compound_assignment_expr,
$.type_cast_expression,
$.range_expression,
$.call_expression,
$.return_expression,
$.yield_expression,
$._literal,
prec.left($.identifier),
alias(choice(...primitive_types), $.identifier),
@ -855,14 +941,19 @@ module.exports = grammar({
$.tuple_expression,
prec(1, $.macro_invocation),
$.unit_expression,
$._expression_ending_with_block,
$.break_expression,
$.continue_expression,
$.index_expression,
$.metavariable,
$.closure_expression,
$.parenthesized_expression,
$.struct_expression
$.struct_expression,
$._expression_ending_with_block,
),
_expression: $ => choice(
$._expression_except_range,
$.range_expression,
),
_expression_ending_with_block: $ => choice(
@ -886,7 +977,24 @@ module.exports = grammar({
$._reserved_identifier,
)),
'!',
$.token_tree
alias($.delim_token_tree, $.token_tree)
),
delim_token_tree: $ => choice(
seq('(', repeat($._delim_tokens), ')'),
seq('[', repeat($._delim_tokens), ']'),
seq('{', repeat($._delim_tokens), '}')
),
_delim_tokens: $ => choice(
$._non_delim_token,
alias($.delim_token_tree, $.token_tree),
),
// Should match any token other than a delimiter.
_non_delim_token: $ => choice(
$._non_special_token,
'$'
),
scoped_identifier: $ => seq(
@ -920,10 +1028,7 @@ module.exports = grammar({
),
range_expression: $ => prec.left(PREC.range, choice(
prec.left(
PREC.range + 1,
seq($._expression, choice('..', '...', '..='), $._expression)
),
seq($._expression, choice('..', '...', '..='), $._expression),
seq($._expression, '..'),
seq('..', $._expression),
'..'
@ -988,8 +1093,13 @@ module.exports = grammar({
prec(-1, 'return'),
),
yield_expression: $ => choice(
prec.left(seq('yield', $._expression)),
prec(-1, 'yield'),
),
call_expression: $ => prec(PREC.call, seq(
field('function', $._expression),
field('function', $._expression_except_range),
field('arguments', $.arguments)
)),

@ -1,6 +1,6 @@
{
"name": "tree-sitter-rust",
"version": "0.19.1",
"version": "0.20.1",
"description": "Rust grammar for tree-sitter",
"main": "bindings/node",
"keywords": [
@ -17,7 +17,7 @@
"nan": "^2.14.0"
},
"devDependencies": {
"tree-sitter-cli": "^0.19.1"
"tree-sitter-cli": "^0.20.0"
},
"scripts": {
"generate": "tree-sitter generate",

@ -0,0 +1,60 @@
; ADT definitions
(struct_item
name: (type_identifier) @name) @definition.class
(enum_item
name: (type_identifier) @name) @definition.class
(union_item
name: (type_identifier) @name) @definition.class
; type aliases
(type_item
name: (type_identifier) @name) @definition.class
; method definitions
(declaration_list
(function_item
name: (identifier) @name)) @definition.method
; function definitions
(function_item
name: (identifier) @name) @definition.function
; trait definitions
(trait_item
name: (type_identifier) @name) @definition.interface
; module definitions
(mod_item
name: (identifier) @name) @definition.module
; macro definitions
(macro_definition
name: (identifier) @name) @definition.macro
; references
(call_expression
function: (identifier) @name) @reference.call
(call_expression
function: (field_expression
field: (field_identifier) @name)) @reference.call
(macro_invocation
macro: (identifier) @name) @reference.call
; implementations
(impl_item
trait: (type_identifier) @name) @reference.implementation
(impl_item
type: (type_identifier) @name
!trait) @reference.implementation

File diff suppressed because it is too large Load Diff

@ -248,6 +248,10 @@
{
"type": "while_let_expression",
"named": true
},
{
"type": "yield_expression",
"named": true
}
]
},
@ -607,6 +611,16 @@
"named": true
}
]
},
"type_parameters": {
"multiple": false,
"required": false,
"types": [
{
"type": "type_parameters",
"named": true
}
]
}
}
},
@ -625,6 +639,62 @@
]
}
},
{
"type": "attr_item",
"named": true,
"fields": {
"arguments": {
"multiple": false,
"required": false,
"types": [
{
"type": "token_tree",
"named": true
}
]
},
"value": {
"multiple": false,
"required": false,
"types": [
{
"type": "_expression",
"named": true
}
]
}
},
"children": {
"multiple": false,
"required": true,
"types": [
{
"type": "crate",
"named": true
},
{
"type": "identifier",
"named": true
},
{
"type": "metavariable",
"named": true
},
{
"type": "scoped_identifier",
"named": true
},
{
"type": "self",
"named": true
},
{
"type": "super",
"named": true
}
]
}
},
{
"type": "attribute_item",
"named": true,
@ -633,6 +703,10 @@
"multiple": false,
"required": true,
"types": [
{
"type": "attr_item",
"named": true
},
{
"type": "meta_item",
"named": true
@ -789,6 +863,10 @@
{
"type": "_expression",
"named": true
},
{
"type": "expression_statement",
"named": true
}
]
}
@ -874,7 +952,159 @@
"required": true,
"types": [
{
"type": "_expression",
"type": "_literal",
"named": true
},
{
"type": "array_expression",
"named": true
},
{
"type": "assignment_expression",
"named": true
},
{
"type": "async_block",
"named": true
},
{
"type": "await_expression",
"named": true
},
{
"type": "binary_expression",
"named": true
},
{
"type": "block",
"named": true
},
{
"type": "break_expression",
"named": true
},
{
"type": "call_expression",
"named": true
},
{
"type": "closure_expression",
"named": true
},
{
"type": "compound_assignment_expr",
"named": true
},
{
"type": "const_block",
"named": true
},
{
"type": "continue_expression",
"named": true
},
{
"type": "field_expression",
"named": true
},
{
"type": "for_expression",
"named": true
},
{
"type": "generic_function",
"named": true
},
{
"type": "identifier",
"named": true
},
{
"type": "if_expression",
"named": true
},
{
"type": "if_let_expression",
"named": true
},
{
"type": "index_expression",
"named": true
},
{
"type": "loop_expression",
"named": true
},
{
"type": "macro_invocation",
"named": true
},
{
"type": "match_expression",
"named": true
},
{
"type": "metavariable",
"named": true
},
{
"type": "parenthesized_expression",
"named": true
},
{
"type": "reference_expression",
"named": true
},
{
"type": "return_expression",
"named": true
},
{
"type": "scoped_identifier",
"named": true
},
{
"type": "self",
"named": true
},
{
"type": "struct_expression",
"named": true
},
{
"type": "try_expression",
"named": true
},
{
"type": "tuple_expression",
"named": true
},
{
"type": "type_cast_expression",
"named": true
},
{
"type": "unary_expression",
"named": true
},
{
"type": "unit_expression",
"named": true
},
{
"type": "unsafe_block",
"named": true
},
{
"type": "while_expression",
"named": true
},
{
"type": "while_let_expression",
"named": true
},
{
"type": "yield_expression",
"named": true
}
]
@ -1351,6 +1581,21 @@
]
}
},
{
"type": "expression_statement",
"named": true,
"fields": {},
"children": {
"multiple": false,
"required": true,
"types": [
{
"type": "_expression",
"named": true
}
]
}
},
{
"type": "extern_crate_declaration",
"named": true,
@ -2113,7 +2358,7 @@
"fields": {
"body": {
"multiple": false,
"required": true,
"required": false,
"types": [
{
"type": "declaration_list",
@ -2194,6 +2439,10 @@
"multiple": false,
"required": true,
"types": [
{
"type": "attr_item",
"named": true
},
{
"type": "meta_item",
"named": true
@ -2530,7 +2779,7 @@
"required": false,
"types": [
{
"type": "_literal",
"type": "_expression",
"named": true
}
]
@ -2641,6 +2890,11 @@
]
}
},
{
"type": "non_special_punctuation",
"named": true,
"fields": {}
},
{
"type": "optional_type_parameter",
"named": true,
@ -3257,7 +3511,7 @@
"named": true
},
{
"type": "_expression",
"type": "expression_statement",
"named": true
}
]
@ -3939,6 +4193,16 @@
"named": true
}
]
},
"type_arguments": {
"multiple": false,
"required": false,
"types": [
{
"type": "type_arguments",
"named": true
}
]
}
}
},
@ -4528,6 +4792,21 @@
]
}
},
{
"type": "yield_expression",
"named": true,
"fields": {},
"children": {
"multiple": false,
"required": false,
"types": [
{
"type": "_expression",
"named": true
}
]
}
},
{
"type": "!",
"named": false
@ -4988,6 +5267,10 @@
"type": "while",
"named": false
},
{
"type": "yield",
"named": false
},
{
"type": "{",
"named": false

File diff suppressed because it is too large Load Diff

@ -123,6 +123,7 @@ struct TSLanguage {
unsigned (*serialize)(void *, char *);
void (*deserialize)(void *, const char *, unsigned);
} external_scanner;
const TSStateId *primary_state_ids;
};
/*