mirror of https://github.com/Wilfred/difftastic/
1405 lines
34 KiB
Plaintext
1405 lines
34 KiB
Plaintext
============================================
|
|
Modules
|
|
============================================
|
|
|
|
mod english;
|
|
|
|
mod english {}
|
|
|
|
mod english {
|
|
mod greetings {}
|
|
mod farewells {}
|
|
}
|
|
|
|
pub mod english;
|
|
|
|
---
|
|
|
|
(source_file
|
|
(mod_item (identifier))
|
|
(mod_item (identifier) (declaration_list))
|
|
(mod_item (identifier) (declaration_list
|
|
(mod_item (identifier) (declaration_list))
|
|
(mod_item (identifier) (declaration_list))))
|
|
(mod_item (visibility_modifier) (identifier)))
|
|
|
|
============================================
|
|
Extern crate declarations
|
|
============================================
|
|
|
|
extern crate std;
|
|
extern crate std as ruststd;
|
|
pub extern crate futures;
|
|
|
|
---
|
|
|
|
(source_file
|
|
(extern_crate_declaration (crate) (identifier))
|
|
(extern_crate_declaration (crate) (identifier) (identifier))
|
|
(extern_crate_declaration (visibility_modifier) (crate) (identifier)))
|
|
|
|
============================================
|
|
Function declarations
|
|
============================================
|
|
|
|
fn main() {}
|
|
|
|
fn add(x: i32, y: i32) -> i32 {
|
|
return x + y;
|
|
}
|
|
|
|
fn takes_slice(slice: &str) {
|
|
println!("Got: {}", slice);
|
|
}
|
|
|
|
fn foo() -> [u32; 2] {
|
|
return [1, 2];
|
|
}
|
|
|
|
fn foo() -> (u32, u16) {
|
|
return (1, 2);
|
|
}
|
|
|
|
fn foo() {
|
|
return
|
|
}
|
|
|
|
fn foo(x: impl FnOnce() -> result::Result<T, E>) {}
|
|
|
|
fn foo(#[attr] x: i32, #[attr] x: i64) {}
|
|
|
|
fn accumulate(self) -> Machine<{State::Accumulate}> {}
|
|
|
|
---
|
|
|
|
(source_file
|
|
(function_item
|
|
name: (identifier)
|
|
parameters: (parameters)
|
|
body: (block))
|
|
(function_item
|
|
name: (identifier)
|
|
parameters: (parameters
|
|
(parameter
|
|
pattern: (identifier)
|
|
type: (primitive_type))
|
|
(parameter
|
|
pattern: (identifier)
|
|
type: (primitive_type)))
|
|
return_type: (primitive_type)
|
|
body: (block
|
|
(return_expression
|
|
(binary_expression
|
|
left: (identifier)
|
|
right: (identifier)))))
|
|
(function_item
|
|
name: (identifier)
|
|
parameters: (parameters
|
|
(parameter
|
|
pattern: (identifier)
|
|
type: (reference_type
|
|
type: (primitive_type))))
|
|
body: (block
|
|
(macro_invocation
|
|
macro: (identifier)
|
|
(token_tree
|
|
(string_literal)
|
|
(identifier)))))
|
|
(function_item
|
|
name: (identifier)
|
|
parameters: (parameters)
|
|
return_type: (array_type
|
|
element: (primitive_type)
|
|
length: (integer_literal))
|
|
body: (block
|
|
(return_expression
|
|
(array_expression
|
|
(integer_literal)
|
|
(integer_literal)))))
|
|
(function_item
|
|
name: (identifier)
|
|
parameters: (parameters)
|
|
return_type: (tuple_type
|
|
(primitive_type)
|
|
(primitive_type))
|
|
body: (block
|
|
(return_expression
|
|
(tuple_expression
|
|
(integer_literal)
|
|
(integer_literal)))))
|
|
(function_item
|
|
name: (identifier)
|
|
parameters: (parameters)
|
|
body: (block
|
|
(return_expression)))
|
|
(function_item
|
|
name: (identifier)
|
|
parameters: (parameters
|
|
(parameter
|
|
pattern: (identifier)
|
|
type: (abstract_type
|
|
trait: (function_type
|
|
trait: (type_identifier)
|
|
parameters: (parameters)
|
|
return_type: (generic_type
|
|
type: (scoped_type_identifier
|
|
path: (identifier)
|
|
name: (type_identifier))
|
|
type_arguments: (type_arguments
|
|
(type_identifier)
|
|
(type_identifier)))))))
|
|
body: (block))
|
|
(function_item
|
|
name: (identifier)
|
|
parameters: (parameters
|
|
(attribute_item
|
|
(meta_item
|
|
(identifier)))
|
|
(parameter
|
|
pattern: (identifier)
|
|
type: (primitive_type))
|
|
(attribute_item
|
|
(meta_item
|
|
(identifier)))
|
|
(parameter
|
|
pattern: (identifier)
|
|
type: (primitive_type)))
|
|
body: (block))
|
|
(function_item
|
|
name: (identifier)
|
|
parameters: (parameters
|
|
(self_parameter
|
|
(self)))
|
|
return_type: (generic_type
|
|
type: (type_identifier)
|
|
type_arguments: (type_arguments
|
|
(block
|
|
(scoped_identifier
|
|
path: (identifier)
|
|
name: (identifier)))))
|
|
body: (block)))
|
|
|
|
============================================
|
|
Const function declarations
|
|
============================================
|
|
|
|
const fn main() {}
|
|
|
|
---
|
|
|
|
(source_file
|
|
(function_item (function_modifiers) (identifier) (parameters) (block)))
|
|
|
|
============================================
|
|
Functions with abstract return types
|
|
============================================
|
|
|
|
fn triples(a: impl B) -> impl Iterator<Item=(usize)> {
|
|
}
|
|
|
|
---
|
|
|
|
(source_file
|
|
(function_item
|
|
(identifier)
|
|
(parameters
|
|
(parameter
|
|
(identifier)
|
|
(abstract_type (type_identifier))))
|
|
(abstract_type (generic_type
|
|
(type_identifier)
|
|
(type_arguments (type_binding (type_identifier) (tuple_type (primitive_type))))))
|
|
(block)))
|
|
|
|
============================================
|
|
Diverging functions
|
|
============================================
|
|
|
|
fn aborts() -> ! {
|
|
}
|
|
|
|
---
|
|
|
|
(source_file
|
|
(function_item
|
|
(identifier)
|
|
(parameters)
|
|
(empty_type)
|
|
(block)))
|
|
|
|
============================================
|
|
Extern function declarations
|
|
============================================
|
|
|
|
extern "C" fn foo() {}
|
|
extern "C" fn printf(
|
|
*const c_char,
|
|
...,
|
|
) {}
|
|
|
|
---
|
|
|
|
(source_file
|
|
(function_item
|
|
(function_modifiers (extern_modifier (string_literal)))
|
|
(identifier)
|
|
(parameters)
|
|
(block))
|
|
(function_item
|
|
(function_modifiers (extern_modifier (string_literal)))
|
|
(identifier)
|
|
(parameters (pointer_type (type_identifier)) (variadic_parameter))
|
|
(block)))
|
|
|
|
============================================
|
|
Use declarations
|
|
============================================
|
|
|
|
use abc;
|
|
use phrases::japanese;
|
|
use sayings::english::greetings;
|
|
use sayings::english::greetings as en_greetings ;
|
|
use phrases::english::{greetings,farewells};
|
|
use sayings::japanese::farewells::*;
|
|
pub use self::greetings::hello;
|
|
use sayings::english::{self, greetings as en_greetings, farewells as en_farewells};
|
|
use three::{ dot::{one, four} };
|
|
use my::{ some::* };
|
|
use my::{*};
|
|
|
|
---
|
|
|
|
(source_file
|
|
(use_declaration
|
|
argument: (identifier))
|
|
(use_declaration
|
|
argument: (scoped_identifier
|
|
path: (identifier)
|
|
name: (identifier)))
|
|
(use_declaration
|
|
argument: (scoped_identifier
|
|
path: (scoped_identifier
|
|
path: (identifier)
|
|
name: (identifier))
|
|
name: (identifier)))
|
|
(use_declaration
|
|
argument: (use_as_clause
|
|
path: (scoped_identifier
|
|
path: (scoped_identifier
|
|
path: (identifier)
|
|
name: (identifier))
|
|
name: (identifier))
|
|
alias: (identifier)))
|
|
(use_declaration
|
|
argument: (scoped_use_list
|
|
path: (scoped_identifier
|
|
path: (identifier)
|
|
name: (identifier))
|
|
list: (use_list
|
|
(identifier)
|
|
(identifier))))
|
|
(use_declaration
|
|
argument: (use_wildcard
|
|
(scoped_identifier
|
|
path: (scoped_identifier
|
|
path: (identifier)
|
|
name: (identifier))
|
|
name: (identifier))))
|
|
(use_declaration
|
|
(visibility_modifier)
|
|
argument: (scoped_identifier
|
|
path: (scoped_identifier
|
|
path: (self)
|
|
name: (identifier))
|
|
name: (identifier)))
|
|
(use_declaration
|
|
argument: (scoped_use_list
|
|
path: (scoped_identifier
|
|
path: (identifier)
|
|
name: (identifier))
|
|
list: (use_list
|
|
(self)
|
|
(use_as_clause
|
|
path: (identifier)
|
|
alias: (identifier))
|
|
(use_as_clause
|
|
path: (identifier)
|
|
alias: (identifier)))))
|
|
(use_declaration
|
|
argument: (scoped_use_list
|
|
path: (identifier)
|
|
list: (use_list
|
|
(scoped_use_list
|
|
path: (identifier)
|
|
list: (use_list
|
|
(identifier)
|
|
(identifier))))))
|
|
(use_declaration
|
|
argument: (scoped_use_list
|
|
path: (identifier)
|
|
list: (use_list
|
|
(use_wildcard
|
|
(identifier)))))
|
|
(use_declaration
|
|
argument: (scoped_use_list
|
|
path: (identifier)
|
|
list: (use_list
|
|
(use_wildcard)))))
|
|
|
|
============================================
|
|
Variable bindings
|
|
============================================
|
|
|
|
let x;
|
|
let x = 42;
|
|
let x: i32;
|
|
let x: i8 = 42;
|
|
let mut x = 5;
|
|
let y: bool = false;
|
|
let bool: bool = false;
|
|
let u32: str = "";
|
|
|
|
---
|
|
|
|
(source_file
|
|
(let_declaration (identifier))
|
|
(let_declaration (identifier) (integer_literal))
|
|
(let_declaration (identifier) (primitive_type))
|
|
(let_declaration (identifier) (primitive_type) (integer_literal))
|
|
(let_declaration (mutable_specifier) (identifier) (integer_literal))
|
|
(let_declaration (identifier) (primitive_type) (boolean_literal))
|
|
(let_declaration (identifier) (primitive_type) (boolean_literal))
|
|
(let_declaration (identifier) (primitive_type) (string_literal)))
|
|
|
|
============================================
|
|
Structs
|
|
============================================
|
|
|
|
struct Proton;
|
|
struct Electron {}
|
|
struct Person {pub name: String, pub age: u32}
|
|
struct Point {
|
|
x: i32,
|
|
|
|
#[attribute1]
|
|
y: i32,
|
|
}
|
|
struct Color(pub i32, i32, i32);
|
|
struct Inches(i32);
|
|
|
|
---
|
|
|
|
(source_file
|
|
(struct_item (type_identifier))
|
|
(struct_item (type_identifier) (field_declaration_list))
|
|
(struct_item (type_identifier) (field_declaration_list
|
|
(field_declaration (visibility_modifier) (field_identifier) (type_identifier))
|
|
(field_declaration (visibility_modifier) (field_identifier) (primitive_type))))
|
|
(struct_item (type_identifier) (field_declaration_list
|
|
(field_declaration (field_identifier) (primitive_type))
|
|
(attribute_item (meta_item (identifier)))
|
|
(field_declaration (field_identifier) (primitive_type))))
|
|
(struct_item (type_identifier) (ordered_field_declaration_list
|
|
(visibility_modifier) (primitive_type) (primitive_type) (primitive_type)))
|
|
(struct_item (type_identifier) (ordered_field_declaration_list
|
|
(primitive_type))))
|
|
|
|
============================================
|
|
Unions
|
|
============================================
|
|
|
|
pub union in6_addr__bindgen_ty_1 {
|
|
pub __u6_addr8: [__uint8_t; 16usize],
|
|
pub __u6_addr16: [__uint16_t; 8usize],
|
|
pub __u6_addr32: [__uint32_t; 4usize],
|
|
_bindgen_union_align: [u32; 4usize],
|
|
}
|
|
|
|
---
|
|
|
|
(source_file
|
|
(union_item (visibility_modifier) (type_identifier) (field_declaration_list
|
|
(field_declaration (visibility_modifier) (field_identifier) (array_type (type_identifier) (integer_literal)))
|
|
(field_declaration (visibility_modifier) (field_identifier) (array_type (type_identifier) (integer_literal)))
|
|
(field_declaration (visibility_modifier) (field_identifier) (array_type (type_identifier) (integer_literal)))
|
|
(field_declaration (field_identifier) (array_type (primitive_type) (integer_literal))))))
|
|
|
|
============================================
|
|
Generic structs
|
|
============================================
|
|
|
|
struct A<B> {}
|
|
struct C<'a, 'b> {}
|
|
struct C<'a,> {}
|
|
struct D<const SIZE: usize> {}
|
|
|
|
---
|
|
|
|
(source_file
|
|
(struct_item
|
|
name: (type_identifier)
|
|
type_parameters: (type_parameters
|
|
(type_identifier))
|
|
body: (field_declaration_list))
|
|
(struct_item
|
|
name: (type_identifier)
|
|
type_parameters: (type_parameters
|
|
(lifetime
|
|
(identifier))
|
|
(lifetime
|
|
(identifier)))
|
|
body: (field_declaration_list))
|
|
(struct_item
|
|
name: (type_identifier)
|
|
type_parameters: (type_parameters
|
|
(lifetime
|
|
(identifier)))
|
|
body: (field_declaration_list))
|
|
(struct_item
|
|
name: (type_identifier)
|
|
type_parameters: (type_parameters
|
|
(const_parameter
|
|
name: (identifier)
|
|
type: (primitive_type)))
|
|
body: (field_declaration_list)))
|
|
|
|
============================================
|
|
Enums
|
|
============================================
|
|
|
|
pub enum Option<T> {
|
|
None,
|
|
Some(T),
|
|
}
|
|
|
|
pub enum Node<T: Item> {
|
|
Internal {
|
|
children: Vec<Tree<T>>,
|
|
height: u16
|
|
},
|
|
#[attribute1]
|
|
#[attribute2]
|
|
Leaf {
|
|
value: T
|
|
}
|
|
}
|
|
|
|
---
|
|
|
|
(source_file
|
|
(enum_item
|
|
(visibility_modifier)
|
|
(type_identifier)
|
|
(type_parameters (type_identifier))
|
|
(enum_variant_list
|
|
(enum_variant (identifier))
|
|
(enum_variant (identifier) (ordered_field_declaration_list (type_identifier)))))
|
|
(enum_item
|
|
(visibility_modifier)
|
|
(type_identifier)
|
|
(type_parameters (constrained_type_parameter
|
|
(type_identifier)
|
|
(trait_bounds (type_identifier))))
|
|
(enum_variant_list
|
|
(enum_variant
|
|
(identifier)
|
|
(field_declaration_list
|
|
(field_declaration (field_identifier) (generic_type
|
|
(type_identifier)
|
|
(type_arguments
|
|
(generic_type (type_identifier) (type_arguments (type_identifier))))))
|
|
(field_declaration (field_identifier) (primitive_type))))
|
|
(attribute_item (meta_item (identifier)))
|
|
(attribute_item (meta_item (identifier)))
|
|
(enum_variant
|
|
(identifier)
|
|
(field_declaration_list
|
|
(field_declaration (field_identifier) (type_identifier)))))))
|
|
|
|
============================================
|
|
Enums with values specified
|
|
============================================
|
|
|
|
pub enum c_style_enum {
|
|
val1 = 1,
|
|
val2 = 2
|
|
}
|
|
|
|
---
|
|
|
|
(source_file
|
|
(enum_item
|
|
(visibility_modifier)
|
|
(type_identifier)
|
|
(enum_variant_list
|
|
(enum_variant (identifier) (integer_literal))
|
|
(enum_variant (identifier) (integer_literal)))))
|
|
|
|
============================================
|
|
Generic functions
|
|
============================================
|
|
|
|
pub fn splice<T: Into<Text>>(&mut self, old_range: Range<usize>, new_text: T) {
|
|
}
|
|
pub fn uninit_array<const LEN: usize>() -> [Self; LEN] {}
|
|
|
|
---
|
|
|
|
(source_file
|
|
(function_item
|
|
(visibility_modifier)
|
|
name: (identifier)
|
|
type_parameters: (type_parameters
|
|
(constrained_type_parameter
|
|
left: (type_identifier)
|
|
bounds: (trait_bounds
|
|
(generic_type
|
|
type: (type_identifier)
|
|
type_arguments: (type_arguments
|
|
(type_identifier))))))
|
|
parameters: (parameters
|
|
(self_parameter
|
|
(mutable_specifier)
|
|
(self))
|
|
(parameter
|
|
pattern: (identifier)
|
|
type: (generic_type
|
|
type: (type_identifier)
|
|
type_arguments: (type_arguments
|
|
(primitive_type))))
|
|
(parameter
|
|
pattern: (identifier)
|
|
type: (type_identifier)))
|
|
body: (block))
|
|
(function_item
|
|
(visibility_modifier)
|
|
name: (identifier)
|
|
type_parameters: (type_parameters
|
|
(const_parameter
|
|
name: (identifier)
|
|
type: (primitive_type)))
|
|
parameters: (parameters)
|
|
return_type: (array_type
|
|
element: (type_identifier)
|
|
length: (identifier))
|
|
body: (block)))
|
|
|
|
============================================
|
|
Functions with mutable parameters
|
|
============================================
|
|
|
|
fn foo(mut x : u32) {
|
|
}
|
|
|
|
---
|
|
|
|
(source_file
|
|
(function_item
|
|
(identifier)
|
|
(parameters (parameter (mutable_specifier) (identifier) (primitive_type)))
|
|
(block)))
|
|
|
|
============================================
|
|
Functions with destructured parameters
|
|
============================================
|
|
|
|
fn f1([x, y]: [u32; 2]) {}
|
|
fn f2(&x: &Y) {}
|
|
fn f3((x, y): (T, U)) {}
|
|
|
|
---
|
|
|
|
(source_file
|
|
(function_item
|
|
(identifier)
|
|
(parameters
|
|
(parameter
|
|
(slice_pattern (identifier) (identifier))
|
|
(array_type (primitive_type) (integer_literal))))
|
|
(block))
|
|
(function_item
|
|
(identifier)
|
|
(parameters
|
|
(parameter
|
|
(reference_pattern (identifier))
|
|
(reference_type (type_identifier))))
|
|
(block))
|
|
(function_item
|
|
(identifier)
|
|
(parameters
|
|
(parameter
|
|
(tuple_pattern (identifier) (identifier))
|
|
(tuple_type (type_identifier) (type_identifier))))
|
|
(block)))
|
|
|
|
============================================
|
|
Functions with custom types for self
|
|
============================================
|
|
|
|
trait Callback {
|
|
fn call(self: Box<Self>);
|
|
}
|
|
|
|
---
|
|
|
|
(source_file
|
|
(trait_item
|
|
(type_identifier)
|
|
(declaration_list
|
|
(function_signature_item
|
|
(identifier)
|
|
(parameters
|
|
(parameter
|
|
(self)
|
|
(generic_type (type_identifier) (type_arguments (type_identifier)))))))))
|
|
|
|
============================================
|
|
Constant items
|
|
============================================
|
|
|
|
const N: i32 = 5;
|
|
|
|
trait Foo {
|
|
const X: u8;
|
|
}
|
|
|
|
---
|
|
|
|
(source_file
|
|
(const_item (identifier) (primitive_type) (integer_literal))
|
|
(trait_item
|
|
(type_identifier)
|
|
(declaration_list (const_item (identifier) (primitive_type)))))
|
|
|
|
============================================
|
|
Static items
|
|
============================================
|
|
|
|
static N: i32 = 5;
|
|
static mut __progname: *mut ::c_char;
|
|
|
|
---
|
|
|
|
(source_file
|
|
(static_item
|
|
(identifier)
|
|
(primitive_type)
|
|
(integer_literal))
|
|
(static_item
|
|
(mutable_specifier)
|
|
(identifier)
|
|
(pointer_type (mutable_specifier) (scoped_type_identifier (type_identifier)))))
|
|
|
|
============================================
|
|
Static 'ref' items using lazy_static
|
|
============================================
|
|
|
|
static ref ONE: usize = 0;
|
|
|
|
---
|
|
|
|
(source_file
|
|
(static_item (identifier) (primitive_type) (integer_literal)))
|
|
|
|
============================================
|
|
Type aliases
|
|
============================================
|
|
|
|
type Inch = u64;
|
|
type Name<T> = Vec<T>;
|
|
|
|
---
|
|
|
|
(source_file
|
|
(type_item (type_identifier) (primitive_type))
|
|
(type_item (type_identifier) (type_parameters (type_identifier)) (generic_type (type_identifier) (type_arguments (type_identifier)))))
|
|
|
|
============================================
|
|
Empty statements
|
|
============================================
|
|
|
|
fn main() {
|
|
;
|
|
}
|
|
|
|
---
|
|
|
|
(source_file
|
|
(function_item (identifier) (parameters) (block
|
|
(empty_statement))))
|
|
|
|
============================================
|
|
Attributes
|
|
============================================
|
|
|
|
#[test]
|
|
fn test_foo() {}
|
|
|
|
#[derive(Debug)]
|
|
struct Baz;
|
|
|
|
#[derive(Debug, Eq,)]
|
|
struct Foo;
|
|
|
|
#[cfg(target_os = "macos")]
|
|
mod macos_only {}
|
|
|
|
#![allow(clippy::useless_transmute)]
|
|
|
|
#[clippy::cyclomatic_complexity = "100"]
|
|
|
|
---
|
|
|
|
(source_file
|
|
(attribute_item (meta_item (identifier)))
|
|
(function_item
|
|
name: (identifier)
|
|
parameters: (parameters)
|
|
body: (block))
|
|
|
|
(attribute_item (meta_item
|
|
(identifier)
|
|
arguments: (meta_arguments (meta_item (identifier)))))
|
|
(struct_item name: (type_identifier))
|
|
|
|
(attribute_item (meta_item
|
|
(identifier)
|
|
arguments: (meta_arguments
|
|
(meta_item (identifier))
|
|
(meta_item (identifier)))))
|
|
(struct_item name: (type_identifier))
|
|
|
|
(attribute_item (meta_item
|
|
(identifier)
|
|
arguments: (meta_arguments
|
|
(meta_item
|
|
(identifier)
|
|
value: (string_literal)))))
|
|
(mod_item
|
|
name: (identifier)
|
|
body: (declaration_list))
|
|
|
|
(inner_attribute_item (meta_item
|
|
(identifier)
|
|
arguments: (meta_arguments (meta_item
|
|
(scoped_identifier
|
|
path: (identifier)
|
|
name: (identifier))))))
|
|
|
|
(attribute_item (meta_item
|
|
(scoped_identifier
|
|
path: (identifier)
|
|
name: (identifier))
|
|
value: (string_literal))))
|
|
|
|
============================================
|
|
Inner attributes
|
|
============================================
|
|
|
|
mod macos_only {
|
|
#![cfg(target_os = "macos")]
|
|
}
|
|
|
|
---
|
|
|
|
(source_file
|
|
(mod_item
|
|
name: (identifier)
|
|
body: (declaration_list
|
|
(inner_attribute_item (meta_item
|
|
(identifier)
|
|
arguments: (meta_arguments (meta_item
|
|
(identifier)
|
|
value: (string_literal))))))))
|
|
|
|
============================================
|
|
Attributes and Expressions
|
|
============================================
|
|
|
|
fn foo() {
|
|
bar(x,
|
|
#[cfg(foo = "bar")]
|
|
y);
|
|
let z = [#[hello] 2, 7, 8];
|
|
let t = (#[hello] 2, 7, 8);
|
|
}
|
|
|
|
---
|
|
|
|
(source_file
|
|
(function_item
|
|
name: (identifier)
|
|
parameters: (parameters)
|
|
body: (block
|
|
(call_expression
|
|
function: (identifier)
|
|
arguments: (arguments
|
|
(identifier)
|
|
(attribute_item (meta_item
|
|
(identifier)
|
|
arguments: (meta_arguments (meta_item
|
|
(identifier)
|
|
value: (string_literal)))))
|
|
(identifier)))
|
|
(let_declaration
|
|
pattern: (identifier)
|
|
value: (array_expression
|
|
(attribute_item (meta_item (identifier)))
|
|
(integer_literal)
|
|
(integer_literal)
|
|
(integer_literal)))
|
|
(let_declaration
|
|
pattern: (identifier)
|
|
value: (tuple_expression
|
|
(attribute_item (meta_item (identifier)))
|
|
(integer_literal)
|
|
(integer_literal)
|
|
(integer_literal))))))
|
|
|
|
===========================================
|
|
Inherent Impls
|
|
===========================================
|
|
|
|
impl Person {
|
|
const leg_count : u32 = 2;
|
|
|
|
fn walk(self) {}
|
|
fn walk_mut(mut self) {}
|
|
fn talk(& self) {}
|
|
fn talk_mut(&'a mut self) {}
|
|
}
|
|
|
|
impl Machine<{State::Init}> {}
|
|
|
|
---
|
|
|
|
(source_file
|
|
(impl_item
|
|
type: (type_identifier)
|
|
body: (declaration_list
|
|
(const_item
|
|
name: (identifier)
|
|
type: (primitive_type)
|
|
value: (integer_literal))
|
|
(function_item
|
|
name: (identifier)
|
|
parameters: (parameters
|
|
(self_parameter
|
|
(self)))
|
|
body: (block))
|
|
(function_item
|
|
name: (identifier)
|
|
parameters: (parameters
|
|
(self_parameter
|
|
(mutable_specifier)
|
|
(self)))
|
|
body: (block))
|
|
(function_item
|
|
name: (identifier)
|
|
parameters: (parameters
|
|
(self_parameter
|
|
(self)))
|
|
body: (block))
|
|
(function_item
|
|
name: (identifier)
|
|
parameters: (parameters
|
|
(self_parameter
|
|
(lifetime
|
|
(identifier))
|
|
(mutable_specifier)
|
|
(self)))
|
|
body: (block))))
|
|
(impl_item
|
|
type: (generic_type
|
|
type: (type_identifier)
|
|
type_arguments: (type_arguments
|
|
(block
|
|
(scoped_identifier
|
|
path: (identifier)
|
|
name: (identifier)))))
|
|
body: (declaration_list)))
|
|
|
|
===========================================
|
|
Trait impls
|
|
===========================================
|
|
|
|
impl<'a> iter::Iterator for Self::Iter<'a> {
|
|
}
|
|
|
|
impl ConvertTo<i64> for i32 {
|
|
fn convert(&self) -> i64 { *self as i64 }
|
|
}
|
|
|
|
---
|
|
|
|
(source_file
|
|
(impl_item
|
|
type_parameters: (type_parameters (lifetime (identifier)))
|
|
trait: (scoped_type_identifier
|
|
path: (identifier)
|
|
name: (type_identifier))
|
|
type: (generic_type
|
|
type: (scoped_type_identifier
|
|
path: (identifier)
|
|
name: (type_identifier))
|
|
type_arguments: (type_arguments (lifetime (identifier))))
|
|
body: (declaration_list))
|
|
(impl_item
|
|
trait: (generic_type
|
|
type: (type_identifier)
|
|
type_arguments: (type_arguments (primitive_type)))
|
|
type: (primitive_type)
|
|
body: (declaration_list
|
|
(function_item
|
|
name: (identifier)
|
|
parameters: (parameters (self_parameter (self)))
|
|
return_type: (primitive_type)
|
|
body: (block
|
|
(type_cast_expression
|
|
value: (unary_expression (self))
|
|
type: (primitive_type)))))))
|
|
|
|
===========================================
|
|
Unsafe impls
|
|
===========================================
|
|
|
|
unsafe impl Foo {
|
|
}
|
|
|
|
---
|
|
|
|
(source_file (impl_item (type_identifier) (declaration_list)))
|
|
|
|
===========================================
|
|
Impls with default functions
|
|
===========================================
|
|
|
|
impl Foo {
|
|
const default fn bar() -> i32 {
|
|
// Make 'default' still works as an identifier
|
|
default.bar();
|
|
}
|
|
}
|
|
|
|
---
|
|
|
|
(source_file
|
|
(impl_item (type_identifier) (declaration_list
|
|
(function_item
|
|
(function_modifiers)
|
|
(identifier)
|
|
(parameters)
|
|
(primitive_type)
|
|
(block
|
|
(line_comment)
|
|
(call_expression
|
|
(field_expression (identifier) (field_identifier))
|
|
(arguments)))))))
|
|
|
|
============================================
|
|
Trait declarations
|
|
============================================
|
|
|
|
pub trait Item: Clone + Eq + fmt::Debug {
|
|
fn summarize(&self) -> Self::Summary;
|
|
}
|
|
|
|
unsafe trait Foo { }
|
|
|
|
---
|
|
|
|
(source_file
|
|
(trait_item
|
|
(visibility_modifier)
|
|
(type_identifier)
|
|
(trait_bounds
|
|
(type_identifier)
|
|
(type_identifier)
|
|
(scoped_type_identifier (identifier) (type_identifier)))
|
|
(declaration_list
|
|
(function_signature_item
|
|
(identifier)
|
|
(parameters (self_parameter (self)))
|
|
(scoped_type_identifier (identifier) (type_identifier)))))
|
|
(trait_item (type_identifier) (declaration_list)))
|
|
|
|
============================================
|
|
Trait declarations with optional type parameters
|
|
============================================
|
|
|
|
trait Add<RHS=Self> {
|
|
type Output;
|
|
fn add(self, rhs: RHS) -> Self::Output;
|
|
}
|
|
|
|
---
|
|
|
|
(source_file
|
|
(trait_item
|
|
(type_identifier)
|
|
(type_parameters (optional_type_parameter (type_identifier) (type_identifier)))
|
|
(declaration_list
|
|
(associated_type (type_identifier))
|
|
(function_signature_item
|
|
(identifier)
|
|
(parameters (self_parameter (self)) (parameter (identifier) (type_identifier)))
|
|
(scoped_type_identifier (identifier) (type_identifier))))))
|
|
|
|
============================================
|
|
Unsized types in trait bounds
|
|
============================================
|
|
|
|
trait Foo<T: ?Sized> {
|
|
}
|
|
|
|
---
|
|
|
|
(source_file
|
|
(trait_item
|
|
(type_identifier)
|
|
(type_parameters
|
|
(constrained_type_parameter
|
|
(type_identifier)
|
|
(trait_bounds (removed_trait_bound (type_identifier)))))
|
|
(declaration_list)))
|
|
|
|
============================================
|
|
Macro invocations inside trait declarations
|
|
============================================
|
|
|
|
|
|
pub trait A: B + C + D {
|
|
private_decl!{}
|
|
fn f(&self);
|
|
}
|
|
|
|
---
|
|
|
|
(source_file
|
|
(trait_item
|
|
(visibility_modifier)
|
|
(type_identifier)
|
|
(trait_bounds (type_identifier) (type_identifier) (type_identifier))
|
|
(declaration_list
|
|
(macro_invocation (identifier) (token_tree))
|
|
(function_signature_item (identifier) (parameters (self_parameter (self)))))))
|
|
|
|
============================================
|
|
Associated Types
|
|
============================================
|
|
|
|
pub trait Graph {
|
|
type N: fmt::Display;
|
|
type E;
|
|
}
|
|
|
|
---
|
|
|
|
(source_file
|
|
(trait_item
|
|
(visibility_modifier)
|
|
(type_identifier)
|
|
(declaration_list
|
|
(associated_type (type_identifier) (trait_bounds (scoped_type_identifier (identifier) (type_identifier))))
|
|
(associated_type (type_identifier)))))
|
|
|
|
=====================
|
|
Higher-ranked types
|
|
=====================
|
|
|
|
trait T: for<'a> AddAssign<&'a usize> {
|
|
}
|
|
|
|
---
|
|
|
|
(source_file
|
|
(trait_item
|
|
(type_identifier)
|
|
(trait_bounds
|
|
(higher_ranked_trait_bound
|
|
(type_parameters (lifetime (identifier)))
|
|
(generic_type (type_identifier) (type_arguments (reference_type (lifetime (identifier)) (primitive_type))))))
|
|
(declaration_list)))
|
|
|
|
=====================
|
|
Visibility modifiers
|
|
=====================
|
|
|
|
pub fn a() {}
|
|
pub(super) fn b() {}
|
|
pub(self) fn c() {}
|
|
pub(crate) fn c() {}
|
|
pub(in crate::d) fn e() {}
|
|
|
|
---
|
|
|
|
(source_file
|
|
(function_item (visibility_modifier) (identifier) (parameters) (block))
|
|
(function_item (visibility_modifier (super)) (identifier) (parameters) (block))
|
|
(function_item (visibility_modifier (self)) (identifier) (parameters) (block))
|
|
(function_item (visibility_modifier (crate)) (identifier) (parameters) (block))
|
|
(function_item
|
|
(visibility_modifier (scoped_identifier (crate) (identifier)))
|
|
(identifier)
|
|
(parameters)
|
|
(block)))
|
|
|
|
========================================================
|
|
Function parameter names that match built-in type names
|
|
========================================================
|
|
|
|
fn foo(str: *const c_char) {}
|
|
fn bar(bool: bool) {}
|
|
|
|
---
|
|
|
|
(source_file
|
|
(function_item (identifier) (parameters (parameter (identifier) (pointer_type (type_identifier)))) (block))
|
|
(function_item (identifier) (parameters (parameter (identifier) (primitive_type))) (block)))
|
|
|
|
|
|
=====================
|
|
Where clauses
|
|
=====================
|
|
|
|
fn walk<F>(&self, it: &mut F) -> bool
|
|
where F: FnMut(&Pat) -> bool
|
|
{
|
|
return false
|
|
}
|
|
|
|
impl<'a, T: 'a + Item> Iterator for Iter<'a, T> where Self: 'a {
|
|
}
|
|
|
|
impl<T> A for B<T>
|
|
where C<T>: D,
|
|
T: 'c,
|
|
'c: 'b,
|
|
{
|
|
}
|
|
|
|
impl<'a, E> Read
|
|
where &'a E: Read,
|
|
{
|
|
}
|
|
|
|
impl<T> A for B<T> where (T, T, T): C, {}
|
|
|
|
impl<T> A for B<T>
|
|
where for<'a> D<T>: E<'a>,
|
|
{
|
|
}
|
|
|
|
pub trait A<B> where B: C,
|
|
{
|
|
}
|
|
|
|
fn foo<A>() where A: B + As<f64>, f64: As<A> {}
|
|
|
|
impl<A> Default for B<A> where *mut A: C + D {}
|
|
|
|
---
|
|
|
|
(source_file
|
|
(function_item
|
|
name: (identifier)
|
|
type_parameters: (type_parameters (type_identifier))
|
|
parameters: (parameters
|
|
(self_parameter (self))
|
|
(parameter
|
|
pattern: (identifier)
|
|
type: (reference_type
|
|
(mutable_specifier)
|
|
type: (type_identifier))))
|
|
return_type: (primitive_type)
|
|
(where_clause
|
|
(where_predicate
|
|
left: (type_identifier)
|
|
bounds: (trait_bounds
|
|
(function_type
|
|
trait: (type_identifier)
|
|
parameters: (parameters (reference_type type: (type_identifier)))
|
|
return_type: (primitive_type)))))
|
|
body: (block (return_expression (boolean_literal))))
|
|
|
|
(impl_item
|
|
type_parameters: (type_parameters
|
|
(lifetime (identifier))
|
|
(constrained_type_parameter
|
|
left: (type_identifier)
|
|
bounds: (trait_bounds
|
|
(lifetime (identifier))
|
|
(type_identifier))))
|
|
trait: (type_identifier)
|
|
type: (generic_type
|
|
type: (type_identifier)
|
|
type_arguments: (type_arguments
|
|
(lifetime (identifier))
|
|
(type_identifier)))
|
|
(where_clause (where_predicate
|
|
left: (type_identifier)
|
|
bounds: (trait_bounds (lifetime (identifier)))))
|
|
body: (declaration_list))
|
|
|
|
(impl_item
|
|
type_parameters: (type_parameters (type_identifier))
|
|
trait: (type_identifier)
|
|
type: (generic_type
|
|
type: (type_identifier)
|
|
type_arguments: (type_arguments (type_identifier)))
|
|
(where_clause
|
|
(where_predicate
|
|
left: (generic_type
|
|
type: (type_identifier)
|
|
type_arguments: (type_arguments (type_identifier)))
|
|
bounds: (trait_bounds (type_identifier)))
|
|
(where_predicate
|
|
left: (type_identifier)
|
|
bounds: (trait_bounds (lifetime (identifier))))
|
|
(where_predicate
|
|
left: (lifetime (identifier))
|
|
bounds: (trait_bounds (lifetime (identifier)))))
|
|
body: (declaration_list))
|
|
|
|
(impl_item
|
|
type_parameters: (type_parameters
|
|
(lifetime (identifier))
|
|
(type_identifier))
|
|
type: (type_identifier)
|
|
(where_clause
|
|
(where_predicate
|
|
left: (reference_type
|
|
(lifetime (identifier))
|
|
type: (type_identifier))
|
|
bounds: (trait_bounds (type_identifier))))
|
|
body: (declaration_list))
|
|
|
|
(impl_item
|
|
type_parameters: (type_parameters (type_identifier))
|
|
trait: (type_identifier)
|
|
type: (generic_type
|
|
type: (type_identifier)
|
|
type_arguments: (type_arguments (type_identifier)))
|
|
(where_clause
|
|
(where_predicate
|
|
left: (tuple_type (type_identifier) (type_identifier) (type_identifier))
|
|
bounds: (trait_bounds (type_identifier))))
|
|
body: (declaration_list))
|
|
|
|
(impl_item
|
|
type_parameters: (type_parameters (type_identifier))
|
|
trait: (type_identifier)
|
|
type: (generic_type
|
|
type: (type_identifier)
|
|
type_arguments: (type_arguments (type_identifier)))
|
|
(where_clause
|
|
(where_predicate
|
|
left: (higher_ranked_trait_bound
|
|
type_parameters: (type_parameters (lifetime (identifier)))
|
|
type: (generic_type
|
|
type: (type_identifier)
|
|
type_arguments: (type_arguments (type_identifier))))
|
|
bounds: (trait_bounds
|
|
(generic_type
|
|
type: (type_identifier)
|
|
type_arguments: (type_arguments (lifetime (identifier)))))))
|
|
body: (declaration_list))
|
|
|
|
(trait_item
|
|
(visibility_modifier)
|
|
name: (type_identifier)
|
|
type_parameters: (type_parameters (type_identifier))
|
|
(where_clause (where_predicate
|
|
left: (type_identifier)
|
|
bounds: (trait_bounds (type_identifier))))
|
|
body: (declaration_list))
|
|
|
|
(function_item
|
|
name: (identifier)
|
|
type_parameters: (type_parameters (type_identifier))
|
|
parameters: (parameters)
|
|
(where_clause
|
|
(where_predicate
|
|
left: (type_identifier)
|
|
bounds: (trait_bounds
|
|
(type_identifier)
|
|
(generic_type
|
|
type: (type_identifier)
|
|
type_arguments: (type_arguments (primitive_type)))))
|
|
(where_predicate
|
|
left: (primitive_type)
|
|
bounds: (trait_bounds (generic_type
|
|
type: (type_identifier)
|
|
type_arguments: (type_arguments (type_identifier))))))
|
|
body: (block))
|
|
|
|
(impl_item
|
|
type_parameters: (type_parameters (type_identifier))
|
|
trait: (type_identifier)
|
|
type: (generic_type
|
|
type: (type_identifier)
|
|
type_arguments: (type_arguments (type_identifier)))
|
|
(where_clause
|
|
(where_predicate
|
|
left: (pointer_type (mutable_specifier) type: (type_identifier))
|
|
bounds: (trait_bounds (type_identifier) (type_identifier))))
|
|
body: (declaration_list)))
|
|
|
|
===================================
|
|
External Modules
|
|
===================================
|
|
|
|
pub extern {
|
|
pub fn napi_module_register(mod_: *mut napi_module);
|
|
}
|
|
|
|
extern "C" {}
|
|
|
|
---
|
|
|
|
(source_file
|
|
(foreign_mod_item (visibility_modifier) (extern_modifier) (declaration_list
|
|
(function_signature_item (visibility_modifier) (identifier) (parameters (parameter (identifier) (pointer_type (mutable_specifier) (type_identifier)))))))
|
|
(foreign_mod_item (extern_modifier (string_literal)) (declaration_list)))
|
|
|
|
===================================
|
|
Crate visibility
|
|
===================================
|
|
|
|
crate mod foo;
|
|
crate struct Foo(crate crate::Bar);
|
|
crate fn foo() { }
|
|
crate const X: u32 = 0;
|
|
|
|
---
|
|
|
|
(source_file
|
|
(mod_item
|
|
(visibility_modifier (crate)) (identifier))
|
|
(struct_item
|
|
(visibility_modifier (crate))
|
|
(type_identifier)
|
|
(ordered_field_declaration_list (visibility_modifier (crate)) (scoped_type_identifier (crate) (type_identifier))))
|
|
(function_item
|
|
(visibility_modifier (crate)) (identifier) (parameters) (block))
|
|
(const_item
|
|
(visibility_modifier (crate)) (identifier) (primitive_type) (integer_literal)))
|
|
|
|
===================================
|
|
Reserved keywords in path
|
|
===================================
|
|
|
|
struct A {
|
|
a: default::B,
|
|
b: union::C,
|
|
}
|
|
|
|
---
|
|
|
|
(source_file
|
|
(struct_item
|
|
(type_identifier)
|
|
(field_declaration_list
|
|
(field_declaration (field_identifier) (scoped_type_identifier (identifier) (type_identifier)))
|
|
(field_declaration (field_identifier) (scoped_type_identifier (identifier) (type_identifier))))))
|