rename to BoundKind
and add comments
This commit is contained in:
parent
4375b36117
commit
38bd4fbdbd
5 changed files with 41 additions and 29 deletions
|
@ -33,9 +33,21 @@ pub enum FnCtxt {
|
|||
}
|
||||
|
||||
#[derive(Copy, Clone, Debug)]
|
||||
pub enum BoundCtxt {
|
||||
Normal,
|
||||
pub enum BoundKind {
|
||||
/// Trait bounds in generics bounds and type/trait alias.
|
||||
/// E.g., `<T: Bound>`, `type A: Bound`, or `where T: Bound`.
|
||||
Bound,
|
||||
|
||||
/// Trait bounds in `impl` type.
|
||||
/// E.g., `type Foo = impl Bound1 + Bound2 + Bound3`.
|
||||
Impl,
|
||||
|
||||
/// Trait bounds in trait object type.
|
||||
/// E.g., `dyn Bound1 + Bound2 + Bound3`.
|
||||
TraitObject,
|
||||
|
||||
/// Super traits of a trait.
|
||||
/// E.g., `trait A: B`
|
||||
SuperTraits,
|
||||
}
|
||||
|
||||
|
@ -146,7 +158,7 @@ pub trait Visitor<'ast>: Sized {
|
|||
fn visit_trait_ref(&mut self, t: &'ast TraitRef) {
|
||||
walk_trait_ref(self, t)
|
||||
}
|
||||
fn visit_param_bound(&mut self, bounds: &'ast GenericBound, _ctxt: BoundCtxt) {
|
||||
fn visit_param_bound(&mut self, bounds: &'ast GenericBound, _ctxt: BoundKind) {
|
||||
walk_param_bound(self, bounds)
|
||||
}
|
||||
fn visit_poly_trait_ref(&mut self, t: &'ast PolyTraitRef, m: &'ast TraitBoundModifier) {
|
||||
|
@ -318,7 +330,7 @@ pub fn walk_item<'a, V: Visitor<'a>>(visitor: &mut V, item: &'a Item) {
|
|||
ItemKind::GlobalAsm(ref asm) => walk_inline_asm(visitor, asm),
|
||||
ItemKind::TyAlias(box TyAlias { ref generics, ref bounds, ref ty, .. }) => {
|
||||
visitor.visit_generics(generics);
|
||||
walk_list!(visitor, visit_param_bound, bounds, BoundCtxt::Normal);
|
||||
walk_list!(visitor, visit_param_bound, bounds, BoundKind::Bound);
|
||||
walk_list!(visitor, visit_ty, ty);
|
||||
}
|
||||
ItemKind::Enum(ref enum_definition, ref generics) => {
|
||||
|
@ -353,12 +365,12 @@ pub fn walk_item<'a, V: Visitor<'a>>(visitor: &mut V, item: &'a Item) {
|
|||
ref items,
|
||||
}) => {
|
||||
visitor.visit_generics(generics);
|
||||
walk_list!(visitor, visit_param_bound, bounds, BoundCtxt::SuperTraits);
|
||||
walk_list!(visitor, visit_param_bound, bounds, BoundKind::SuperTraits);
|
||||
walk_list!(visitor, visit_assoc_item, items, AssocCtxt::Trait);
|
||||
}
|
||||
ItemKind::TraitAlias(ref generics, ref bounds) => {
|
||||
visitor.visit_generics(generics);
|
||||
walk_list!(visitor, visit_param_bound, bounds, BoundCtxt::Normal);
|
||||
walk_list!(visitor, visit_param_bound, bounds, BoundKind::Bound);
|
||||
}
|
||||
ItemKind::MacCall(ref mac) => visitor.visit_mac_call(mac),
|
||||
ItemKind::MacroDef(ref ts) => visitor.visit_mac_def(ts, item.id),
|
||||
|
@ -424,10 +436,10 @@ pub fn walk_ty<'a, V: Visitor<'a>>(visitor: &mut V, typ: &'a Ty) {
|
|||
visitor.visit_anon_const(length)
|
||||
}
|
||||
TyKind::TraitObject(ref bounds, ..) => {
|
||||
walk_list!(visitor, visit_param_bound, bounds, BoundCtxt::TraitObject);
|
||||
walk_list!(visitor, visit_param_bound, bounds, BoundKind::TraitObject);
|
||||
}
|
||||
TyKind::ImplTrait(_, ref bounds) => {
|
||||
walk_list!(visitor, visit_param_bound, bounds, BoundCtxt::Normal);
|
||||
walk_list!(visitor, visit_param_bound, bounds, BoundKind::Impl);
|
||||
}
|
||||
TyKind::Typeof(ref expression) => visitor.visit_anon_const(expression),
|
||||
TyKind::Infer | TyKind::ImplicitSelf | TyKind::Err => {}
|
||||
|
@ -513,7 +525,7 @@ pub fn walk_assoc_constraint<'a, V: Visitor<'a>>(visitor: &mut V, constraint: &'
|
|||
Term::Const(c) => visitor.visit_anon_const(c),
|
||||
},
|
||||
AssocConstraintKind::Bound { ref bounds } => {
|
||||
walk_list!(visitor, visit_param_bound, bounds, BoundCtxt::Normal);
|
||||
walk_list!(visitor, visit_param_bound, bounds, BoundKind::Bound);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -576,7 +588,7 @@ pub fn walk_foreign_item<'a, V: Visitor<'a>>(visitor: &mut V, item: &'a ForeignI
|
|||
}
|
||||
ForeignItemKind::TyAlias(box TyAlias { generics, bounds, ty, .. }) => {
|
||||
visitor.visit_generics(generics);
|
||||
walk_list!(visitor, visit_param_bound, bounds, BoundCtxt::Normal);
|
||||
walk_list!(visitor, visit_param_bound, bounds, BoundKind::Bound);
|
||||
walk_list!(visitor, visit_ty, ty);
|
||||
}
|
||||
ForeignItemKind::MacCall(mac) => {
|
||||
|
@ -595,7 +607,7 @@ pub fn walk_param_bound<'a, V: Visitor<'a>>(visitor: &mut V, bound: &'a GenericB
|
|||
pub fn walk_generic_param<'a, V: Visitor<'a>>(visitor: &mut V, param: &'a GenericParam) {
|
||||
visitor.visit_ident(param.ident);
|
||||
walk_list!(visitor, visit_attribute, param.attrs.iter());
|
||||
walk_list!(visitor, visit_param_bound, ¶m.bounds, BoundCtxt::Normal);
|
||||
walk_list!(visitor, visit_param_bound, ¶m.bounds, BoundKind::Bound);
|
||||
match param.kind {
|
||||
GenericParamKind::Lifetime => (),
|
||||
GenericParamKind::Type { ref default } => walk_list!(visitor, visit_ty, default),
|
||||
|
@ -622,14 +634,14 @@ pub fn walk_where_predicate<'a, V: Visitor<'a>>(visitor: &mut V, predicate: &'a
|
|||
..
|
||||
}) => {
|
||||
visitor.visit_ty(bounded_ty);
|
||||
walk_list!(visitor, visit_param_bound, bounds, BoundCtxt::Normal);
|
||||
walk_list!(visitor, visit_param_bound, bounds, BoundKind::Bound);
|
||||
walk_list!(visitor, visit_generic_param, bound_generic_params);
|
||||
}
|
||||
WherePredicate::RegionPredicate(WhereRegionPredicate {
|
||||
ref lifetime, ref bounds, ..
|
||||
}) => {
|
||||
visitor.visit_lifetime(lifetime);
|
||||
walk_list!(visitor, visit_param_bound, bounds, BoundCtxt::Normal);
|
||||
walk_list!(visitor, visit_param_bound, bounds, BoundKind::Bound);
|
||||
}
|
||||
WherePredicate::EqPredicate(WhereEqPredicate { ref lhs_ty, ref rhs_ty, .. }) => {
|
||||
visitor.visit_ty(lhs_ty);
|
||||
|
@ -682,7 +694,7 @@ pub fn walk_assoc_item<'a, V: Visitor<'a>>(visitor: &mut V, item: &'a AssocItem,
|
|||
}
|
||||
AssocItemKind::TyAlias(box TyAlias { generics, bounds, ty, .. }) => {
|
||||
visitor.visit_generics(generics);
|
||||
walk_list!(visitor, visit_param_bound, bounds, BoundCtxt::Normal);
|
||||
walk_list!(visitor, visit_param_bound, bounds, BoundKind::Bound);
|
||||
walk_list!(visitor, visit_ty, ty);
|
||||
}
|
||||
AssocItemKind::MacCall(mac) => {
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
|
||||
use itertools::{Either, Itertools};
|
||||
use rustc_ast::ptr::P;
|
||||
use rustc_ast::visit::{self, AssocCtxt, BoundCtxt, FnCtxt, FnKind, Visitor};
|
||||
use rustc_ast::visit::{self, AssocCtxt, BoundKind, FnCtxt, FnKind, Visitor};
|
||||
use rustc_ast::walk_list;
|
||||
use rustc_ast::*;
|
||||
use rustc_ast_pretty::pprust::{self, State};
|
||||
|
@ -1231,7 +1231,7 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
|
|||
self.visit_ident(item.ident);
|
||||
self.visit_generics(generics);
|
||||
self.with_banned_tilde_const(|this| {
|
||||
walk_list!(this, visit_param_bound, bounds, BoundCtxt::SuperTraits)
|
||||
walk_list!(this, visit_param_bound, bounds, BoundKind::SuperTraits)
|
||||
});
|
||||
walk_list!(self, visit_assoc_item, items, AssocCtxt::Trait);
|
||||
walk_list!(self, visit_attribute, &item.attrs);
|
||||
|
@ -1459,10 +1459,10 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
|
|||
visit::walk_generic_param(self, param);
|
||||
}
|
||||
|
||||
fn visit_param_bound(&mut self, bound: &'a GenericBound, ctxt: BoundCtxt) {
|
||||
fn visit_param_bound(&mut self, bound: &'a GenericBound, ctxt: BoundKind) {
|
||||
if let GenericBound::Trait(ref poly, modify) = *bound {
|
||||
match (ctxt, modify) {
|
||||
(BoundCtxt::SuperTraits, TraitBoundModifier::Maybe) => {
|
||||
(BoundKind::SuperTraits, TraitBoundModifier::Maybe) => {
|
||||
let mut err = self.err_handler().struct_span_err(
|
||||
poly.span,
|
||||
&format!("`?Trait` is not permitted in supertraits"),
|
||||
|
@ -1471,7 +1471,7 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
|
|||
err.note(&format!("traits are `?{}` by default", path_str));
|
||||
err.emit();
|
||||
}
|
||||
(BoundCtxt::TraitObject, TraitBoundModifier::Maybe) => {
|
||||
(BoundKind::TraitObject, TraitBoundModifier::Maybe) => {
|
||||
let mut err = self.err_handler().struct_span_err(
|
||||
poly.span,
|
||||
&format!("`?Trait` is not permitted in trait object types"),
|
||||
|
@ -1661,7 +1661,7 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
|
|||
walk_list!(self, visit_attribute, &item.attrs);
|
||||
self.with_tilde_const_allowed(|this| {
|
||||
this.visit_generics(generics);
|
||||
walk_list!(this, visit_param_bound, bounds, BoundCtxt::Normal);
|
||||
walk_list!(this, visit_param_bound, bounds, BoundKind::Bound);
|
||||
});
|
||||
walk_list!(self, visit_ty, ty);
|
||||
}
|
||||
|
|
|
@ -76,7 +76,7 @@ impl<'ast> Visitor<'ast> for NodeCounter {
|
|||
self.count += 1;
|
||||
walk_trait_ref(self, t)
|
||||
}
|
||||
fn visit_param_bound(&mut self, bounds: &GenericBound, _ctxt: BoundCtxt) {
|
||||
fn visit_param_bound(&mut self, bounds: &GenericBound, _ctxt: BoundKind) {
|
||||
self.count += 1;
|
||||
walk_param_bound(self, bounds)
|
||||
}
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
// completely accurate (some things might be counted twice, others missed).
|
||||
|
||||
use rustc_ast::visit as ast_visit;
|
||||
use rustc_ast::visit::BoundCtxt;
|
||||
use rustc_ast::visit::BoundKind;
|
||||
use rustc_ast::{self as ast, AttrId, NodeId};
|
||||
use rustc_data_structures::fx::{FxHashMap, FxHashSet};
|
||||
use rustc_hir as hir;
|
||||
|
@ -303,7 +303,7 @@ impl<'v> ast_visit::Visitor<'v> for StatCollector<'v> {
|
|||
ast_visit::walk_assoc_item(self, item, ctxt);
|
||||
}
|
||||
|
||||
fn visit_param_bound(&mut self, bounds: &'v ast::GenericBound, _ctxt: BoundCtxt) {
|
||||
fn visit_param_bound(&mut self, bounds: &'v ast::GenericBound, _ctxt: BoundKind) {
|
||||
self.record("GenericBound", Id::None, bounds);
|
||||
ast_visit::walk_param_bound(self, bounds)
|
||||
}
|
||||
|
|
|
@ -12,7 +12,7 @@ use crate::{Module, ModuleOrUniformRoot, NameBinding, ParentScope, PathResult};
|
|||
use crate::{ResolutionError, Resolver, Segment, UseError};
|
||||
|
||||
use rustc_ast::ptr::P;
|
||||
use rustc_ast::visit::{self, AssocCtxt, BoundCtxt, FnCtxt, FnKind, Visitor};
|
||||
use rustc_ast::visit::{self, AssocCtxt, BoundKind, FnCtxt, FnKind, Visitor};
|
||||
use rustc_ast::*;
|
||||
use rustc_ast_lowering::ResolverAstLowering;
|
||||
use rustc_data_structures::fx::{FxHashMap, FxHashSet};
|
||||
|
@ -835,7 +835,7 @@ impl<'a: 'ast, 'ast> Visitor<'ast> for LateResolutionVisitor<'a, '_, 'ast> {
|
|||
this.visit_generic_param_vec(&bound_generic_params, false);
|
||||
this.visit_ty(bounded_ty);
|
||||
for bound in bounds {
|
||||
this.visit_param_bound(bound, BoundCtxt::Normal)
|
||||
this.visit_param_bound(bound, BoundKind::Bound)
|
||||
}
|
||||
},
|
||||
);
|
||||
|
@ -1026,12 +1026,12 @@ impl<'a: 'ast, 'b, 'ast> LateResolutionVisitor<'a, 'b, 'ast> {
|
|||
match param.kind {
|
||||
GenericParamKind::Lifetime => {
|
||||
for bound in ¶m.bounds {
|
||||
this.visit_param_bound(bound, BoundCtxt::Normal);
|
||||
this.visit_param_bound(bound, BoundKind::Bound);
|
||||
}
|
||||
}
|
||||
GenericParamKind::Type { ref default } => {
|
||||
for bound in ¶m.bounds {
|
||||
this.visit_param_bound(bound, BoundCtxt::Normal);
|
||||
this.visit_param_bound(bound, BoundKind::Bound);
|
||||
}
|
||||
|
||||
if let Some(ref ty) = default {
|
||||
|
@ -1496,7 +1496,7 @@ impl<'a: 'ast, 'b, 'ast> LateResolutionVisitor<'a, 'b, 'ast> {
|
|||
Res::SelfTy { trait_: Some(local_def_id), alias_to: None },
|
||||
|this| {
|
||||
this.visit_generics(generics);
|
||||
walk_list!(this, visit_param_bound, bounds, BoundCtxt::SuperTraits);
|
||||
walk_list!(this, visit_param_bound, bounds, BoundKind::SuperTraits);
|
||||
|
||||
let walk_assoc_item =
|
||||
|this: &mut Self,
|
||||
|
@ -1580,7 +1580,7 @@ impl<'a: 'ast, 'b, 'ast> LateResolutionVisitor<'a, 'b, 'ast> {
|
|||
Res::SelfTy { trait_: Some(local_def_id), alias_to: None },
|
||||
|this| {
|
||||
this.visit_generics(generics);
|
||||
walk_list!(this, visit_param_bound, bounds, BoundCtxt::Normal);
|
||||
walk_list!(this, visit_param_bound, bounds, BoundKind::Bound);
|
||||
},
|
||||
);
|
||||
},
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue