pub trait Visitor<'arena, 'src> {
type Break;
Show 18 methods
// Provided methods
fn visit_program(
&mut self,
program: &Program<'arena, 'src>,
) -> ControlFlow<Self::Break> { ... }
fn visit_stmt(
&mut self,
stmt: &Stmt<'arena, 'src>,
) -> ControlFlow<Self::Break> { ... }
fn visit_block(
&mut self,
block: &Block<'arena, 'src>,
) -> ControlFlow<Self::Break> { ... }
fn visit_expr(
&mut self,
expr: &Expr<'arena, 'src>,
) -> ControlFlow<Self::Break> { ... }
fn visit_param(
&mut self,
param: &Param<'arena, 'src>,
) -> ControlFlow<Self::Break> { ... }
fn visit_arg(&mut self, arg: &Arg<'arena, 'src>) -> ControlFlow<Self::Break> { ... }
fn visit_class_member(
&mut self,
member: &ClassMember<'arena, 'src>,
) -> ControlFlow<Self::Break> { ... }
fn visit_enum_member(
&mut self,
member: &EnumMember<'arena, 'src>,
) -> ControlFlow<Self::Break> { ... }
fn visit_property_hook(
&mut self,
hook: &PropertyHook<'arena, 'src>,
) -> ControlFlow<Self::Break> { ... }
fn visit_type_hint(
&mut self,
type_hint: &TypeHint<'arena, 'src>,
) -> ControlFlow<Self::Break> { ... }
fn visit_attribute(
&mut self,
attribute: &Attribute<'arena, 'src>,
) -> ControlFlow<Self::Break> { ... }
fn visit_catch_clause(
&mut self,
catch: &CatchClause<'arena, 'src>,
) -> ControlFlow<Self::Break> { ... }
fn visit_match_arm(
&mut self,
arm: &MatchArm<'arena, 'src>,
) -> ControlFlow<Self::Break> { ... }
fn visit_closure_use_var(
&mut self,
_var: &ClosureUseVar<'src>,
) -> ControlFlow<Self::Break> { ... }
fn visit_trait_use(
&mut self,
trait_use: &TraitUseDecl<'arena, 'src>,
) -> ControlFlow<Self::Break> { ... }
fn visit_trait_adaptation(
&mut self,
adaptation: &TraitAdaptation<'arena, 'src>,
) -> ControlFlow<Self::Break> { ... }
fn visit_name(
&mut self,
_name: &Name<'arena, 'src>,
) -> ControlFlow<Self::Break> { ... }
fn visit_comment(
&mut self,
_comment: &Comment<'src>,
) -> ControlFlow<Self::Break> { ... }
}Expand description
Visitor trait for immutable AST traversal.
All methods return ControlFlow<Self::Break>:
ControlFlow::Continue(())— keep walking.ControlFlow::Break(value)— stop the entire traversal immediately;valueis returned by the call that started the walk. Usetype Break = ();when there is nothing to return.
Default implementations recursively walk child nodes, so implementors only need to override the node types they care about.
To skip a subtree, override the method and return Continue(())
without calling the corresponding walk_* function.
§Example
use php_ast::visitor::{Visitor, walk_expr};
use php_ast::ast::*;
use std::ops::ControlFlow;
struct VarCounter { count: usize }
impl<'arena, 'src> Visitor<'arena, 'src> for VarCounter {
type Break = ();
fn visit_expr(&mut self, expr: &Expr<'arena, 'src>) -> ControlFlow<()> {
if matches!(&expr.kind, ExprKind::Variable(_)) {
self.count += 1;
}
walk_expr(self, expr)
}
}Required Associated Types§
Sourcetype Break
type Break
Value carried by ControlFlow::Break when a visit stops the walk early; use () to
stop without a result.
Provided Methods§
Sourcefn visit_program(
&mut self,
program: &Program<'arena, 'src>,
) -> ControlFlow<Self::Break>
fn visit_program( &mut self, program: &Program<'arena, 'src>, ) -> ControlFlow<Self::Break>
Visits the root program node.
Sourcefn visit_stmt(&mut self, stmt: &Stmt<'arena, 'src>) -> ControlFlow<Self::Break>
fn visit_stmt(&mut self, stmt: &Stmt<'arena, 'src>) -> ControlFlow<Self::Break>
Visits a statement.
Sourcefn visit_block(
&mut self,
block: &Block<'arena, 'src>,
) -> ControlFlow<Self::Break>
fn visit_block( &mut self, block: &Block<'arena, 'src>, ) -> ControlFlow<Self::Break>
Visits a block of statements.
Sourcefn visit_expr(&mut self, expr: &Expr<'arena, 'src>) -> ControlFlow<Self::Break>
fn visit_expr(&mut self, expr: &Expr<'arena, 'src>) -> ControlFlow<Self::Break>
Visits an expression.
Sourcefn visit_param(
&mut self,
param: &Param<'arena, 'src>,
) -> ControlFlow<Self::Break>
fn visit_param( &mut self, param: &Param<'arena, 'src>, ) -> ControlFlow<Self::Break>
Visits a function parameter.
Sourcefn visit_arg(&mut self, arg: &Arg<'arena, 'src>) -> ControlFlow<Self::Break>
fn visit_arg(&mut self, arg: &Arg<'arena, 'src>) -> ControlFlow<Self::Break>
Visits a call argument.
Sourcefn visit_class_member(
&mut self,
member: &ClassMember<'arena, 'src>,
) -> ControlFlow<Self::Break>
fn visit_class_member( &mut self, member: &ClassMember<'arena, 'src>, ) -> ControlFlow<Self::Break>
Visits a class-like member.
Sourcefn visit_enum_member(
&mut self,
member: &EnumMember<'arena, 'src>,
) -> ControlFlow<Self::Break>
fn visit_enum_member( &mut self, member: &EnumMember<'arena, 'src>, ) -> ControlFlow<Self::Break>
Visits an enum member.
Sourcefn visit_property_hook(
&mut self,
hook: &PropertyHook<'arena, 'src>,
) -> ControlFlow<Self::Break>
fn visit_property_hook( &mut self, hook: &PropertyHook<'arena, 'src>, ) -> ControlFlow<Self::Break>
Visits a property hook (get/set).
Sourcefn visit_type_hint(
&mut self,
type_hint: &TypeHint<'arena, 'src>,
) -> ControlFlow<Self::Break>
fn visit_type_hint( &mut self, type_hint: &TypeHint<'arena, 'src>, ) -> ControlFlow<Self::Break>
Visits a type hint.
Sourcefn visit_attribute(
&mut self,
attribute: &Attribute<'arena, 'src>,
) -> ControlFlow<Self::Break>
fn visit_attribute( &mut self, attribute: &Attribute<'arena, 'src>, ) -> ControlFlow<Self::Break>
Visits an attribute.
Sourcefn visit_catch_clause(
&mut self,
catch: &CatchClause<'arena, 'src>,
) -> ControlFlow<Self::Break>
fn visit_catch_clause( &mut self, catch: &CatchClause<'arena, 'src>, ) -> ControlFlow<Self::Break>
Visits a catch clause.
Sourcefn visit_match_arm(
&mut self,
arm: &MatchArm<'arena, 'src>,
) -> ControlFlow<Self::Break>
fn visit_match_arm( &mut self, arm: &MatchArm<'arena, 'src>, ) -> ControlFlow<Self::Break>
Visits a match arm.
Sourcefn visit_closure_use_var(
&mut self,
_var: &ClosureUseVar<'src>,
) -> ControlFlow<Self::Break>
fn visit_closure_use_var( &mut self, _var: &ClosureUseVar<'src>, ) -> ControlFlow<Self::Break>
Visits a closure use variable.
Sourcefn visit_trait_use(
&mut self,
trait_use: &TraitUseDecl<'arena, 'src>,
) -> ControlFlow<Self::Break>
fn visit_trait_use( &mut self, trait_use: &TraitUseDecl<'arena, 'src>, ) -> ControlFlow<Self::Break>
Visits a use Trait; declaration.
Sourcefn visit_trait_adaptation(
&mut self,
adaptation: &TraitAdaptation<'arena, 'src>,
) -> ControlFlow<Self::Break>
fn visit_trait_adaptation( &mut self, adaptation: &TraitAdaptation<'arena, 'src>, ) -> ControlFlow<Self::Break>
Visits a trait insteadof/as adaptation.
Sourcefn visit_name(&mut self, _name: &Name<'arena, 'src>) -> ControlFlow<Self::Break>
fn visit_name(&mut self, _name: &Name<'arena, 'src>) -> ControlFlow<Self::Break>
Visits a name reference.
Sourcefn visit_comment(
&mut self,
_comment: &Comment<'src>,
) -> ControlFlow<Self::Break>
fn visit_comment( &mut self, _comment: &Comment<'src>, ) -> ControlFlow<Self::Break>
Called for each comment when driven by walk_comments.
Comments live in ParseResult::comments
separately from AST nodes. Use walk_comments to drive this hook.
Dyn Compatibility§
This trait is dyn compatible.
In older versions of Rust, dyn compatibility was called "object safety".