Expand description
Syntax tree traversal to walk a shared borrow of a syntax tree.
Each method of the Visit
trait is a hook that can be overridden to
customize the behavior when visiting the corresponding type of node. By
default, every method recursively visits the substructure of the input
by invoking the right visitor method of each of its fields.
pub trait Visit<'ast> {
/* ... */
fn visit_expr_binary(&mut self, node: &'ast ExprBinary) {
visit_expr_binary(self, node);
}
/* ... */
}
pub fn visit_expr_binary<'ast, V>(v: &mut V, node: &'ast ExprBinary)
where
V: Visit<'ast> + ?Sized,
{
for attr in &node.attrs {
v.visit_attribute(attr);
}
v.visit_expr(&*node.left);
v.visit_bin_op(&node.op);
v.visit_expr(&*node.right);
}
/* ... */
§Example
This visitor will print the name of every freestanding function in the syntax tree, including nested functions.
// [dependencies]
// quote = "1.0"
// syn = { version = "2.0", features = ["full", "visit"] }
use quote::quote;
use syn::visit::{self, Visit};
use syn::{File, ItemFn};
struct FnVisitor;
impl<'ast> Visit<'ast> for FnVisitor {
fn visit_item_fn(&mut self, node: &'ast ItemFn) {
println!("Function with name={}", node.sig.ident);
// Delegate to the default impl to visit any nested functions.
visit::visit_item_fn(self, node);
}
}
fn main() {
let code = quote! {
pub fn f() {
fn g() {}
}
};
let syntax_tree: File = syn::parse2(code).unwrap();
FnVisitor.visit_file(&syntax_tree);
}
The 'ast
lifetime on the input references means that the syntax tree
outlives the complete recursive visit call, so the visitor is allowed to
hold on to references into the syntax tree.
use quote::quote;
use syn::visit::{self, Visit};
use syn::{File, ItemFn};
struct FnVisitor<'ast> {
functions: Vec<&'ast ItemFn>,
}
impl<'ast> Visit<'ast> for FnVisitor<'ast> {
fn visit_item_fn(&mut self, node: &'ast ItemFn) {
self.functions.push(node);
visit::visit_item_fn(self, node);
}
}
fn main() {
let code = quote! {
pub fn f() {
fn g() {}
}
};
let syntax_tree: File = syn::parse2(code).unwrap();
let mut visitor = FnVisitor { functions: Vec::new() };
visitor.visit_file(&syntax_tree);
for f in visitor.functions {
println!("Function with name={}", f.sig.ident);
}
}
Traits§
- Visit
- Syntax tree traversal to walk a shared borrow of a syntax tree.
Functions§
- visit_
abi - visit_
angle_ bracketed_ generic_ arguments - visit_
arm - visit_
assoc_ const - visit_
assoc_ type - visit_
attr_ style - visit_
attribute - visit_
bare_ fn_ arg - visit_
bare_ variadic - visit_
bin_ op - visit_
block - visit_
bound_ lifetimes - visit_
captured_ param - visit_
const_ param - visit_
constraint - visit_
data - visit_
data_ enum - visit_
data_ struct - visit_
data_ union - visit_
derive_ input - visit_
expr - visit_
expr_ array - visit_
expr_ assign - visit_
expr_ async - visit_
expr_ await - visit_
expr_ binary - visit_
expr_ block - visit_
expr_ break - visit_
expr_ call - visit_
expr_ cast - visit_
expr_ closure - visit_
expr_ const - visit_
expr_ continue - visit_
expr_ field - visit_
expr_ for_ loop - visit_
expr_ group - visit_
expr_ if - visit_
expr_ index - visit_
expr_ infer - visit_
expr_ let - visit_
expr_ lit - visit_
expr_ loop - visit_
expr_ macro - visit_
expr_ match - visit_
expr_ method_ call - visit_
expr_ paren - visit_
expr_ path - visit_
expr_ range - visit_
expr_ raw_ addr - visit_
expr_ reference - visit_
expr_ repeat - visit_
expr_ return - visit_
expr_ struct - visit_
expr_ try - visit_
expr_ try_ block - visit_
expr_ tuple - visit_
expr_ unary - visit_
expr_ unsafe - visit_
expr_ while - visit_
expr_ yield - visit_
field - visit_
field_ mutability - visit_
field_ pat - visit_
field_ value - visit_
fields - visit_
fields_ named - visit_
fields_ unnamed - visit_
file - visit_
fn_ arg - visit_
foreign_ item - visit_
foreign_ item_ fn - visit_
foreign_ item_ macro - visit_
foreign_ item_ static - visit_
foreign_ item_ type - visit_
generic_ argument - visit_
generic_ param - visit_
generics - visit_
ident - visit_
impl_ item - visit_
impl_ item_ const - visit_
impl_ item_ fn - visit_
impl_ item_ macro - visit_
impl_ item_ type - visit_
impl_ restriction - visit_
index - visit_
item - visit_
item_ const - visit_
item_ enum - visit_
item_ extern_ crate - visit_
item_ fn - visit_
item_ foreign_ mod - visit_
item_ impl - visit_
item_ macro - visit_
item_ mod - visit_
item_ static - visit_
item_ struct - visit_
item_ trait - visit_
item_ trait_ alias - visit_
item_ type - visit_
item_ union - visit_
item_ use - visit_
label - visit_
lifetime - visit_
lifetime_ param - visit_
lit - visit_
lit_ bool - visit_
lit_ byte - visit_
lit_ byte_ str - visit_
lit_ char - visit_
lit_ cstr - visit_
lit_ float - visit_
lit_ int - visit_
lit_ str - visit_
local - visit_
local_ init - visit_
macro - visit_
macro_ delimiter - visit_
member - visit_
meta - visit_
meta_ list - visit_
meta_ name_ value - visit_
parenthesized_ generic_ arguments - visit_
pat - visit_
pat_ ident - visit_
pat_ or - visit_
pat_ paren - visit_
pat_ reference - visit_
pat_ rest - visit_
pat_ slice - visit_
pat_ struct - visit_
pat_ tuple - visit_
pat_ tuple_ struct - visit_
pat_ type - visit_
pat_ wild - visit_
path - visit_
path_ arguments - visit_
path_ segment - visit_
pointer_ mutability - visit_
precise_ capture - visit_
predicate_ lifetime - visit_
predicate_ type - visit_
qself - visit_
range_ limits - visit_
receiver - visit_
return_ type - visit_
signature - visit_
span - visit_
static_ mutability - visit_
stmt - visit_
stmt_ macro - visit_
trait_ bound - visit_
trait_ bound_ modifier - visit_
trait_ item - visit_
trait_ item_ const - visit_
trait_ item_ fn - visit_
trait_ item_ macro - visit_
trait_ item_ type - visit_
type - visit_
type_ array - visit_
type_ bare_ fn - visit_
type_ group - visit_
type_ impl_ trait - visit_
type_ infer - visit_
type_ macro - visit_
type_ never - visit_
type_ param - visit_
type_ param_ bound - visit_
type_ paren - visit_
type_ path - visit_
type_ ptr - visit_
type_ reference - visit_
type_ slice - visit_
type_ trait_ object - visit_
type_ tuple - visit_
un_ op - visit_
use_ glob - visit_
use_ group - visit_
use_ name - visit_
use_ path - visit_
use_ rename - visit_
use_ tree - visit_
variadic - visit_
variant - visit_
vis_ restricted - visit_
visibility - visit_
where_ clause - visit_
where_ predicate