2014-09-12 05:10:30 -05:00
|
|
|
//! AST walker. Each overridden visit method has full control over what
|
|
|
|
//! happens with its node, it can do its own traversal of the node's children,
|
|
|
|
//! call `visit::walk_*` to apply the default traversal algorithm, or prevent
|
|
|
|
//! deeper traversal by doing nothing.
|
2014-06-09 15:12:30 -05:00
|
|
|
//!
|
|
|
|
//! Note: it is an important invariant that the default visitor walks the body
|
|
|
|
//! of a function in "execution order" (more concretely, reverse post-order
|
|
|
|
//! with respect to the CFG implied by the AST), meaning that if AST node A may
|
2019-02-08 07:53:55 -06:00
|
|
|
//! execute before AST node B, then A is visited first. The borrow checker in
|
2014-06-09 15:12:30 -05:00
|
|
|
//! particular relies on this property.
|
|
|
|
//!
|
2014-07-09 16:48:12 -05:00
|
|
|
//! Note: walking an AST before macro expansion is probably a bad idea. For
|
|
|
|
//! instance, a walker looking for item names in a module will miss all of
|
|
|
|
//! those that are created by the expansion of a macro.
|
|
|
|
|
2019-02-06 11:33:01 -06:00
|
|
|
use crate::ast::*;
|
2020-09-27 08:52:51 -05:00
|
|
|
use crate::token;
|
2019-02-06 11:33:01 -06:00
|
|
|
|
2020-04-19 06:00:18 -05:00
|
|
|
use rustc_span::symbol::{Ident, Symbol};
|
2019-12-31 11:15:40 -06:00
|
|
|
use rustc_span::Span;
|
2012-12-23 16:41:37 -06:00
|
|
|
|
2020-01-29 17:18:54 -06:00
|
|
|
#[derive(Copy, Clone, PartialEq)]
|
|
|
|
pub enum AssocCtxt {
|
|
|
|
Trait,
|
|
|
|
Impl,
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Copy, Clone, PartialEq)]
|
|
|
|
pub enum FnCtxt {
|
|
|
|
Free,
|
|
|
|
Foreign,
|
|
|
|
Assoc(AssocCtxt),
|
|
|
|
}
|
|
|
|
|
2018-03-20 17:58:25 -05:00
|
|
|
#[derive(Copy, Clone)]
|
2014-01-09 07:05:33 -06:00
|
|
|
pub enum FnKind<'a> {
|
2020-01-29 17:18:54 -06:00
|
|
|
/// E.g., `fn foo()`, `fn foo(&self)`, or `extern "Abi" fn foo()`.
|
|
|
|
Fn(FnCtxt, Ident, &'a FnSig, &'a Visibility, Option<&'a Block>),
|
2013-03-13 21:25:28 -05:00
|
|
|
|
2019-09-05 21:56:45 -05:00
|
|
|
/// E.g., `|x, y| body`.
|
2020-01-29 17:18:54 -06:00
|
|
|
Closure(&'a FnDecl, &'a Expr),
|
2011-12-29 22:07:55 -06:00
|
|
|
}
|
|
|
|
|
2019-04-18 13:15:43 -05:00
|
|
|
impl<'a> FnKind<'a> {
|
|
|
|
pub fn header(&self) -> Option<&'a FnHeader> {
|
|
|
|
match *self {
|
2020-01-29 17:18:54 -06:00
|
|
|
FnKind::Fn(_, _, sig, _, _) => Some(&sig.header),
|
|
|
|
FnKind::Closure(_, _) => None,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-08-13 19:52:33 -05:00
|
|
|
pub fn ident(&self) -> Option<&Ident> {
|
|
|
|
match self {
|
|
|
|
FnKind::Fn(_, ident, ..) => Some(ident),
|
|
|
|
_ => None,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-01-29 17:18:54 -06:00
|
|
|
pub fn decl(&self) -> &'a FnDecl {
|
|
|
|
match self {
|
|
|
|
FnKind::Fn(_, _, sig, _, _) => &sig.decl,
|
|
|
|
FnKind::Closure(decl, _) => decl,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn ctxt(&self) -> Option<FnCtxt> {
|
|
|
|
match self {
|
|
|
|
FnKind::Fn(ctxt, ..) => Some(*ctxt),
|
|
|
|
FnKind::Closure(..) => None,
|
2019-04-18 13:15:43 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-09-05 21:56:45 -05:00
|
|
|
/// Each method of the `Visitor` trait is a hook to be potentially
|
2019-02-08 07:53:55 -06:00
|
|
|
/// overridden. Each method's default implementation recursively visits
|
2014-05-12 11:58:23 -05:00
|
|
|
/// the substructure of the input via the corresponding `walk` method;
|
2021-02-14 12:14:12 -06:00
|
|
|
/// e.g., the `visit_item` method by default calls `visit::walk_item`.
|
2014-05-12 11:58:23 -05:00
|
|
|
///
|
|
|
|
/// If you want to ensure that your code handles every variant
|
2019-02-08 07:53:55 -06:00
|
|
|
/// explicitly, you need to override each method. (And you also need
|
2014-05-12 11:58:23 -05:00
|
|
|
/// to monitor future changes to `Visitor` in case a new method with a
|
|
|
|
/// new default implementation gets introduced.)
|
2016-12-06 04:26:52 -06:00
|
|
|
pub trait Visitor<'ast>: Sized {
|
2020-04-19 06:00:18 -05:00
|
|
|
fn visit_name(&mut self, _span: Span, _name: Symbol) {
|
2014-11-18 10:39:16 -06:00
|
|
|
// Nothing to do.
|
|
|
|
}
|
2018-03-18 19:54:56 -05:00
|
|
|
fn visit_ident(&mut self, ident: Ident) {
|
|
|
|
walk_ident(self, ident);
|
2013-11-22 06:24:49 -06:00
|
|
|
}
|
2019-12-22 16:42:04 -06:00
|
|
|
fn visit_foreign_item(&mut self, i: &'ast ForeignItem) {
|
|
|
|
walk_foreign_item(self, i)
|
|
|
|
}
|
|
|
|
fn visit_global_asm(&mut self, ga: &'ast GlobalAsm) {
|
|
|
|
walk_global_asm(self, ga)
|
|
|
|
}
|
|
|
|
fn visit_item(&mut self, i: &'ast Item) {
|
|
|
|
walk_item(self, i)
|
|
|
|
}
|
|
|
|
fn visit_local(&mut self, l: &'ast Local) {
|
|
|
|
walk_local(self, l)
|
|
|
|
}
|
|
|
|
fn visit_block(&mut self, b: &'ast Block) {
|
|
|
|
walk_block(self, b)
|
|
|
|
}
|
|
|
|
fn visit_stmt(&mut self, s: &'ast Stmt) {
|
|
|
|
walk_stmt(self, s)
|
|
|
|
}
|
|
|
|
fn visit_param(&mut self, param: &'ast Param) {
|
|
|
|
walk_param(self, param)
|
|
|
|
}
|
|
|
|
fn visit_arm(&mut self, a: &'ast Arm) {
|
|
|
|
walk_arm(self, a)
|
|
|
|
}
|
|
|
|
fn visit_pat(&mut self, p: &'ast Pat) {
|
|
|
|
walk_pat(self, p)
|
|
|
|
}
|
|
|
|
fn visit_anon_const(&mut self, c: &'ast AnonConst) {
|
|
|
|
walk_anon_const(self, c)
|
|
|
|
}
|
|
|
|
fn visit_expr(&mut self, ex: &'ast Expr) {
|
|
|
|
walk_expr(self, ex)
|
|
|
|
}
|
|
|
|
fn visit_expr_post(&mut self, _ex: &'ast Expr) {}
|
|
|
|
fn visit_ty(&mut self, t: &'ast Ty) {
|
|
|
|
walk_ty(self, t)
|
|
|
|
}
|
2018-05-27 14:07:09 -05:00
|
|
|
fn visit_generic_param(&mut self, param: &'ast GenericParam) {
|
2018-05-25 18:27:54 -05:00
|
|
|
walk_generic_param(self, param)
|
|
|
|
}
|
2019-12-22 16:42:04 -06:00
|
|
|
fn visit_generics(&mut self, g: &'ast Generics) {
|
|
|
|
walk_generics(self, g)
|
|
|
|
}
|
2017-01-25 14:01:11 -06:00
|
|
|
fn visit_where_predicate(&mut self, p: &'ast WherePredicate) {
|
|
|
|
walk_where_predicate(self, p)
|
|
|
|
}
|
2020-01-29 17:18:54 -06:00
|
|
|
fn visit_fn(&mut self, fk: FnKind<'ast>, s: Span, _: NodeId) {
|
|
|
|
walk_fn(self, fk, s)
|
2019-12-22 16:42:04 -06:00
|
|
|
}
|
2020-01-29 17:18:54 -06:00
|
|
|
fn visit_assoc_item(&mut self, i: &'ast AssocItem, ctxt: AssocCtxt) {
|
|
|
|
walk_assoc_item(self, i, ctxt)
|
2019-12-22 16:42:04 -06:00
|
|
|
}
|
|
|
|
fn visit_trait_ref(&mut self, t: &'ast TraitRef) {
|
|
|
|
walk_trait_ref(self, t)
|
|
|
|
}
|
2018-06-14 06:08:58 -05:00
|
|
|
fn visit_param_bound(&mut self, bounds: &'ast GenericBound) {
|
2018-05-28 09:23:16 -05:00
|
|
|
walk_param_bound(self, bounds)
|
2014-11-15 15:55:27 -06:00
|
|
|
}
|
2016-12-06 04:26:52 -06:00
|
|
|
fn visit_poly_trait_ref(&mut self, t: &'ast PolyTraitRef, m: &'ast TraitBoundModifier) {
|
2014-12-24 00:38:10 -06:00
|
|
|
walk_poly_trait_ref(self, t, m)
|
2014-11-07 05:53:45 -06:00
|
|
|
}
|
2019-08-24 11:54:40 -05:00
|
|
|
fn visit_variant_data(&mut self, s: &'ast VariantData) {
|
2014-09-12 05:10:30 -05:00
|
|
|
walk_struct_def(self, s)
|
|
|
|
}
|
2019-12-22 16:42:04 -06:00
|
|
|
fn visit_struct_field(&mut self, s: &'ast StructField) {
|
|
|
|
walk_struct_field(self, s)
|
|
|
|
}
|
|
|
|
fn visit_enum_def(
|
|
|
|
&mut self,
|
|
|
|
enum_definition: &'ast EnumDef,
|
|
|
|
generics: &'ast Generics,
|
|
|
|
item_id: NodeId,
|
|
|
|
_: Span,
|
|
|
|
) {
|
2015-10-02 08:14:20 -05:00
|
|
|
walk_enum_def(self, enum_definition, generics, item_id)
|
|
|
|
}
|
2019-08-24 11:54:40 -05:00
|
|
|
fn visit_variant(&mut self, v: &'ast Variant) {
|
|
|
|
walk_variant(self, v)
|
2015-06-22 21:55:57 -05:00
|
|
|
}
|
2018-01-15 16:44:32 -06:00
|
|
|
fn visit_label(&mut self, label: &'ast Label) {
|
|
|
|
walk_label(self, label)
|
|
|
|
}
|
2016-12-06 04:26:52 -06:00
|
|
|
fn visit_lifetime(&mut self, lifetime: &'ast Lifetime) {
|
2015-09-28 06:26:26 -05:00
|
|
|
walk_lifetime(self, lifetime)
|
2013-10-28 16:37:10 -05:00
|
|
|
}
|
2020-11-03 11:34:57 -06:00
|
|
|
fn visit_mac_call(&mut self, mac: &'ast MacCall) {
|
2020-11-03 11:26:17 -06:00
|
|
|
walk_mac(self, mac)
|
2013-10-28 16:37:10 -05:00
|
|
|
}
|
2017-03-17 16:58:48 -05:00
|
|
|
fn visit_mac_def(&mut self, _mac: &'ast MacroDef, _id: NodeId) {
|
2017-05-12 01:05:52 -05:00
|
|
|
// Nothing to do
|
|
|
|
}
|
2016-12-06 04:26:52 -06:00
|
|
|
fn visit_path(&mut self, path: &'ast Path, _id: NodeId) {
|
2014-09-12 05:10:30 -05:00
|
|
|
walk_path(self, path)
|
2013-12-08 13:25:35 -06:00
|
|
|
}
|
2017-09-26 16:04:00 -05:00
|
|
|
fn visit_use_tree(&mut self, use_tree: &'ast UseTree, id: NodeId, _nested: bool) {
|
|
|
|
walk_use_tree(self, use_tree, id)
|
2015-09-12 08:10:12 -05:00
|
|
|
}
|
2016-12-06 04:26:52 -06:00
|
|
|
fn visit_path_segment(&mut self, path_span: Span, path_segment: &'ast PathSegment) {
|
2014-11-15 15:55:27 -06:00
|
|
|
walk_path_segment(self, path_span, path_segment)
|
|
|
|
}
|
2018-02-13 05:32:37 -06:00
|
|
|
fn visit_generic_args(&mut self, path_span: Span, generic_args: &'ast GenericArgs) {
|
|
|
|
walk_generic_args(self, path_span, generic_args)
|
|
|
|
}
|
2018-05-27 14:07:09 -05:00
|
|
|
fn visit_generic_arg(&mut self, generic_arg: &'ast GenericArg) {
|
2020-10-09 17:20:06 -05:00
|
|
|
walk_generic_arg(self, generic_arg)
|
2014-11-15 15:55:27 -06:00
|
|
|
}
|
2019-02-28 16:43:53 -06:00
|
|
|
fn visit_assoc_ty_constraint(&mut self, constraint: &'ast AssocTyConstraint) {
|
|
|
|
walk_assoc_ty_constraint(self, constraint)
|
2014-12-28 09:07:21 -06:00
|
|
|
}
|
2017-10-23 03:22:28 -05:00
|
|
|
fn visit_attribute(&mut self, attr: &'ast Attribute) {
|
|
|
|
walk_attribute(self, attr)
|
|
|
|
}
|
2016-12-06 04:26:52 -06:00
|
|
|
fn visit_vis(&mut self, vis: &'ast Visibility) {
|
2016-03-31 14:10:38 -05:00
|
|
|
walk_vis(self, vis)
|
|
|
|
}
|
2020-02-14 21:10:59 -06:00
|
|
|
fn visit_fn_ret_ty(&mut self, ret_ty: &'ast FnRetTy) {
|
2016-08-01 07:15:54 -05:00
|
|
|
walk_fn_ret_ty(self, ret_ty)
|
|
|
|
}
|
2019-02-23 12:39:27 -06:00
|
|
|
fn visit_fn_header(&mut self, _header: &'ast FnHeader) {
|
|
|
|
// Nothing to do
|
|
|
|
}
|
2019-08-24 11:54:40 -05:00
|
|
|
fn visit_field(&mut self, f: &'ast Field) {
|
|
|
|
walk_field(self, f)
|
|
|
|
}
|
|
|
|
fn visit_field_pattern(&mut self, fp: &'ast FieldPat) {
|
|
|
|
walk_field_pattern(self, fp)
|
|
|
|
}
|
2013-08-08 07:23:25 -05:00
|
|
|
}
|
|
|
|
|
2015-09-28 06:26:26 -05:00
|
|
|
#[macro_export]
|
|
|
|
macro_rules! walk_list {
|
2015-09-28 16:23:54 -05:00
|
|
|
($visitor: expr, $method: ident, $list: expr) => {
|
2015-09-28 06:26:26 -05:00
|
|
|
for elem in $list {
|
|
|
|
$visitor.$method(elem)
|
|
|
|
}
|
2015-10-16 09:17:14 -05:00
|
|
|
};
|
|
|
|
($visitor: expr, $method: ident, $list: expr, $($extra_args: expr),*) => {
|
|
|
|
for elem in $list {
|
|
|
|
$visitor.$method(elem, $($extra_args,)*)
|
|
|
|
}
|
2014-06-08 01:02:48 -05:00
|
|
|
}
|
2013-07-19 20:42:11 -05:00
|
|
|
}
|
|
|
|
|
2018-03-18 19:54:56 -05:00
|
|
|
pub fn walk_ident<'a, V: Visitor<'a>>(visitor: &mut V, ident: Ident) {
|
|
|
|
visitor.visit_name(ident.span, ident.name);
|
2014-11-18 10:39:16 -06:00
|
|
|
}
|
|
|
|
|
2016-12-06 04:26:52 -06:00
|
|
|
pub fn walk_crate<'a, V: Visitor<'a>>(visitor: &mut V, krate: &'a Crate) {
|
2021-02-14 12:14:12 -06:00
|
|
|
walk_list!(visitor, visit_item, &krate.items);
|
2015-09-28 06:26:26 -05:00
|
|
|
walk_list!(visitor, visit_attribute, &krate.attrs);
|
|
|
|
}
|
|
|
|
|
2016-12-06 04:26:52 -06:00
|
|
|
pub fn walk_local<'a, V: Visitor<'a>>(visitor: &mut V, local: &'a Local) {
|
2016-06-17 23:01:57 -05:00
|
|
|
for attr in local.attrs.iter() {
|
2016-06-10 05:31:45 -05:00
|
|
|
visitor.visit_attribute(attr);
|
|
|
|
}
|
2015-09-28 06:26:26 -05:00
|
|
|
visitor.visit_pat(&local.pat);
|
|
|
|
walk_list!(visitor, visit_ty, &local.ty);
|
|
|
|
walk_list!(visitor, visit_expr, &local.init);
|
2014-12-13 04:34:34 -06:00
|
|
|
}
|
|
|
|
|
2018-01-15 16:44:32 -06:00
|
|
|
pub fn walk_label<'a, V: Visitor<'a>>(visitor: &mut V, label: &'a Label) {
|
2018-03-18 19:54:56 -05:00
|
|
|
visitor.visit_ident(label.ident);
|
2018-01-15 16:44:32 -06:00
|
|
|
}
|
|
|
|
|
2016-12-06 04:26:52 -06:00
|
|
|
pub fn walk_lifetime<'a, V: Visitor<'a>>(visitor: &mut V, lifetime: &'a Lifetime) {
|
2018-03-18 19:54:56 -05:00
|
|
|
visitor.visit_ident(lifetime.ident);
|
2015-09-28 06:26:26 -05:00
|
|
|
}
|
|
|
|
|
2019-12-22 16:42:04 -06:00
|
|
|
pub fn walk_poly_trait_ref<'a, V>(
|
|
|
|
visitor: &mut V,
|
|
|
|
trait_ref: &'a PolyTraitRef,
|
|
|
|
_: &TraitBoundModifier,
|
|
|
|
) where
|
|
|
|
V: Visitor<'a>,
|
2014-11-07 05:53:45 -06:00
|
|
|
{
|
2017-10-16 14:07:26 -05:00
|
|
|
walk_list!(visitor, visit_generic_param, &trait_ref.bound_generic_params);
|
2014-11-07 05:53:45 -06:00
|
|
|
visitor.visit_trait_ref(&trait_ref.trait_ref);
|
|
|
|
}
|
|
|
|
|
2016-12-06 04:26:52 -06:00
|
|
|
pub fn walk_trait_ref<'a, V: Visitor<'a>>(visitor: &mut V, trait_ref: &'a TraitRef) {
|
2014-09-12 05:10:30 -05:00
|
|
|
visitor.visit_path(&trait_ref.path, trait_ref.ref_id)
|
2013-07-19 20:42:11 -05:00
|
|
|
}
|
|
|
|
|
2016-12-06 04:26:52 -06:00
|
|
|
pub fn walk_item<'a, V: Visitor<'a>>(visitor: &mut V, item: &'a Item) {
|
2016-04-10 18:10:46 -05:00
|
|
|
visitor.visit_vis(&item.vis);
|
2018-03-18 19:54:56 -05:00
|
|
|
visitor.visit_ident(item.ident);
|
2019-09-26 11:51:36 -05:00
|
|
|
match item.kind {
|
2018-03-09 09:51:48 -06:00
|
|
|
ItemKind::ExternCrate(orig_name) => {
|
|
|
|
if let Some(orig_name) = orig_name {
|
|
|
|
visitor.visit_name(item.span, orig_name);
|
2018-01-15 16:44:32 -06:00
|
|
|
}
|
2015-09-28 06:26:26 -05:00
|
|
|
}
|
2019-12-22 16:42:04 -06:00
|
|
|
ItemKind::Use(ref use_tree) => visitor.visit_use_tree(use_tree, item.id, false),
|
2020-02-23 03:24:30 -06:00
|
|
|
ItemKind::Static(ref typ, _, ref expr) | ItemKind::Const(_, ref typ, ref expr) => {
|
2015-09-28 06:26:26 -05:00
|
|
|
visitor.visit_ty(typ);
|
2020-02-14 07:21:02 -06:00
|
|
|
walk_list!(visitor, visit_expr, expr);
|
2013-07-19 20:42:11 -05:00
|
|
|
}
|
2021-01-29 01:31:08 -06:00
|
|
|
ItemKind::Fn(box FnKind(_, ref sig, ref generics, ref body)) => {
|
2017-10-10 16:56:24 -05:00
|
|
|
visitor.visit_generics(generics);
|
2020-01-29 17:18:54 -06:00
|
|
|
let kind = FnKind::Fn(FnCtxt::Free, item.ident, sig, &item.vis, body.as_deref());
|
|
|
|
visitor.visit_fn(kind, item.span, item.id)
|
2019-12-22 16:42:04 -06:00
|
|
|
}
|
2021-02-16 15:56:07 -06:00
|
|
|
ItemKind::Mod(_unsafety, ref mod_kind) => match mod_kind {
|
|
|
|
ModKind::Loaded(items, _inline, _inner_span) => {
|
|
|
|
walk_list!(visitor, visit_item, items)
|
|
|
|
}
|
|
|
|
ModKind::Unloaded => {}
|
|
|
|
},
|
2016-02-09 04:36:51 -06:00
|
|
|
ItemKind::ForeignMod(ref foreign_module) => {
|
2015-09-28 06:26:26 -05:00
|
|
|
walk_list!(visitor, visit_foreign_item, &foreign_module.items);
|
2011-12-20 09:33:55 -06:00
|
|
|
}
|
2017-03-15 21:27:40 -05:00
|
|
|
ItemKind::GlobalAsm(ref ga) => visitor.visit_global_asm(ga),
|
2021-01-29 01:31:08 -06:00
|
|
|
ItemKind::TyAlias(box TyAliasKind(_, ref generics, ref bounds, ref ty)) => {
|
2020-02-21 16:00:27 -06:00
|
|
|
visitor.visit_generics(generics);
|
|
|
|
walk_list!(visitor, visit_param_bound, bounds);
|
|
|
|
walk_list!(visitor, visit_ty, ty);
|
2013-07-19 20:42:11 -05:00
|
|
|
}
|
2019-03-28 19:28:07 -05:00
|
|
|
ItemKind::Enum(ref enum_definition, ref generics) => {
|
|
|
|
visitor.visit_generics(generics);
|
|
|
|
visitor.visit_enum_def(enum_definition, generics, item.id, item.span)
|
2013-07-19 20:42:11 -05:00
|
|
|
}
|
2021-01-29 01:31:08 -06:00
|
|
|
ItemKind::Impl(box ImplKind {
|
2020-01-13 22:30:20 -06:00
|
|
|
unsafety: _,
|
|
|
|
polarity: _,
|
|
|
|
defaultness: _,
|
2020-01-13 22:30:23 -06:00
|
|
|
constness: _,
|
2020-01-13 22:30:20 -06:00
|
|
|
ref generics,
|
|
|
|
ref of_trait,
|
|
|
|
ref self_ty,
|
|
|
|
ref items,
|
2021-01-29 01:31:08 -06:00
|
|
|
}) => {
|
2019-03-28 19:28:07 -05:00
|
|
|
visitor.visit_generics(generics);
|
2020-01-13 22:30:20 -06:00
|
|
|
walk_list!(visitor, visit_trait_ref, of_trait);
|
|
|
|
visitor.visit_ty(self_ty);
|
2020-01-29 17:18:54 -06:00
|
|
|
walk_list!(visitor, visit_assoc_item, items, AssocCtxt::Impl);
|
2013-02-18 23:25:44 -06:00
|
|
|
}
|
2019-12-22 16:42:04 -06:00
|
|
|
ItemKind::Struct(ref struct_definition, ref generics)
|
|
|
|
| ItemKind::Union(ref struct_definition, ref generics) => {
|
2014-09-12 05:10:30 -05:00
|
|
|
visitor.visit_generics(generics);
|
2019-08-24 11:54:40 -05:00
|
|
|
visitor.visit_variant_data(struct_definition);
|
2013-07-19 20:42:11 -05:00
|
|
|
}
|
2021-01-29 01:31:08 -06:00
|
|
|
ItemKind::Trait(box TraitKind(.., ref generics, ref bounds, ref items)) => {
|
2014-09-12 05:10:30 -05:00
|
|
|
visitor.visit_generics(generics);
|
2018-05-28 09:23:16 -05:00
|
|
|
walk_list!(visitor, visit_param_bound, bounds);
|
2020-01-29 17:18:54 -06:00
|
|
|
walk_list!(visitor, visit_assoc_item, items, AssocCtxt::Trait);
|
2013-02-18 23:25:44 -06:00
|
|
|
}
|
2017-10-02 07:27:45 -05:00
|
|
|
ItemKind::TraitAlias(ref generics, ref bounds) => {
|
|
|
|
visitor.visit_generics(generics);
|
2018-05-28 09:23:16 -05:00
|
|
|
walk_list!(visitor, visit_param_bound, bounds);
|
2017-10-02 07:27:45 -05:00
|
|
|
}
|
2020-11-03 11:34:57 -06:00
|
|
|
ItemKind::MacCall(ref mac) => visitor.visit_mac_call(mac),
|
2017-05-12 01:05:52 -05:00
|
|
|
ItemKind::MacroDef(ref ts) => visitor.visit_mac_def(ts, item.id),
|
2014-06-08 01:02:48 -05:00
|
|
|
}
|
2015-09-28 06:26:26 -05:00
|
|
|
walk_list!(visitor, visit_attribute, &item.attrs);
|
2011-06-08 15:48:19 -05:00
|
|
|
}
|
|
|
|
|
2019-09-05 21:56:45 -05:00
|
|
|
pub fn walk_enum_def<'a, V: Visitor<'a>>(
|
|
|
|
visitor: &mut V,
|
|
|
|
enum_definition: &'a EnumDef,
|
|
|
|
_: &'a Generics,
|
|
|
|
_: NodeId,
|
|
|
|
) {
|
2019-08-24 11:54:40 -05:00
|
|
|
walk_list!(visitor, visit_variant, &enum_definition.variants);
|
2013-11-11 22:17:47 -06:00
|
|
|
}
|
|
|
|
|
2019-08-24 11:54:40 -05:00
|
|
|
pub fn walk_variant<'a, V: Visitor<'a>>(visitor: &mut V, variant: &'a Variant)
|
2019-12-22 16:42:04 -06:00
|
|
|
where
|
|
|
|
V: Visitor<'a>,
|
2016-06-12 02:51:31 -05:00
|
|
|
{
|
2019-08-13 19:40:21 -05:00
|
|
|
visitor.visit_ident(variant.ident);
|
2019-11-07 04:26:36 -06:00
|
|
|
visitor.visit_vis(&variant.vis);
|
2019-08-24 11:54:40 -05:00
|
|
|
visitor.visit_variant_data(&variant.data);
|
2019-08-13 19:40:21 -05:00
|
|
|
walk_list!(visitor, visit_anon_const, &variant.disr_expr);
|
|
|
|
walk_list!(visitor, visit_attribute, &variant.attrs);
|
2015-01-02 05:55:31 -06:00
|
|
|
}
|
|
|
|
|
2019-08-24 11:54:40 -05:00
|
|
|
pub fn walk_field<'a, V: Visitor<'a>>(visitor: &mut V, f: &'a Field) {
|
|
|
|
visitor.visit_expr(&f.expr);
|
|
|
|
visitor.visit_ident(f.ident);
|
|
|
|
walk_list!(visitor, visit_attribute, f.attrs.iter());
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn walk_field_pattern<'a, V: Visitor<'a>>(visitor: &mut V, fp: &'a FieldPat) {
|
|
|
|
visitor.visit_ident(fp.ident);
|
|
|
|
visitor.visit_pat(&fp.pat);
|
|
|
|
walk_list!(visitor, visit_attribute, fp.attrs.iter());
|
|
|
|
}
|
|
|
|
|
2016-12-06 04:26:52 -06:00
|
|
|
pub fn walk_ty<'a, V: Visitor<'a>>(visitor: &mut V, typ: &'a Ty) {
|
2019-09-26 11:25:31 -05:00
|
|
|
match typ.kind {
|
2019-12-22 16:42:04 -06:00
|
|
|
TyKind::Slice(ref ty) | TyKind::Paren(ref ty) => visitor.visit_ty(ty),
|
|
|
|
TyKind::Ptr(ref mutable_type) => visitor.visit_ty(&mutable_type.ty),
|
2016-02-08 09:53:21 -06:00
|
|
|
TyKind::Rptr(ref opt_lifetime, ref mutable_type) => {
|
2015-09-28 06:26:26 -05:00
|
|
|
walk_list!(visitor, visit_lifetime, opt_lifetime);
|
|
|
|
visitor.visit_ty(&mutable_type.ty)
|
2013-07-19 20:42:11 -05:00
|
|
|
}
|
2016-02-08 09:53:21 -06:00
|
|
|
TyKind::Tup(ref tuple_element_types) => {
|
2015-09-28 06:26:26 -05:00
|
|
|
walk_list!(visitor, visit_ty, tuple_element_types);
|
2013-07-19 20:42:11 -05:00
|
|
|
}
|
2016-02-08 09:53:21 -06:00
|
|
|
TyKind::BareFn(ref function_declaration) => {
|
2017-10-16 14:07:26 -05:00
|
|
|
walk_list!(visitor, visit_generic_param, &function_declaration.generic_params);
|
2018-05-30 06:36:53 -05:00
|
|
|
walk_fn_decl(visitor, &function_declaration.decl);
|
2013-07-19 20:42:11 -05:00
|
|
|
}
|
2016-02-08 09:53:21 -06:00
|
|
|
TyKind::Path(ref maybe_qself, ref path) => {
|
2015-09-29 03:33:25 -05:00
|
|
|
if let Some(ref qself) = *maybe_qself {
|
2015-02-17 11:29:13 -06:00
|
|
|
visitor.visit_ty(&qself.ty);
|
|
|
|
}
|
2015-01-29 13:18:17 -06:00
|
|
|
visitor.visit_path(path, typ.id);
|
2014-11-20 14:08:48 -06:00
|
|
|
}
|
2018-05-17 13:28:50 -05:00
|
|
|
TyKind::Array(ref ty, ref length) => {
|
2015-09-28 06:26:26 -05:00
|
|
|
visitor.visit_ty(ty);
|
2018-05-17 13:28:50 -05:00
|
|
|
visitor.visit_anon_const(length)
|
2013-07-19 20:42:11 -05:00
|
|
|
}
|
2019-12-22 16:42:04 -06:00
|
|
|
TyKind::TraitObject(ref bounds, ..) | TyKind::ImplTrait(_, ref bounds) => {
|
2018-05-28 09:23:16 -05:00
|
|
|
walk_list!(visitor, visit_param_bound, bounds);
|
2016-07-31 20:25:32 -05:00
|
|
|
}
|
2019-12-22 16:42:04 -06:00
|
|
|
TyKind::Typeof(ref expression) => visitor.visit_anon_const(expression),
|
2017-03-28 20:56:29 -05:00
|
|
|
TyKind::Infer | TyKind::ImplicitSelf | TyKind::Err => {}
|
2020-11-03 11:34:57 -06:00
|
|
|
TyKind::MacCall(ref mac) => visitor.visit_mac_call(mac),
|
2019-12-22 16:42:04 -06:00
|
|
|
TyKind::Never | TyKind::CVarArgs => {}
|
2011-06-08 15:48:19 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-12-06 04:26:52 -06:00
|
|
|
pub fn walk_path<'a, V: Visitor<'a>>(visitor: &mut V, path: &'a Path) {
|
2015-01-31 11:20:46 -06:00
|
|
|
for segment in &path.segments {
|
2014-11-15 15:55:27 -06:00
|
|
|
visitor.visit_path_segment(path.span, segment);
|
|
|
|
}
|
|
|
|
}
|
2013-11-22 06:24:49 -06:00
|
|
|
|
2019-12-22 16:42:04 -06:00
|
|
|
pub fn walk_use_tree<'a, V: Visitor<'a>>(visitor: &mut V, use_tree: &'a UseTree, id: NodeId) {
|
2017-09-26 16:04:00 -05:00
|
|
|
visitor.visit_path(&use_tree.prefix, id);
|
|
|
|
match use_tree.kind {
|
2018-06-13 11:44:06 -05:00
|
|
|
UseTreeKind::Simple(rename, ..) => {
|
2019-09-05 21:56:45 -05:00
|
|
|
// The extra IDs are handled during HIR lowering.
|
2018-03-09 09:58:44 -06:00
|
|
|
if let Some(rename) = rename {
|
2018-03-18 19:54:56 -05:00
|
|
|
visitor.visit_ident(rename);
|
2018-03-09 09:58:44 -06:00
|
|
|
}
|
2017-09-26 16:04:00 -05:00
|
|
|
}
|
2019-12-22 16:42:04 -06:00
|
|
|
UseTreeKind::Glob => {}
|
2017-09-26 16:04:00 -05:00
|
|
|
UseTreeKind::Nested(ref use_trees) => {
|
|
|
|
for &(ref nested_tree, nested_id) in use_trees {
|
|
|
|
visitor.visit_use_tree(nested_tree, nested_id, true);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2015-09-12 08:10:12 -05:00
|
|
|
}
|
|
|
|
|
2019-12-22 16:42:04 -06:00
|
|
|
pub fn walk_path_segment<'a, V: Visitor<'a>>(
|
|
|
|
visitor: &mut V,
|
|
|
|
path_span: Span,
|
|
|
|
segment: &'a PathSegment,
|
|
|
|
) {
|
2018-03-18 19:54:56 -05:00
|
|
|
visitor.visit_ident(segment.ident);
|
2018-02-23 11:48:54 -06:00
|
|
|
if let Some(ref args) = segment.args {
|
|
|
|
visitor.visit_generic_args(path_span, args);
|
2016-12-10 00:45:58 -06:00
|
|
|
}
|
2014-11-15 15:55:27 -06:00
|
|
|
}
|
|
|
|
|
2019-12-22 16:42:04 -06:00
|
|
|
pub fn walk_generic_args<'a, V>(visitor: &mut V, _path_span: Span, generic_args: &'a GenericArgs)
|
|
|
|
where
|
|
|
|
V: Visitor<'a>,
|
2016-06-12 02:51:31 -05:00
|
|
|
{
|
2018-02-13 05:32:37 -06:00
|
|
|
match *generic_args {
|
|
|
|
GenericArgs::AngleBracketed(ref data) => {
|
2020-03-21 22:40:05 -05:00
|
|
|
for arg in &data.args {
|
|
|
|
match arg {
|
|
|
|
AngleBracketedArg::Arg(a) => visitor.visit_generic_arg(a),
|
|
|
|
AngleBracketedArg::Constraint(c) => visitor.visit_assoc_ty_constraint(c),
|
|
|
|
}
|
|
|
|
}
|
2014-11-15 15:55:27 -06:00
|
|
|
}
|
2018-02-13 05:32:37 -06:00
|
|
|
GenericArgs::Parenthesized(ref data) => {
|
2015-09-28 06:26:26 -05:00
|
|
|
walk_list!(visitor, visit_ty, &data.inputs);
|
2019-12-01 09:00:08 -06:00
|
|
|
walk_fn_ret_ty(visitor, &data.output);
|
2013-08-07 11:47:28 -05:00
|
|
|
}
|
2013-07-19 20:42:11 -05:00
|
|
|
}
|
2011-12-13 06:19:56 -06:00
|
|
|
}
|
|
|
|
|
2020-10-09 17:20:06 -05:00
|
|
|
pub fn walk_generic_arg<'a, V>(visitor: &mut V, generic_arg: &'a GenericArg)
|
|
|
|
where
|
|
|
|
V: Visitor<'a>,
|
|
|
|
{
|
|
|
|
match generic_arg {
|
|
|
|
GenericArg::Lifetime(lt) => visitor.visit_lifetime(lt),
|
|
|
|
GenericArg::Type(ty) => visitor.visit_ty(ty),
|
|
|
|
GenericArg::Const(ct) => visitor.visit_anon_const(ct),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-12-22 16:42:04 -06:00
|
|
|
pub fn walk_assoc_ty_constraint<'a, V: Visitor<'a>>(
|
|
|
|
visitor: &mut V,
|
|
|
|
constraint: &'a AssocTyConstraint,
|
|
|
|
) {
|
2019-02-28 16:43:53 -06:00
|
|
|
visitor.visit_ident(constraint.ident);
|
2020-11-19 11:28:38 -06:00
|
|
|
if let Some(ref gen_args) = constraint.gen_args {
|
|
|
|
visitor.visit_generic_args(gen_args.span(), gen_args);
|
|
|
|
}
|
2019-02-28 16:43:53 -06:00
|
|
|
match constraint.kind {
|
|
|
|
AssocTyConstraintKind::Equality { ref ty } => {
|
|
|
|
visitor.visit_ty(ty);
|
|
|
|
}
|
|
|
|
AssocTyConstraintKind::Bound { ref bounds } => {
|
|
|
|
walk_list!(visitor, visit_param_bound, bounds);
|
|
|
|
}
|
|
|
|
}
|
2014-12-28 09:07:21 -06:00
|
|
|
}
|
|
|
|
|
2016-12-06 04:26:52 -06:00
|
|
|
pub fn walk_pat<'a, V: Visitor<'a>>(visitor: &mut V, pattern: &'a Pat) {
|
2019-09-26 10:18:31 -05:00
|
|
|
match pattern.kind {
|
2019-07-09 02:25:18 -05:00
|
|
|
PatKind::TupleStruct(ref path, ref elems) => {
|
2014-09-12 05:10:30 -05:00
|
|
|
visitor.visit_path(path, pattern.id);
|
2019-07-09 02:25:18 -05:00
|
|
|
walk_list!(visitor, visit_pat, elems);
|
2012-08-06 19:01:14 -05:00
|
|
|
}
|
2016-06-11 10:47:47 -05:00
|
|
|
PatKind::Path(ref opt_qself, ref path) => {
|
|
|
|
if let Some(ref qself) = *opt_qself {
|
|
|
|
visitor.visit_ty(&qself.ty);
|
|
|
|
}
|
2015-03-25 11:53:28 -05:00
|
|
|
visitor.visit_path(path, pattern.id)
|
|
|
|
}
|
2016-02-11 12:16:33 -06:00
|
|
|
PatKind::Struct(ref path, ref fields, _) => {
|
2014-09-12 05:10:30 -05:00
|
|
|
visitor.visit_path(path, pattern.id);
|
2019-08-24 11:54:40 -05:00
|
|
|
walk_list!(visitor, visit_field_pattern, fields);
|
2013-02-18 00:20:36 -06:00
|
|
|
}
|
2019-12-22 16:42:04 -06:00
|
|
|
PatKind::Box(ref subpattern)
|
|
|
|
| PatKind::Ref(ref subpattern, _)
|
|
|
|
| PatKind::Paren(ref subpattern) => visitor.visit_pat(subpattern),
|
2018-03-18 08:47:09 -05:00
|
|
|
PatKind::Ident(_, ident, ref optional_subpattern) => {
|
2018-03-18 19:54:56 -05:00
|
|
|
visitor.visit_ident(ident);
|
2015-09-28 06:26:26 -05:00
|
|
|
walk_list!(visitor, visit_pat, optional_subpattern);
|
2012-12-08 14:22:43 -06:00
|
|
|
}
|
2016-02-11 12:16:33 -06:00
|
|
|
PatKind::Lit(ref expression) => visitor.visit_expr(expression),
|
2017-01-10 15:13:53 -06:00
|
|
|
PatKind::Range(ref lower_bound, ref upper_bound, _) => {
|
2019-12-11 03:04:34 -06:00
|
|
|
walk_list!(visitor, visit_expr, lower_bound);
|
|
|
|
walk_list!(visitor, visit_expr, upper_bound);
|
2013-02-18 00:20:36 -06:00
|
|
|
}
|
2019-12-22 16:42:04 -06:00
|
|
|
PatKind::Wild | PatKind::Rest => {}
|
|
|
|
PatKind::Tuple(ref elems) | PatKind::Slice(ref elems) | PatKind::Or(ref elems) => {
|
2019-07-09 02:25:18 -05:00
|
|
|
walk_list!(visitor, visit_pat, elems);
|
2012-12-08 14:22:43 -06:00
|
|
|
}
|
2020-11-03 11:34:57 -06:00
|
|
|
PatKind::MacCall(ref mac) => visitor.visit_mac_call(mac),
|
2011-06-08 15:48:19 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-01-29 17:18:54 -06:00
|
|
|
pub fn walk_foreign_item<'a, V: Visitor<'a>>(visitor: &mut V, item: &'a ForeignItem) {
|
2020-02-29 06:51:08 -06:00
|
|
|
let Item { id, span, ident, ref vis, ref attrs, ref kind, tokens: _ } = *item;
|
|
|
|
visitor.visit_vis(vis);
|
|
|
|
visitor.visit_ident(ident);
|
|
|
|
walk_list!(visitor, visit_attribute, attrs);
|
|
|
|
match kind {
|
|
|
|
ForeignItemKind::Static(ty, _, expr) => {
|
|
|
|
visitor.visit_ty(ty);
|
|
|
|
walk_list!(visitor, visit_expr, expr);
|
|
|
|
}
|
2021-01-29 01:31:08 -06:00
|
|
|
ForeignItemKind::Fn(box FnKind(_, sig, generics, body)) => {
|
2020-02-29 06:51:08 -06:00
|
|
|
visitor.visit_generics(generics);
|
|
|
|
let kind = FnKind::Fn(FnCtxt::Foreign, ident, sig, vis, body.as_deref());
|
|
|
|
visitor.visit_fn(kind, span, id);
|
|
|
|
}
|
2021-01-29 01:31:08 -06:00
|
|
|
ForeignItemKind::TyAlias(box TyAliasKind(_, generics, bounds, ty)) => {
|
2020-02-29 06:51:08 -06:00
|
|
|
visitor.visit_generics(generics);
|
|
|
|
walk_list!(visitor, visit_param_bound, bounds);
|
|
|
|
walk_list!(visitor, visit_ty, ty);
|
|
|
|
}
|
2020-02-29 10:32:20 -06:00
|
|
|
ForeignItemKind::MacCall(mac) => {
|
2020-11-03 11:34:57 -06:00
|
|
|
visitor.visit_mac_call(mac);
|
2020-02-29 06:51:08 -06:00
|
|
|
}
|
|
|
|
}
|
2014-11-15 15:55:27 -06:00
|
|
|
}
|
|
|
|
|
2017-03-15 21:27:40 -05:00
|
|
|
pub fn walk_global_asm<'a, V: Visitor<'a>>(_: &mut V, _: &'a GlobalAsm) {
|
|
|
|
// Empty!
|
|
|
|
}
|
|
|
|
|
2018-06-14 06:08:58 -05:00
|
|
|
pub fn walk_param_bound<'a, V: Visitor<'a>>(visitor: &mut V, bound: &'a GenericBound) {
|
2014-11-15 15:55:27 -06:00
|
|
|
match *bound {
|
2018-06-14 06:23:46 -05:00
|
|
|
GenericBound::Trait(ref typ, ref modifier) => visitor.visit_poly_trait_ref(typ, modifier),
|
|
|
|
GenericBound::Outlives(ref lifetime) => visitor.visit_lifetime(lifetime),
|
2012-08-06 20:54:20 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-05-27 14:07:09 -05:00
|
|
|
pub fn walk_generic_param<'a, V: Visitor<'a>>(visitor: &mut V, param: &'a GenericParam) {
|
2018-05-28 07:33:28 -05:00
|
|
|
visitor.visit_ident(param.ident);
|
2018-06-15 04:52:46 -05:00
|
|
|
walk_list!(visitor, visit_attribute, param.attrs.iter());
|
2018-05-31 09:52:17 -05:00
|
|
|
walk_list!(visitor, visit_param_bound, ¶m.bounds);
|
2018-05-26 13:16:21 -05:00
|
|
|
match param.kind {
|
2019-02-28 16:43:53 -06:00
|
|
|
GenericParamKind::Lifetime => (),
|
2018-05-31 09:52:17 -05:00
|
|
|
GenericParamKind::Type { ref default } => walk_list!(visitor, visit_ty, default),
|
2020-12-30 18:58:27 -06:00
|
|
|
GenericParamKind::Const { ref ty, ref default, .. } => {
|
|
|
|
visitor.visit_ty(ty);
|
|
|
|
if let Some(default) = default {
|
|
|
|
visitor.visit_anon_const(default);
|
|
|
|
}
|
|
|
|
}
|
2011-12-28 10:50:12 -06:00
|
|
|
}
|
2017-10-16 14:07:26 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
pub fn walk_generics<'a, V: Visitor<'a>>(visitor: &mut V, generics: &'a Generics) {
|
|
|
|
walk_list!(visitor, visit_generic_param, &generics.params);
|
2017-01-25 14:01:11 -06:00
|
|
|
walk_list!(visitor, visit_where_predicate, &generics.where_clause.predicates);
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn walk_where_predicate<'a, V: Visitor<'a>>(visitor: &mut V, predicate: &'a WherePredicate) {
|
|
|
|
match *predicate {
|
2019-12-22 16:42:04 -06:00
|
|
|
WherePredicate::BoundPredicate(WhereBoundPredicate {
|
|
|
|
ref bounded_ty,
|
|
|
|
ref bounds,
|
|
|
|
ref bound_generic_params,
|
|
|
|
..
|
|
|
|
}) => {
|
2017-01-25 14:01:11 -06:00
|
|
|
visitor.visit_ty(bounded_ty);
|
2018-05-28 09:23:16 -05:00
|
|
|
walk_list!(visitor, visit_param_bound, bounds);
|
2017-10-16 14:07:26 -05:00
|
|
|
walk_list!(visitor, visit_generic_param, bound_generic_params);
|
2017-01-25 14:01:11 -06:00
|
|
|
}
|
2019-12-22 16:42:04 -06:00
|
|
|
WherePredicate::RegionPredicate(WhereRegionPredicate {
|
|
|
|
ref lifetime, ref bounds, ..
|
|
|
|
}) => {
|
2017-01-25 14:01:11 -06:00
|
|
|
visitor.visit_lifetime(lifetime);
|
2018-05-28 09:23:16 -05:00
|
|
|
walk_list!(visitor, visit_param_bound, bounds);
|
2017-01-25 14:01:11 -06:00
|
|
|
}
|
2019-12-22 16:42:04 -06:00
|
|
|
WherePredicate::EqPredicate(WhereEqPredicate { ref lhs_ty, ref rhs_ty, .. }) => {
|
2017-01-25 14:01:11 -06:00
|
|
|
visitor.visit_ty(lhs_ty);
|
|
|
|
visitor.visit_ty(rhs_ty);
|
2014-11-28 22:08:30 -06:00
|
|
|
}
|
2014-08-11 11:32:26 -05:00
|
|
|
}
|
2011-12-28 10:50:12 -06:00
|
|
|
}
|
|
|
|
|
2020-02-14 21:10:59 -06:00
|
|
|
pub fn walk_fn_ret_ty<'a, V: Visitor<'a>>(visitor: &mut V, ret_ty: &'a FnRetTy) {
|
|
|
|
if let FnRetTy::Ty(ref output_ty) = *ret_ty {
|
2015-09-28 16:23:54 -05:00
|
|
|
visitor.visit_ty(output_ty)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-12-06 04:26:52 -06:00
|
|
|
pub fn walk_fn_decl<'a, V: Visitor<'a>>(visitor: &mut V, function_declaration: &'a FnDecl) {
|
2019-08-27 06:24:32 -05:00
|
|
|
for param in &function_declaration.inputs {
|
|
|
|
visitor.visit_param(param);
|
2015-09-28 06:26:26 -05:00
|
|
|
}
|
2019-07-26 17:52:37 -05:00
|
|
|
visitor.visit_fn_ret_ty(&function_declaration.output);
|
2011-06-08 15:48:19 -05:00
|
|
|
}
|
|
|
|
|
2020-01-29 17:18:54 -06:00
|
|
|
pub fn walk_fn<'a, V: Visitor<'a>>(visitor: &mut V, kind: FnKind<'a>, _span: Span) {
|
2016-10-25 18:17:29 -05:00
|
|
|
match kind {
|
2020-01-29 17:18:54 -06:00
|
|
|
FnKind::Fn(_, _, sig, _, body) => {
|
2019-02-23 12:39:27 -06:00
|
|
|
visitor.visit_fn_header(&sig.header);
|
2020-01-29 17:18:54 -06:00
|
|
|
walk_fn_decl(visitor, &sig.decl);
|
|
|
|
walk_list!(visitor, visit_block, body);
|
2016-10-25 18:17:29 -05:00
|
|
|
}
|
2020-01-29 17:18:54 -06:00
|
|
|
FnKind::Closure(decl, body) => {
|
|
|
|
walk_fn_decl(visitor, decl);
|
2016-10-25 18:17:29 -05:00
|
|
|
visitor.visit_expr(body);
|
2013-10-28 16:37:10 -05:00
|
|
|
}
|
|
|
|
}
|
2015-09-28 16:23:54 -05:00
|
|
|
}
|
2013-10-28 16:37:10 -05:00
|
|
|
|
2020-01-29 17:18:54 -06:00
|
|
|
pub fn walk_assoc_item<'a, V: Visitor<'a>>(visitor: &mut V, item: &'a AssocItem, ctxt: AssocCtxt) {
|
2020-02-29 06:51:08 -06:00
|
|
|
let Item { id, span, ident, ref vis, ref attrs, ref kind, tokens: _ } = *item;
|
2020-02-15 11:42:43 -06:00
|
|
|
visitor.visit_vis(vis);
|
|
|
|
visitor.visit_ident(ident);
|
|
|
|
walk_list!(visitor, visit_attribute, attrs);
|
|
|
|
match kind {
|
2020-02-29 06:51:08 -06:00
|
|
|
AssocItemKind::Const(_, ty, expr) => {
|
2015-03-14 13:05:00 -05:00
|
|
|
visitor.visit_ty(ty);
|
2019-11-30 21:12:28 -06:00
|
|
|
walk_list!(visitor, visit_expr, expr);
|
2015-03-14 13:05:00 -05:00
|
|
|
}
|
2021-01-29 01:31:08 -06:00
|
|
|
AssocItemKind::Fn(box FnKind(_, sig, generics, body)) => {
|
2020-02-13 11:03:38 -06:00
|
|
|
visitor.visit_generics(generics);
|
2020-02-29 06:51:08 -06:00
|
|
|
let kind = FnKind::Fn(FnCtxt::Assoc(ctxt), ident, sig, vis, body.as_deref());
|
2020-02-15 11:42:43 -06:00
|
|
|
visitor.visit_fn(kind, span, id);
|
2015-03-10 05:28:44 -05:00
|
|
|
}
|
2021-01-29 01:31:08 -06:00
|
|
|
AssocItemKind::TyAlias(box TyAliasKind(_, generics, bounds, ty)) => {
|
2020-02-13 11:03:38 -06:00
|
|
|
visitor.visit_generics(generics);
|
2019-12-01 03:25:45 -06:00
|
|
|
walk_list!(visitor, visit_param_bound, bounds);
|
|
|
|
walk_list!(visitor, visit_ty, ty);
|
2014-08-05 21:44:21 -05:00
|
|
|
}
|
2020-02-29 10:32:20 -06:00
|
|
|
AssocItemKind::MacCall(mac) => {
|
2020-11-03 11:34:57 -06:00
|
|
|
visitor.visit_mac_call(mac);
|
2015-03-11 16:38:58 -05:00
|
|
|
}
|
2012-07-10 15:44:20 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-12-06 04:26:52 -06:00
|
|
|
pub fn walk_struct_def<'a, V: Visitor<'a>>(visitor: &mut V, struct_definition: &'a VariantData) {
|
2015-10-08 15:45:46 -05:00
|
|
|
walk_list!(visitor, visit_struct_field, struct_definition.fields());
|
2012-08-07 17:54:59 -05:00
|
|
|
}
|
|
|
|
|
2016-12-06 04:26:52 -06:00
|
|
|
pub fn walk_struct_field<'a, V: Visitor<'a>>(visitor: &mut V, struct_field: &'a StructField) {
|
2016-04-10 18:10:46 -05:00
|
|
|
visitor.visit_vis(&struct_field.vis);
|
2018-01-15 16:44:32 -06:00
|
|
|
if let Some(ident) = struct_field.ident {
|
2018-03-18 19:54:56 -05:00
|
|
|
visitor.visit_ident(ident);
|
2018-01-15 16:44:32 -06:00
|
|
|
}
|
2016-04-06 03:19:10 -05:00
|
|
|
visitor.visit_ty(&struct_field.ty);
|
|
|
|
walk_list!(visitor, visit_attribute, &struct_field.attrs);
|
2012-08-15 17:53:58 -05:00
|
|
|
}
|
|
|
|
|
2016-12-06 04:26:52 -06:00
|
|
|
pub fn walk_block<'a, V: Visitor<'a>>(visitor: &mut V, block: &'a Block) {
|
2015-09-28 06:26:26 -05:00
|
|
|
walk_list!(visitor, visit_stmt, &block.stmts);
|
2011-06-08 15:48:19 -05:00
|
|
|
}
|
|
|
|
|
2016-12-06 04:26:52 -06:00
|
|
|
pub fn walk_stmt<'a, V: Visitor<'a>>(visitor: &mut V, statement: &'a Stmt) {
|
2019-09-26 11:34:50 -05:00
|
|
|
match statement.kind {
|
2016-06-16 21:30:01 -05:00
|
|
|
StmtKind::Local(ref local) => visitor.visit_local(local),
|
|
|
|
StmtKind::Item(ref item) => visitor.visit_item(item),
|
2020-02-26 21:10:42 -06:00
|
|
|
StmtKind::Expr(ref expr) | StmtKind::Semi(ref expr) => visitor.visit_expr(expr),
|
|
|
|
StmtKind::Empty => {}
|
2020-02-29 10:32:20 -06:00
|
|
|
StmtKind::MacCall(ref mac) => {
|
2020-11-17 13:27:44 -06:00
|
|
|
let MacCallStmt { ref mac, style: _, ref attrs, tokens: _ } = **mac;
|
2020-11-03 11:34:57 -06:00
|
|
|
visitor.visit_mac_call(mac);
|
2016-06-17 23:01:57 -05:00
|
|
|
for attr in attrs.iter() {
|
2015-11-03 10:39:51 -06:00
|
|
|
visitor.visit_attribute(attr);
|
|
|
|
}
|
|
|
|
}
|
2011-06-08 15:48:19 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-02-29 10:32:20 -06:00
|
|
|
pub fn walk_mac<'a, V: Visitor<'a>>(visitor: &mut V, mac: &'a MacCall) {
|
2019-08-14 18:13:53 -05:00
|
|
|
visitor.visit_path(&mac.path, DUMMY_NODE_ID);
|
2011-07-08 18:35:09 -05:00
|
|
|
}
|
|
|
|
|
2018-05-17 13:28:50 -05:00
|
|
|
pub fn walk_anon_const<'a, V: Visitor<'a>>(visitor: &mut V, constant: &'a AnonConst) {
|
|
|
|
visitor.visit_expr(&constant.value);
|
|
|
|
}
|
|
|
|
|
2016-12-06 04:26:52 -06:00
|
|
|
pub fn walk_expr<'a, V: Visitor<'a>>(visitor: &mut V, expression: &'a Expr) {
|
2019-08-27 17:57:50 -05:00
|
|
|
walk_list!(visitor, visit_attribute, expression.attrs.iter());
|
|
|
|
|
2019-09-26 08:39:48 -05:00
|
|
|
match expression.kind {
|
2019-12-22 16:42:04 -06:00
|
|
|
ExprKind::Box(ref subexpression) => visitor.visit_expr(subexpression),
|
2017-01-16 01:36:10 -06:00
|
|
|
ExprKind::Array(ref subexpressions) => {
|
2015-09-28 06:26:26 -05:00
|
|
|
walk_list!(visitor, visit_expr, subexpressions);
|
2013-07-19 20:42:11 -05:00
|
|
|
}
|
2020-09-21 15:55:58 -05:00
|
|
|
ExprKind::ConstBlock(ref anon_const) => visitor.visit_anon_const(anon_const),
|
2016-02-08 09:05:05 -06:00
|
|
|
ExprKind::Repeat(ref element, ref count) => {
|
2015-09-28 06:26:26 -05:00
|
|
|
visitor.visit_expr(element);
|
2018-05-17 13:28:50 -05:00
|
|
|
visitor.visit_anon_const(count)
|
2013-02-18 00:20:36 -06:00
|
|
|
}
|
2016-02-08 09:05:05 -06:00
|
|
|
ExprKind::Struct(ref path, ref fields, ref optional_base) => {
|
2014-09-12 05:10:30 -05:00
|
|
|
visitor.visit_path(path, expression.id);
|
2019-08-24 11:54:40 -05:00
|
|
|
walk_list!(visitor, visit_field, fields);
|
2020-11-07 08:28:55 -06:00
|
|
|
match optional_base {
|
|
|
|
StructRest::Base(expr) => visitor.visit_expr(expr),
|
|
|
|
StructRest::Rest(_span) => {}
|
|
|
|
StructRest::None => {}
|
|
|
|
}
|
2013-02-18 00:20:36 -06:00
|
|
|
}
|
2016-02-08 09:05:05 -06:00
|
|
|
ExprKind::Tup(ref subexpressions) => {
|
2015-09-28 06:26:26 -05:00
|
|
|
walk_list!(visitor, visit_expr, subexpressions);
|
2013-02-18 00:20:36 -06:00
|
|
|
}
|
2016-02-08 09:05:05 -06:00
|
|
|
ExprKind::Call(ref callee_expression, ref arguments) => {
|
2016-09-17 18:14:09 -05:00
|
|
|
visitor.visit_expr(callee_expression);
|
2015-09-28 06:26:26 -05:00
|
|
|
walk_list!(visitor, visit_expr, arguments);
|
2013-02-18 00:20:36 -06:00
|
|
|
}
|
2020-06-09 14:34:23 -05:00
|
|
|
ExprKind::MethodCall(ref segment, ref arguments, _span) => {
|
2017-07-06 18:39:55 -05:00
|
|
|
visitor.visit_path_segment(expression.span, segment);
|
2016-09-17 18:14:09 -05:00
|
|
|
walk_list!(visitor, visit_expr, arguments);
|
2013-07-19 20:42:11 -05:00
|
|
|
}
|
2016-02-08 09:05:05 -06:00
|
|
|
ExprKind::Binary(_, ref left_expression, ref right_expression) => {
|
2015-09-28 06:26:26 -05:00
|
|
|
visitor.visit_expr(left_expression);
|
|
|
|
visitor.visit_expr(right_expression)
|
2013-07-19 20:42:11 -05:00
|
|
|
}
|
2019-11-23 08:15:49 -06:00
|
|
|
ExprKind::AddrOf(_, _, ref subexpression) | ExprKind::Unary(_, ref subexpression) => {
|
2015-09-28 06:26:26 -05:00
|
|
|
visitor.visit_expr(subexpression)
|
2013-07-19 20:42:11 -05:00
|
|
|
}
|
2016-02-08 09:05:05 -06:00
|
|
|
ExprKind::Cast(ref subexpression, ref typ) | ExprKind::Type(ref subexpression, ref typ) => {
|
2015-09-28 06:26:26 -05:00
|
|
|
visitor.visit_expr(subexpression);
|
|
|
|
visitor.visit_ty(typ)
|
2013-07-19 20:42:11 -05:00
|
|
|
}
|
2019-08-27 17:57:50 -05:00
|
|
|
ExprKind::Let(ref pat, ref scrutinee) => {
|
|
|
|
visitor.visit_pat(pat);
|
2019-05-15 09:06:58 -05:00
|
|
|
visitor.visit_expr(scrutinee);
|
|
|
|
}
|
2016-02-08 09:05:05 -06:00
|
|
|
ExprKind::If(ref head_expression, ref if_block, ref optional_else) => {
|
2015-09-28 06:26:26 -05:00
|
|
|
visitor.visit_expr(head_expression);
|
|
|
|
visitor.visit_block(if_block);
|
|
|
|
walk_list!(visitor, visit_expr, optional_else);
|
2013-07-19 20:42:11 -05:00
|
|
|
}
|
2018-01-15 16:44:32 -06:00
|
|
|
ExprKind::While(ref subexpression, ref block, ref opt_label) => {
|
|
|
|
walk_list!(visitor, visit_label, opt_label);
|
2015-09-28 06:26:26 -05:00
|
|
|
visitor.visit_expr(subexpression);
|
|
|
|
visitor.visit_block(block);
|
2013-07-19 20:42:11 -05:00
|
|
|
}
|
2018-01-15 16:44:32 -06:00
|
|
|
ExprKind::ForLoop(ref pattern, ref subexpression, ref block, ref opt_label) => {
|
|
|
|
walk_list!(visitor, visit_label, opt_label);
|
2015-09-28 06:26:26 -05:00
|
|
|
visitor.visit_pat(pattern);
|
|
|
|
visitor.visit_expr(subexpression);
|
|
|
|
visitor.visit_block(block);
|
|
|
|
}
|
2018-01-15 16:44:32 -06:00
|
|
|
ExprKind::Loop(ref block, ref opt_label) => {
|
|
|
|
walk_list!(visitor, visit_label, opt_label);
|
2015-09-28 06:26:26 -05:00
|
|
|
visitor.visit_block(block);
|
|
|
|
}
|
2016-02-08 09:05:05 -06:00
|
|
|
ExprKind::Match(ref subexpression, ref arms) => {
|
2015-09-28 06:26:26 -05:00
|
|
|
visitor.visit_expr(subexpression);
|
|
|
|
walk_list!(visitor, visit_arm, arms);
|
2013-07-19 20:42:11 -05:00
|
|
|
}
|
2020-01-29 17:18:54 -06:00
|
|
|
ExprKind::Closure(_, _, _, ref decl, ref body, _decl_span) => {
|
|
|
|
visitor.visit_fn(FnKind::Closure(decl, body), expression.span, expression.id)
|
|
|
|
}
|
2018-04-15 22:44:39 -05:00
|
|
|
ExprKind::Block(ref block, ref opt_label) => {
|
|
|
|
walk_list!(visitor, visit_label, opt_label);
|
|
|
|
visitor.visit_block(block);
|
|
|
|
}
|
2018-06-06 17:50:59 -05:00
|
|
|
ExprKind::Async(_, _, ref body) => {
|
|
|
|
visitor.visit_block(body);
|
|
|
|
}
|
2019-07-01 23:30:21 -05:00
|
|
|
ExprKind::Await(ref expr) => visitor.visit_expr(expr),
|
2019-12-22 15:08:53 -06:00
|
|
|
ExprKind::Assign(ref lhs, ref rhs, _) => {
|
|
|
|
visitor.visit_expr(lhs);
|
|
|
|
visitor.visit_expr(rhs);
|
2013-07-19 20:42:11 -05:00
|
|
|
}
|
2016-02-08 09:05:05 -06:00
|
|
|
ExprKind::AssignOp(_, ref left_expression, ref right_expression) => {
|
2016-09-17 18:14:09 -05:00
|
|
|
visitor.visit_expr(left_expression);
|
2015-09-28 06:26:26 -05:00
|
|
|
visitor.visit_expr(right_expression);
|
2013-07-19 20:42:11 -05:00
|
|
|
}
|
2018-03-18 08:47:09 -05:00
|
|
|
ExprKind::Field(ref subexpression, ident) => {
|
2015-09-28 06:26:26 -05:00
|
|
|
visitor.visit_expr(subexpression);
|
2018-03-18 19:54:56 -05:00
|
|
|
visitor.visit_ident(ident);
|
2013-02-18 00:20:36 -06:00
|
|
|
}
|
2016-02-08 09:05:05 -06:00
|
|
|
ExprKind::Index(ref main_expression, ref index_expression) => {
|
2015-09-28 06:26:26 -05:00
|
|
|
visitor.visit_expr(main_expression);
|
|
|
|
visitor.visit_expr(index_expression)
|
2013-07-19 20:42:11 -05:00
|
|
|
}
|
2016-01-13 00:23:31 -06:00
|
|
|
ExprKind::Range(ref start, ref end, _) => {
|
2015-09-28 06:26:26 -05:00
|
|
|
walk_list!(visitor, visit_expr, start);
|
|
|
|
walk_list!(visitor, visit_expr, end);
|
2014-12-12 23:41:02 -06:00
|
|
|
}
|
2020-11-11 07:15:15 -06:00
|
|
|
ExprKind::Underscore => {}
|
2016-02-08 09:05:05 -06:00
|
|
|
ExprKind::Path(ref maybe_qself, ref path) => {
|
2015-09-29 03:33:25 -05:00
|
|
|
if let Some(ref qself) = *maybe_qself {
|
2015-02-17 11:29:13 -06:00
|
|
|
visitor.visit_ty(&qself.ty);
|
|
|
|
}
|
2014-09-12 05:10:30 -05:00
|
|
|
visitor.visit_path(path, expression.id)
|
2013-12-08 13:25:35 -06:00
|
|
|
}
|
2018-01-15 16:44:32 -06:00
|
|
|
ExprKind::Break(ref opt_label, ref opt_expr) => {
|
|
|
|
walk_list!(visitor, visit_label, opt_label);
|
Implement the `loop_break_value` feature.
This implements RFC 1624, tracking issue #37339.
- `FnCtxt` (in typeck) gets a stack of `LoopCtxt`s, which store the
currently deduced type of that loop, the desired type, and a list of
break expressions currently seen. `loop` loops get a fresh type
variable as their initial type (this logic is stolen from that for
arrays). `while` loops get `()`.
- `break {expr}` looks up the broken loop, and unifies the type of
`expr` with the type of the loop.
- `break` with no expr unifies the loop's type with `()`.
- When building MIR, `loop` loops no longer construct a `()` value at
termination of the loop; rather, the `break` expression assigns the
result of the loop. `while` loops are unchanged.
- `break` respects contexts in which expressions may not end with braced
blocks. That is, `while break { break-value } { while-body }` is
illegal; this preserves backwards compatibility.
- The RFC did not make it clear, but I chose to make `break ()` inside
of a `while` loop illegal, just in case we wanted to do anything with
that design space in the future.
This is my first time dealing with this part of rustc so I'm sure
there's plenty of problems to pick on here ^_^
2016-10-29 17:15:06 -05:00
|
|
|
walk_list!(visitor, visit_expr, opt_expr);
|
|
|
|
}
|
2018-01-15 16:44:32 -06:00
|
|
|
ExprKind::Continue(ref opt_label) => {
|
|
|
|
walk_list!(visitor, visit_label, opt_label);
|
2015-09-28 06:26:26 -05:00
|
|
|
}
|
2016-02-08 09:05:05 -06:00
|
|
|
ExprKind::Ret(ref optional_expression) => {
|
2015-09-28 06:26:26 -05:00
|
|
|
walk_list!(visitor, visit_expr, optional_expression);
|
2013-07-19 20:42:11 -05:00
|
|
|
}
|
2020-11-03 11:34:57 -06:00
|
|
|
ExprKind::MacCall(ref mac) => visitor.visit_mac_call(mac),
|
2019-12-22 16:42:04 -06:00
|
|
|
ExprKind::Paren(ref subexpression) => visitor.visit_expr(subexpression),
|
2020-01-22 08:20:27 -06:00
|
|
|
ExprKind::InlineAsm(ref ia) => {
|
|
|
|
for (op, _) in &ia.operands {
|
|
|
|
match op {
|
|
|
|
InlineAsmOperand::In { expr, .. }
|
|
|
|
| InlineAsmOperand::InOut { expr, .. }
|
|
|
|
| InlineAsmOperand::Const { expr, .. }
|
|
|
|
| InlineAsmOperand::Sym { expr, .. } => visitor.visit_expr(expr),
|
|
|
|
InlineAsmOperand::Out { expr, .. } => {
|
|
|
|
if let Some(expr) = expr {
|
|
|
|
visitor.visit_expr(expr);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
InlineAsmOperand::SplitInOut { in_expr, out_expr, .. } => {
|
|
|
|
visitor.visit_expr(in_expr);
|
|
|
|
if let Some(out_expr) = out_expr {
|
|
|
|
visitor.visit_expr(out_expr);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2020-01-14 07:40:42 -06:00
|
|
|
ExprKind::LlvmInlineAsm(ref ia) => {
|
2015-09-28 06:26:26 -05:00
|
|
|
for &(_, ref input) in &ia.inputs {
|
2017-05-12 13:05:39 -05:00
|
|
|
visitor.visit_expr(input)
|
2013-03-12 19:53:25 -05:00
|
|
|
}
|
2015-12-05 02:18:24 -06:00
|
|
|
for output in &ia.outputs {
|
|
|
|
visitor.visit_expr(&output.expr)
|
2013-03-12 19:53:25 -05:00
|
|
|
}
|
|
|
|
}
|
2016-12-26 07:34:03 -06:00
|
|
|
ExprKind::Yield(ref optional_expression) => {
|
|
|
|
walk_list!(visitor, visit_expr, optional_expression);
|
|
|
|
}
|
2019-12-22 16:42:04 -06:00
|
|
|
ExprKind::Try(ref subexpression) => visitor.visit_expr(subexpression),
|
|
|
|
ExprKind::TryBlock(ref body) => visitor.visit_block(body),
|
2019-06-07 04:53:33 -05:00
|
|
|
ExprKind::Lit(_) | ExprKind::Err => {}
|
2011-06-08 15:48:19 -05:00
|
|
|
}
|
2013-07-19 20:42:11 -05:00
|
|
|
|
2014-09-12 05:10:30 -05:00
|
|
|
visitor.visit_expr_post(expression)
|
2011-06-08 15:48:19 -05:00
|
|
|
}
|
|
|
|
|
2019-08-27 06:24:32 -05:00
|
|
|
pub fn walk_param<'a, V: Visitor<'a>>(visitor: &mut V, param: &'a Param) {
|
|
|
|
walk_list!(visitor, visit_attribute, param.attrs.iter());
|
|
|
|
visitor.visit_pat(¶m.pat);
|
|
|
|
visitor.visit_ty(¶m.ty);
|
2019-07-26 17:52:37 -05:00
|
|
|
}
|
|
|
|
|
2016-12-06 04:26:52 -06:00
|
|
|
pub fn walk_arm<'a, V: Visitor<'a>>(visitor: &mut V, arm: &'a Arm) {
|
2019-08-27 17:57:50 -05:00
|
|
|
visitor.visit_pat(&arm.pat);
|
|
|
|
walk_list!(visitor, visit_expr, &arm.guard);
|
2015-09-28 06:26:26 -05:00
|
|
|
visitor.visit_expr(&arm.body);
|
|
|
|
walk_list!(visitor, visit_attribute, &arm.attrs);
|
2011-06-08 15:48:19 -05:00
|
|
|
}
|
2016-03-31 14:10:38 -05:00
|
|
|
|
2016-12-06 04:26:52 -06:00
|
|
|
pub fn walk_vis<'a, V: Visitor<'a>>(visitor: &mut V, vis: &'a Visibility) {
|
2020-08-21 18:11:00 -05:00
|
|
|
if let VisibilityKind::Restricted { ref path, id } = vis.kind {
|
2016-04-10 18:10:46 -05:00
|
|
|
visitor.visit_path(path, id);
|
2016-03-31 14:10:38 -05:00
|
|
|
}
|
|
|
|
}
|
2017-10-23 03:22:28 -05:00
|
|
|
|
|
|
|
pub fn walk_attribute<'a, V: Visitor<'a>>(visitor: &mut V, attr: &'a Attribute) {
|
2019-10-23 14:33:12 -05:00
|
|
|
match attr.kind {
|
2020-11-05 11:27:48 -06:00
|
|
|
AttrKind::Normal(ref item, ref _tokens) => walk_mac_args(visitor, &item.args),
|
2020-07-21 14:16:19 -05:00
|
|
|
AttrKind::DocComment(..) => {}
|
2019-10-23 14:33:12 -05:00
|
|
|
}
|
2017-10-23 03:22:28 -05:00
|
|
|
}
|
|
|
|
|
2019-12-01 08:07:38 -06:00
|
|
|
pub fn walk_mac_args<'a, V: Visitor<'a>>(visitor: &mut V, args: &'a MacArgs) {
|
|
|
|
match args {
|
|
|
|
MacArgs::Empty => {}
|
2020-09-27 08:52:51 -05:00
|
|
|
MacArgs::Delimited(_dspan, _delim, _tokens) => {}
|
|
|
|
// The value in `#[key = VALUE]` must be visited as an expression for backward
|
|
|
|
// compatibility, so that macros can be expanded in that position.
|
2020-12-19 14:38:22 -06:00
|
|
|
MacArgs::Eq(_eq_span, token) => match &token.kind {
|
|
|
|
token::Interpolated(nt) => match &**nt {
|
|
|
|
token::NtExpr(expr) => visitor.visit_expr(expr),
|
2020-09-27 08:52:51 -05:00
|
|
|
t => panic!("unexpected token in key-value attribute: {:?}", t),
|
|
|
|
},
|
|
|
|
t => panic!("unexpected token in key-value attribute: {:?}", t),
|
|
|
|
},
|
2017-10-23 03:22:28 -05:00
|
|
|
}
|
|
|
|
}
|