tree-sitters/rust/test/corpus/patterns.txt

470 lines
12 KiB
Plaintext

================================================================================
Tuple struct patterns
================================================================================
match x {
Some(x) => "some",
std::None() => "none"
}
--------------------------------------------------------------------------------
(source_file
(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,
ref mut y => y,
& mut z => z,
}
--------------------------------------------------------------------------------
(source_file
(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
(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,
B(..) => c,
D::E{f: g, ..} => g
}
--------------------------------------------------------------------------------
(source_file
(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,
a @ 1 ... 5 => a,
Some(1 ... 5) => a,
a @ b...c => a,
a @ b..=c => a,
}
--------------------------------------------------------------------------------
(source_file
(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)
(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
(identifier)
(identifier))))
value: (identifier))))))
================================================================================
Or patterns
================================================================================
if let A(x) | B(x) = expr {
do_stuff_with(x);
}
while let A(x) | B(x) = expr {
do_stuff_with(x);
}
let Ok(index) | Err(index) = slice.binary_search(&x);
for ref a | b in c {}
let Ok(x) | Err(x) = binary_search(x);
for A | B | C in c {}
|(Ok(x) | Err(x))| expr();
let ref mut x @ (A | B | C);
fn foo((1 | 2 | 3): u8) {}
if let x!() | y!() = () {}
// Discomment after box pattern land on master
// let box (A | B | C);
// Not handled cause devs didn't got into agreement if should be acceptd or not
// |Ok(x) | Err(x)| expr();
--------------------------------------------------------------------------------
(source_file
(expression_statement
(if_expression
condition: (let_condition
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_expression
condition: (let_condition
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
type: (identifier)
(identifier))
(tuple_struct_pattern
type: (identifier)
(identifier)))
value: (call_expression
function: (field_expression
value: (identifier)
field: (field_identifier))
arguments: (arguments
(reference_expression
value: (identifier)))))
(expression_statement
(for_expression
pattern: (or_pattern
(ref_pattern
(identifier))
(identifier))
value: (identifier)
body: (block)))
(let_declaration
pattern: (or_pattern
(tuple_struct_pattern
type: (identifier)
(identifier))
(tuple_struct_pattern
type: (identifier)
(identifier)))
value: (call_expression
function: (identifier)
arguments: (arguments
(identifier))))
(expression_statement
(for_expression
pattern: (or_pattern
(or_pattern
(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
(mutable_specifier)
(captured_pattern
(identifier)
(tuple_pattern
(or_pattern
(or_pattern
(identifier)
(identifier))
(identifier)))))))
(function_item
name: (identifier)
parameters: (parameters
(parameter
pattern: (tuple_pattern
(or_pattern
(or_pattern
(integer_literal)
(integer_literal))
(integer_literal)))
type: (primitive_type)))
body: (block))
(expression_statement
(if_expression
condition: (let_condition
pattern: (or_pattern
(macro_invocation
macro: (identifier)
(token_tree))
(macro_invocation
macro: (identifier)
(token_tree)))
value: (unit_expression))
consequence: (block)))
(line_comment)
(line_comment)
(line_comment)
(line_comment))
================================================================================
Inline const or Const blocks as pattern
================================================================================
fn foo(x: i32) {
const CUBE: i32 = 3.pow(3);
match x {
CUBE => println!("three cubed"),
_ => {}
}
}
fn foo(x: i32) {
match x {
const { 3.pow(3) } => println!("three cubed"),
_ => {}
}
}
--------------------------------------------------------------------------------
(source_file
(function_item
name: (identifier)
parameters: (parameters
(parameter
pattern: (identifier)
type: (primitive_type)))
body: (block
(const_item
name: (identifier)
type: (primitive_type)
value: (call_expression
function: (field_expression
value: (integer_literal)
field: (field_identifier))
arguments: (arguments
(integer_literal))))
(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
(parameter
pattern: (identifier)
type: (primitive_type)))
body: (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))))))))