1328 lines
34 KiB
Plaintext
1328 lines
34 KiB
Plaintext
================================================================================
|
|
Identifiers
|
|
================================================================================
|
|
|
|
fn main() {
|
|
abc;
|
|
}
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(source_file
|
|
(function_item
|
|
(identifier)
|
|
(parameters)
|
|
(block
|
|
(expression_statement
|
|
(identifier)))))
|
|
|
|
================================================================================
|
|
Raw identifiers
|
|
================================================================================
|
|
|
|
fn main() {
|
|
(r#abc as r#Def).r#ghi;
|
|
}
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(source_file
|
|
(function_item
|
|
(identifier)
|
|
(parameters)
|
|
(block
|
|
(expression_statement
|
|
(field_expression
|
|
(parenthesized_expression
|
|
(type_cast_expression
|
|
(identifier)
|
|
(type_identifier)))
|
|
(field_identifier))))))
|
|
|
|
================================================================================
|
|
Unary operator expressions
|
|
================================================================================
|
|
|
|
-num;
|
|
!bits;
|
|
*boxed_thing;
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(source_file
|
|
(expression_statement
|
|
(unary_expression
|
|
(identifier)))
|
|
(expression_statement
|
|
(unary_expression
|
|
(identifier)))
|
|
(expression_statement
|
|
(unary_expression
|
|
(identifier))))
|
|
|
|
================================================================================
|
|
Reference expressions
|
|
================================================================================
|
|
|
|
&a;
|
|
&mut self.name;
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(source_file
|
|
(expression_statement
|
|
(reference_expression
|
|
(identifier)))
|
|
(expression_statement
|
|
(reference_expression
|
|
(mutable_specifier)
|
|
(field_expression
|
|
(self)
|
|
(field_identifier)))))
|
|
|
|
================================================================================
|
|
Try expressions
|
|
================================================================================
|
|
|
|
a.unwrap()?;
|
|
&a?;
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(source_file
|
|
(expression_statement
|
|
(try_expression
|
|
(call_expression
|
|
(field_expression
|
|
(identifier)
|
|
(field_identifier))
|
|
(arguments))))
|
|
(expression_statement
|
|
(reference_expression
|
|
(try_expression
|
|
(identifier)))))
|
|
|
|
================================================================================
|
|
Binary operator expressions
|
|
================================================================================
|
|
|
|
a * b;
|
|
a / b;
|
|
a % b;
|
|
a + b;
|
|
a - b;
|
|
a >> b;
|
|
a << b;
|
|
a == b;
|
|
a && b;
|
|
a || b;
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(source_file
|
|
(expression_statement
|
|
(binary_expression
|
|
(identifier)
|
|
(identifier)))
|
|
(expression_statement
|
|
(binary_expression
|
|
(identifier)
|
|
(identifier)))
|
|
(expression_statement
|
|
(binary_expression
|
|
(identifier)
|
|
(identifier)))
|
|
(expression_statement
|
|
(binary_expression
|
|
(identifier)
|
|
(identifier)))
|
|
(expression_statement
|
|
(binary_expression
|
|
(identifier)
|
|
(identifier)))
|
|
(expression_statement
|
|
(binary_expression
|
|
(identifier)
|
|
(identifier)))
|
|
(expression_statement
|
|
(binary_expression
|
|
(identifier)
|
|
(identifier)))
|
|
(expression_statement
|
|
(binary_expression
|
|
(identifier)
|
|
(identifier)))
|
|
(expression_statement
|
|
(binary_expression
|
|
(identifier)
|
|
(identifier)))
|
|
(expression_statement
|
|
(binary_expression
|
|
(identifier)
|
|
(identifier))))
|
|
|
|
================================================================================
|
|
Grouped expressions
|
|
================================================================================
|
|
|
|
(0);
|
|
(2 * (3 + 4));
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(source_file
|
|
(expression_statement
|
|
(parenthesized_expression
|
|
(integer_literal)))
|
|
(expression_statement
|
|
(parenthesized_expression
|
|
(binary_expression
|
|
(integer_literal)
|
|
(parenthesized_expression
|
|
(binary_expression
|
|
(integer_literal)
|
|
(integer_literal)))))))
|
|
|
|
================================================================================
|
|
Range expressions
|
|
================================================================================
|
|
|
|
1..2;
|
|
3..;
|
|
..4;
|
|
..;
|
|
1..b;
|
|
a..b;
|
|
1..(1);
|
|
(1)..1;
|
|
(1)..(1);
|
|
1..{1};
|
|
for i in 1.. {
|
|
}
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(source_file
|
|
(expression_statement
|
|
(range_expression
|
|
(integer_literal)
|
|
(integer_literal)))
|
|
(expression_statement
|
|
(range_expression
|
|
(integer_literal)))
|
|
(expression_statement
|
|
(range_expression
|
|
(integer_literal)))
|
|
(expression_statement
|
|
(range_expression))
|
|
(expression_statement
|
|
(range_expression
|
|
(integer_literal)
|
|
(identifier)))
|
|
(expression_statement
|
|
(range_expression
|
|
(identifier)
|
|
(identifier)))
|
|
(expression_statement
|
|
(range_expression
|
|
(integer_literal)
|
|
(parenthesized_expression
|
|
(integer_literal))))
|
|
(expression_statement
|
|
(range_expression
|
|
(parenthesized_expression
|
|
(integer_literal))
|
|
(integer_literal)))
|
|
(expression_statement
|
|
(range_expression
|
|
(parenthesized_expression
|
|
(integer_literal))
|
|
(parenthesized_expression
|
|
(integer_literal))))
|
|
(expression_statement
|
|
(range_expression
|
|
(integer_literal)
|
|
(block
|
|
(integer_literal))))
|
|
(expression_statement
|
|
(for_expression
|
|
(identifier)
|
|
(range_expression
|
|
(integer_literal))
|
|
(block))))
|
|
|
|
================================================================================
|
|
Assignment expressions
|
|
================================================================================
|
|
|
|
x = y;
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(source_file
|
|
(expression_statement
|
|
(assignment_expression
|
|
left: (identifier)
|
|
right: (identifier))))
|
|
|
|
================================================================================
|
|
Compound assignment expressions
|
|
================================================================================
|
|
|
|
x += 1;
|
|
x += y;
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(source_file
|
|
(expression_statement
|
|
(compound_assignment_expr
|
|
left: (identifier)
|
|
right: (integer_literal)))
|
|
(expression_statement
|
|
(compound_assignment_expr
|
|
left: (identifier)
|
|
right: (identifier))))
|
|
|
|
================================================================================
|
|
Type cast expressions
|
|
================================================================================
|
|
|
|
1000 as u8;
|
|
let character = integer as char;
|
|
let size: f64 = 1.0 + -len(values) as f64 + 1.0;
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(source_file
|
|
(expression_statement
|
|
(type_cast_expression
|
|
value: (integer_literal)
|
|
type: (primitive_type)))
|
|
(let_declaration
|
|
pattern: (identifier)
|
|
value: (type_cast_expression
|
|
value: (identifier)
|
|
type: (primitive_type)))
|
|
(let_declaration
|
|
pattern: (identifier)
|
|
type: (primitive_type)
|
|
value: (binary_expression
|
|
left: (binary_expression
|
|
left: (float_literal)
|
|
right: (type_cast_expression
|
|
value: (unary_expression
|
|
(call_expression
|
|
function: (identifier)
|
|
arguments: (arguments
|
|
(identifier))))
|
|
type: (primitive_type)))
|
|
right: (float_literal))))
|
|
|
|
================================================================================
|
|
Call expressions
|
|
================================================================================
|
|
|
|
foo();
|
|
add(1i32, 2i32);
|
|
add(
|
|
1i32,
|
|
2i32,
|
|
);
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(source_file
|
|
(expression_statement
|
|
(call_expression
|
|
function: (identifier)
|
|
arguments: (arguments)))
|
|
(expression_statement
|
|
(call_expression
|
|
function: (identifier)
|
|
arguments: (arguments
|
|
(integer_literal)
|
|
(integer_literal))))
|
|
(expression_statement
|
|
(call_expression
|
|
function: (identifier)
|
|
arguments: (arguments
|
|
(integer_literal)
|
|
(integer_literal)))))
|
|
|
|
================================================================================
|
|
Array expressions
|
|
================================================================================
|
|
|
|
[];
|
|
[1, 2, 3];
|
|
["a", "b", "c"];
|
|
[0; 128];
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(source_file
|
|
(expression_statement
|
|
(array_expression))
|
|
(expression_statement
|
|
(array_expression
|
|
(integer_literal)
|
|
(integer_literal)
|
|
(integer_literal)))
|
|
(expression_statement
|
|
(array_expression
|
|
(string_literal)
|
|
(string_literal)
|
|
(string_literal)))
|
|
(expression_statement
|
|
(array_expression
|
|
(integer_literal)
|
|
length: (integer_literal))))
|
|
|
|
================================================================================
|
|
Tuple expressions
|
|
================================================================================
|
|
|
|
();
|
|
(0,);
|
|
let (x, y, z) = (1, 2, 3);
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(source_file
|
|
(expression_statement
|
|
(unit_expression))
|
|
(expression_statement
|
|
(tuple_expression
|
|
(integer_literal)))
|
|
(let_declaration
|
|
(tuple_pattern
|
|
(identifier)
|
|
(identifier)
|
|
(identifier))
|
|
(tuple_expression
|
|
(integer_literal)
|
|
(integer_literal)
|
|
(integer_literal))))
|
|
|
|
================================================================================
|
|
Struct expressions
|
|
================================================================================
|
|
|
|
NothingInMe {};
|
|
Point {x: 10.0, y: 20.0};
|
|
let a = SomeStruct { field1, field2: expression, field3, };
|
|
let u = game::User {name: "Joe", age: 35, score: 100_000};
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(source_file
|
|
(expression_statement
|
|
(struct_expression
|
|
(type_identifier)
|
|
(field_initializer_list)))
|
|
(expression_statement
|
|
(struct_expression
|
|
(type_identifier)
|
|
(field_initializer_list
|
|
(field_initializer
|
|
(field_identifier)
|
|
(float_literal))
|
|
(field_initializer
|
|
(field_identifier)
|
|
(float_literal)))))
|
|
(let_declaration
|
|
(identifier)
|
|
(struct_expression
|
|
(type_identifier)
|
|
(field_initializer_list
|
|
(shorthand_field_initializer
|
|
(identifier))
|
|
(field_initializer
|
|
(field_identifier)
|
|
(identifier))
|
|
(shorthand_field_initializer
|
|
(identifier)))))
|
|
(let_declaration
|
|
(identifier)
|
|
(struct_expression
|
|
(scoped_type_identifier
|
|
(identifier)
|
|
(type_identifier))
|
|
(field_initializer_list
|
|
(field_initializer
|
|
(field_identifier)
|
|
(string_literal))
|
|
(field_initializer
|
|
(field_identifier)
|
|
(integer_literal))
|
|
(field_initializer
|
|
(field_identifier)
|
|
(integer_literal))))))
|
|
|
|
================================================================================
|
|
Struct expressions with update initializers
|
|
================================================================================
|
|
|
|
let u = User{name, ..current_user()};
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(source_file
|
|
(let_declaration
|
|
(identifier)
|
|
(struct_expression
|
|
(type_identifier)
|
|
(field_initializer_list
|
|
(shorthand_field_initializer
|
|
(identifier))
|
|
(base_field_initializer
|
|
(call_expression
|
|
(identifier)
|
|
(arguments)))))))
|
|
|
|
================================================================================
|
|
If expressions
|
|
================================================================================
|
|
|
|
fn main() {
|
|
if n == 1 {
|
|
} else if n == 2 {
|
|
} else {
|
|
}
|
|
}
|
|
|
|
let y = if x == 5 { 10 } else { 15 };
|
|
|
|
if foo && bar {}
|
|
|
|
if foo && bar || baz {}
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(source_file
|
|
(function_item
|
|
name: (identifier)
|
|
parameters: (parameters)
|
|
body: (block
|
|
(expression_statement
|
|
(if_expression
|
|
condition: (binary_expression
|
|
left: (identifier)
|
|
right: (integer_literal))
|
|
consequence: (block)
|
|
alternative: (else_clause
|
|
(if_expression
|
|
condition: (binary_expression
|
|
left: (identifier)
|
|
right: (integer_literal))
|
|
consequence: (block)
|
|
alternative: (else_clause
|
|
(block))))))))
|
|
(let_declaration
|
|
pattern: (identifier)
|
|
value: (if_expression
|
|
condition: (binary_expression
|
|
left: (identifier)
|
|
right: (integer_literal))
|
|
consequence: (block
|
|
(integer_literal))
|
|
alternative: (else_clause
|
|
(block
|
|
(integer_literal)))))
|
|
(expression_statement
|
|
(if_expression
|
|
condition: (binary_expression
|
|
left: (identifier)
|
|
right: (identifier))
|
|
consequence: (block)))
|
|
(expression_statement
|
|
(if_expression
|
|
condition: (binary_expression
|
|
left: (binary_expression
|
|
left: (identifier)
|
|
right: (identifier))
|
|
right: (identifier))
|
|
consequence: (block))))
|
|
|
|
================================================================================
|
|
Basic if let expressions
|
|
================================================================================
|
|
|
|
if let Some(a) = b
|
|
&& c
|
|
&& d
|
|
&& let Some(e) = f
|
|
{
|
|
}
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(source_file
|
|
(expression_statement
|
|
(if_expression
|
|
condition: (let_chain
|
|
(let_condition
|
|
pattern: (tuple_struct_pattern
|
|
type: (identifier)
|
|
(identifier))
|
|
value: (identifier))
|
|
(identifier)
|
|
(identifier)
|
|
(let_condition
|
|
pattern: (tuple_struct_pattern
|
|
type: (identifier)
|
|
(identifier))
|
|
value: (identifier)))
|
|
consequence: (block))))
|
|
|
|
================================================================================
|
|
If let expressions
|
|
================================================================================
|
|
|
|
if let ("Bacon", b) = dish {
|
|
}
|
|
|
|
if let Some("chained") = a && b && let (C, D) = e {
|
|
}
|
|
|
|
if foo && let bar = || baz && quux {}
|
|
|
|
if a && let b = || c || d && e {}
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(source_file
|
|
(expression_statement
|
|
(if_expression
|
|
condition: (let_condition
|
|
pattern: (tuple_pattern
|
|
(string_literal)
|
|
(identifier))
|
|
value: (identifier))
|
|
consequence: (block)))
|
|
(expression_statement
|
|
(if_expression
|
|
condition: (let_chain
|
|
(let_condition
|
|
pattern: (tuple_struct_pattern
|
|
type: (identifier)
|
|
(string_literal))
|
|
value: (identifier))
|
|
(identifier)
|
|
(let_condition
|
|
pattern: (tuple_pattern
|
|
(identifier)
|
|
(identifier))
|
|
value: (identifier)))
|
|
consequence: (block)))
|
|
(expression_statement
|
|
(if_expression
|
|
condition: (let_chain
|
|
(identifier)
|
|
(let_condition
|
|
pattern: (identifier)
|
|
value: (closure_expression
|
|
parameters: (closure_parameters)
|
|
body: (binary_expression
|
|
left: (identifier)
|
|
right: (identifier)))))
|
|
consequence: (block)))
|
|
(expression_statement
|
|
(if_expression
|
|
condition: (let_chain
|
|
(identifier)
|
|
(let_condition
|
|
pattern: (identifier)
|
|
value: (closure_expression
|
|
parameters: (closure_parameters)
|
|
body: (binary_expression
|
|
left: (identifier)
|
|
right: (binary_expression
|
|
left: (identifier)
|
|
right: (identifier))))))
|
|
consequence: (block))))
|
|
|
|
================================================================================
|
|
While let expressions
|
|
================================================================================
|
|
|
|
while let ("Bacon", b) = dish {
|
|
}
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(source_file
|
|
(expression_statement
|
|
(while_expression
|
|
(let_condition
|
|
(tuple_pattern
|
|
(string_literal)
|
|
(identifier))
|
|
(identifier))
|
|
(block))))
|
|
|
|
================================================================================
|
|
Match expressions
|
|
================================================================================
|
|
|
|
match x {
|
|
1 => { "one" }
|
|
2 => "two",
|
|
-1 => 1,
|
|
-3.14 => 3,
|
|
|
|
#[attr1]
|
|
3 => "three",
|
|
macro!(4) => "four",
|
|
_ => "something else",
|
|
}
|
|
|
|
let msg = match x {
|
|
0 | 1 | 10 => "one of zero, one, or ten",
|
|
y if y < 20 => "less than 20, but not zero, one, or ten",
|
|
y if y == 200 =>
|
|
if a {
|
|
"200 (but this is not very stylish)"
|
|
}
|
|
y if let Some(z) = foo && z && let Some(w) = bar => "very chained",
|
|
_ => "something else",
|
|
};
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(source_file
|
|
(expression_statement
|
|
(match_expression
|
|
value: (identifier)
|
|
body: (match_block
|
|
(match_arm
|
|
pattern: (match_pattern
|
|
(integer_literal))
|
|
value: (block
|
|
(string_literal)))
|
|
(match_arm
|
|
pattern: (match_pattern
|
|
(integer_literal))
|
|
value: (string_literal))
|
|
(match_arm
|
|
pattern: (match_pattern
|
|
(negative_literal
|
|
(integer_literal)))
|
|
value: (integer_literal))
|
|
(match_arm
|
|
pattern: (match_pattern
|
|
(negative_literal
|
|
(float_literal)))
|
|
value: (integer_literal))
|
|
(match_arm
|
|
(attribute_item
|
|
(attribute
|
|
(identifier)))
|
|
pattern: (match_pattern
|
|
(integer_literal))
|
|
value: (string_literal))
|
|
(match_arm
|
|
pattern: (match_pattern
|
|
(macro_invocation
|
|
macro: (identifier)
|
|
(token_tree
|
|
(integer_literal))))
|
|
value: (string_literal))
|
|
(match_arm
|
|
pattern: (match_pattern)
|
|
value: (string_literal)))))
|
|
(let_declaration
|
|
pattern: (identifier)
|
|
value: (match_expression
|
|
value: (identifier)
|
|
body: (match_block
|
|
(match_arm
|
|
pattern: (match_pattern
|
|
(or_pattern
|
|
(or_pattern
|
|
(integer_literal)
|
|
(integer_literal))
|
|
(integer_literal)))
|
|
value: (string_literal))
|
|
(match_arm
|
|
pattern: (match_pattern
|
|
(identifier)
|
|
condition: (binary_expression
|
|
left: (identifier)
|
|
right: (integer_literal)))
|
|
value: (string_literal))
|
|
(match_arm
|
|
pattern: (match_pattern
|
|
(identifier)
|
|
condition: (binary_expression
|
|
left: (identifier)
|
|
right: (integer_literal)))
|
|
value: (if_expression
|
|
condition: (identifier)
|
|
consequence: (block
|
|
(string_literal))))
|
|
(match_arm
|
|
pattern: (match_pattern
|
|
(identifier)
|
|
condition: (let_chain
|
|
(let_condition
|
|
pattern: (tuple_struct_pattern
|
|
type: (identifier)
|
|
(identifier))
|
|
value: (identifier))
|
|
(identifier)
|
|
(let_condition
|
|
pattern: (tuple_struct_pattern
|
|
type: (identifier)
|
|
(identifier))
|
|
value: (identifier))))
|
|
value: (string_literal))
|
|
(match_arm
|
|
pattern: (match_pattern)
|
|
value: (string_literal))))))
|
|
|
|
================================================================================
|
|
While expressions
|
|
================================================================================
|
|
|
|
while !done {
|
|
done = true;
|
|
}
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(source_file
|
|
(expression_statement
|
|
(while_expression
|
|
condition: (unary_expression
|
|
(identifier))
|
|
body: (block
|
|
(expression_statement
|
|
(assignment_expression
|
|
left: (identifier)
|
|
right: (boolean_literal)))))))
|
|
|
|
================================================================================
|
|
Loop expressions
|
|
================================================================================
|
|
|
|
'outer: loop {
|
|
'inner: loop {
|
|
break 'outer;
|
|
break true;
|
|
}
|
|
}
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(source_file
|
|
(expression_statement
|
|
(loop_expression
|
|
(loop_label
|
|
(identifier))
|
|
(block
|
|
(expression_statement
|
|
(loop_expression
|
|
(loop_label
|
|
(identifier))
|
|
(block
|
|
(expression_statement
|
|
(break_expression
|
|
(loop_label
|
|
(identifier))))
|
|
(expression_statement
|
|
(break_expression
|
|
(boolean_literal))))))))))
|
|
|
|
================================================================================
|
|
For expressions
|
|
================================================================================
|
|
|
|
for e in v {
|
|
bar(e);
|
|
}
|
|
|
|
for i in 0..256 {
|
|
bar(i);
|
|
}
|
|
|
|
'outer: for x in 0..10 {
|
|
'inner: for y in 0..10 {
|
|
if x % 2 == 0 { continue 'outer; }
|
|
if y % 2 == 0 { continue 'inner; }
|
|
}
|
|
}
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(source_file
|
|
(expression_statement
|
|
(for_expression
|
|
(identifier)
|
|
(identifier)
|
|
(block
|
|
(expression_statement
|
|
(call_expression
|
|
(identifier)
|
|
(arguments
|
|
(identifier)))))))
|
|
(expression_statement
|
|
(for_expression
|
|
(identifier)
|
|
(range_expression
|
|
(integer_literal)
|
|
(integer_literal))
|
|
(block
|
|
(expression_statement
|
|
(call_expression
|
|
(identifier)
|
|
(arguments
|
|
(identifier)))))))
|
|
(expression_statement
|
|
(for_expression
|
|
(loop_label
|
|
(identifier))
|
|
(identifier)
|
|
(range_expression
|
|
(integer_literal)
|
|
(integer_literal))
|
|
(block
|
|
(expression_statement
|
|
(for_expression
|
|
(loop_label
|
|
(identifier))
|
|
(identifier)
|
|
(range_expression
|
|
(integer_literal)
|
|
(integer_literal))
|
|
(block
|
|
(expression_statement
|
|
(if_expression
|
|
(binary_expression
|
|
(binary_expression
|
|
(identifier)
|
|
(integer_literal))
|
|
(integer_literal))
|
|
(block
|
|
(expression_statement
|
|
(continue_expression
|
|
(loop_label
|
|
(identifier)))))))
|
|
(expression_statement
|
|
(if_expression
|
|
(binary_expression
|
|
(binary_expression
|
|
(identifier)
|
|
(integer_literal))
|
|
(integer_literal))
|
|
(block
|
|
(expression_statement
|
|
(continue_expression
|
|
(loop_label
|
|
(identifier))))))))))))))
|
|
|
|
================================================================================
|
|
Field expressions
|
|
================================================================================
|
|
|
|
mystruct.myfield;
|
|
foo().x;
|
|
value.0.1.iter();
|
|
1.max(2);
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(source_file
|
|
(expression_statement
|
|
(field_expression
|
|
(identifier)
|
|
(field_identifier)))
|
|
(expression_statement
|
|
(field_expression
|
|
(call_expression
|
|
(identifier)
|
|
(arguments))
|
|
(field_identifier)))
|
|
(expression_statement
|
|
(call_expression
|
|
(field_expression
|
|
(field_expression
|
|
(field_expression
|
|
(identifier)
|
|
(integer_literal))
|
|
(integer_literal))
|
|
(field_identifier))
|
|
(arguments)))
|
|
(expression_statement
|
|
(call_expression
|
|
(field_expression
|
|
(integer_literal)
|
|
(field_identifier))
|
|
(arguments
|
|
(integer_literal)))))
|
|
|
|
================================================================================
|
|
Method call expressions
|
|
================================================================================
|
|
|
|
mystruct.foo();
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(source_file
|
|
(expression_statement
|
|
(call_expression
|
|
(field_expression
|
|
(identifier)
|
|
(field_identifier))
|
|
(arguments))))
|
|
|
|
================================================================================
|
|
Index expressions
|
|
================================================================================
|
|
|
|
([1, 2, 3, 4])[0];
|
|
arr[10];
|
|
arr[n];
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(source_file
|
|
(expression_statement
|
|
(index_expression
|
|
(parenthesized_expression
|
|
(array_expression
|
|
(integer_literal)
|
|
(integer_literal)
|
|
(integer_literal)
|
|
(integer_literal)))
|
|
(integer_literal)))
|
|
(expression_statement
|
|
(index_expression
|
|
(identifier)
|
|
(integer_literal)))
|
|
(expression_statement
|
|
(index_expression
|
|
(identifier)
|
|
(identifier))))
|
|
|
|
================================================================================
|
|
Scoped functions
|
|
================================================================================
|
|
|
|
a::b();
|
|
C::<D>::e();
|
|
::f();
|
|
::g::h();
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(source_file
|
|
(expression_statement
|
|
(call_expression
|
|
(scoped_identifier
|
|
(identifier)
|
|
(identifier))
|
|
(arguments)))
|
|
(expression_statement
|
|
(call_expression
|
|
(scoped_identifier
|
|
(generic_type
|
|
(type_identifier)
|
|
(type_arguments
|
|
(type_identifier)))
|
|
(identifier))
|
|
(arguments)))
|
|
(expression_statement
|
|
(call_expression
|
|
(scoped_identifier
|
|
(identifier))
|
|
(arguments)))
|
|
(expression_statement
|
|
(call_expression
|
|
(scoped_identifier
|
|
(scoped_identifier
|
|
(identifier))
|
|
(identifier))
|
|
(arguments))))
|
|
|
|
================================================================================
|
|
Scoped functions with fully qualified syntax
|
|
================================================================================
|
|
|
|
<Dog as Animal>::eat(d);
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(source_file
|
|
(expression_statement
|
|
(call_expression
|
|
(scoped_identifier
|
|
(bracketed_type
|
|
(qualified_type
|
|
(type_identifier)
|
|
(type_identifier)))
|
|
(identifier))
|
|
(arguments
|
|
(identifier)))))
|
|
|
|
================================================================================
|
|
Scoped functions with macros as types
|
|
================================================================================
|
|
|
|
<Token![]>::foo();
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(source_file
|
|
(expression_statement
|
|
(call_expression
|
|
(scoped_identifier
|
|
(bracketed_type
|
|
(macro_invocation
|
|
(identifier)
|
|
(token_tree)))
|
|
(identifier))
|
|
(arguments))))
|
|
|
|
================================================================================
|
|
Scoped identifier with nested super
|
|
================================================================================
|
|
|
|
super::super::foo();
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(source_file
|
|
(expression_statement
|
|
(call_expression
|
|
(scoped_identifier
|
|
(scoped_identifier
|
|
(super)
|
|
(super))
|
|
(identifier))
|
|
(arguments))))
|
|
|
|
================================================================================
|
|
Generic functions
|
|
================================================================================
|
|
|
|
std::sizeof::<u32>();
|
|
foo::<8>();
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(source_file
|
|
(expression_statement
|
|
(call_expression
|
|
function: (generic_function
|
|
function: (scoped_identifier
|
|
path: (identifier)
|
|
name: (identifier))
|
|
type_arguments: (type_arguments
|
|
(primitive_type)))
|
|
arguments: (arguments)))
|
|
(expression_statement
|
|
(call_expression
|
|
function: (generic_function
|
|
function: (identifier)
|
|
type_arguments: (type_arguments
|
|
(integer_literal)))
|
|
arguments: (arguments))))
|
|
|
|
================================================================================
|
|
Closures
|
|
================================================================================
|
|
|
|
a.map(|(b, c)| b.push(c));
|
|
d.map(move |mut e| {
|
|
f(e);
|
|
g(e)
|
|
});
|
|
h(|| -> i { j });
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(source_file
|
|
(expression_statement
|
|
(call_expression
|
|
(field_expression
|
|
(identifier)
|
|
(field_identifier))
|
|
(arguments
|
|
(closure_expression
|
|
(closure_parameters
|
|
(tuple_pattern
|
|
(identifier)
|
|
(identifier)))
|
|
(call_expression
|
|
(field_expression
|
|
(identifier)
|
|
(field_identifier))
|
|
(arguments
|
|
(identifier)))))))
|
|
(expression_statement
|
|
(call_expression
|
|
(field_expression
|
|
(identifier)
|
|
(field_identifier))
|
|
(arguments
|
|
(closure_expression
|
|
(closure_parameters
|
|
(mut_pattern
|
|
(mutable_specifier)
|
|
(identifier)))
|
|
(block
|
|
(expression_statement
|
|
(call_expression
|
|
(identifier)
|
|
(arguments
|
|
(identifier))))
|
|
(call_expression
|
|
(identifier)
|
|
(arguments
|
|
(identifier))))))))
|
|
(expression_statement
|
|
(call_expression
|
|
(identifier)
|
|
(arguments
|
|
(closure_expression
|
|
(closure_parameters)
|
|
(type_identifier)
|
|
(block
|
|
(identifier)))))))
|
|
|
|
================================================================================
|
|
Closures with typed parameteres
|
|
================================================================================
|
|
|
|
a.map(|b: usize| b.push(c));
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(source_file
|
|
(expression_statement
|
|
(call_expression
|
|
(field_expression
|
|
(identifier)
|
|
(field_identifier))
|
|
(arguments
|
|
(closure_expression
|
|
(closure_parameters
|
|
(parameter
|
|
(identifier)
|
|
(primitive_type)))
|
|
(call_expression
|
|
(field_expression
|
|
(identifier)
|
|
(field_identifier))
|
|
(arguments
|
|
(identifier))))))))
|
|
|
|
================================================================================
|
|
Generators
|
|
================================================================================
|
|
|
|
move || {
|
|
while i <= n {
|
|
yield i;
|
|
i += 1;
|
|
}
|
|
return;
|
|
};
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(source_file
|
|
(expression_statement
|
|
(closure_expression
|
|
(closure_parameters)
|
|
(block
|
|
(expression_statement
|
|
(while_expression
|
|
(binary_expression
|
|
(identifier)
|
|
(identifier))
|
|
(block
|
|
(expression_statement
|
|
(yield_expression
|
|
(identifier)))
|
|
(expression_statement
|
|
(compound_assignment_expr
|
|
(identifier)
|
|
(integer_literal))))))
|
|
(expression_statement
|
|
(return_expression))))))
|
|
|
|
================================================================================
|
|
Unsafe blocks
|
|
================================================================================
|
|
|
|
const a : A = unsafe { foo() };
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(source_file
|
|
(const_item
|
|
(identifier)
|
|
(type_identifier)
|
|
(unsafe_block
|
|
(block
|
|
(call_expression
|
|
(identifier)
|
|
(arguments))))))
|
|
|
|
================================================================================
|
|
Inline const or Const blocks as expression
|
|
================================================================================
|
|
|
|
const { 1 + 3 };
|
|
if *x < 0 { const { &4i32.pow(4) } } else { x }
|
|
let three_ranges = [const { (0..=5).into_inner() }; 3];
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
(source_file
|
|
(expression_statement
|
|
(const_block
|
|
body: (block
|
|
(binary_expression
|
|
left: (integer_literal)
|
|
right: (integer_literal)))))
|
|
(empty_statement)
|
|
(expression_statement
|
|
(if_expression
|
|
condition: (binary_expression
|
|
left: (unary_expression
|
|
(identifier))
|
|
right: (integer_literal))
|
|
consequence: (block
|
|
(expression_statement
|
|
(const_block
|
|
body: (block
|
|
(reference_expression
|
|
value: (call_expression
|
|
function: (field_expression
|
|
value: (integer_literal)
|
|
field: (field_identifier))
|
|
arguments: (arguments
|
|
(integer_literal))))))))
|
|
alternative: (else_clause
|
|
(block
|
|
(identifier)))))
|
|
(let_declaration
|
|
pattern: (identifier)
|
|
value: (array_expression
|
|
(const_block
|
|
body: (block
|
|
(call_expression
|
|
function: (field_expression
|
|
value: (parenthesized_expression
|
|
(range_expression
|
|
(integer_literal)
|
|
(integer_literal)))
|
|
field: (field_identifier))
|
|
arguments: (arguments))))
|
|
length: (integer_literal))))
|