Make GenericBound explicit
This commit is contained in:
parent
c5f16e0e18
commit
95f1866a4d
13 changed files with 53 additions and 56 deletions
|
@ -1109,11 +1109,11 @@ impl<'a> LoweringContext<'a> {
|
||||||
let bounds = bounds
|
let bounds = bounds
|
||||||
.iter()
|
.iter()
|
||||||
.filter_map(|bound| match *bound {
|
.filter_map(|bound| match *bound {
|
||||||
Trait(ref ty, TraitBoundModifier::None) => {
|
GenericBound::Trait(ref ty, TraitBoundModifier::None) => {
|
||||||
Some(self.lower_poly_trait_ref(ty, itctx))
|
Some(self.lower_poly_trait_ref(ty, itctx))
|
||||||
}
|
}
|
||||||
Trait(_, TraitBoundModifier::Maybe) => None,
|
GenericBound::Trait(_, TraitBoundModifier::Maybe) => None,
|
||||||
Outlives(ref lifetime) => {
|
GenericBound::Outlives(ref lifetime) => {
|
||||||
if lifetime_bound.is_none() {
|
if lifetime_bound.is_none() {
|
||||||
lifetime_bound = Some(self.lower_lifetime(lifetime));
|
lifetime_bound = Some(self.lower_lifetime(lifetime));
|
||||||
}
|
}
|
||||||
|
|
|
@ -101,7 +101,7 @@ impl<'a> AstValidator<'a> {
|
||||||
|
|
||||||
fn no_questions_in_bounds(&self, bounds: &GenericBounds, where_: &str, is_trait: bool) {
|
fn no_questions_in_bounds(&self, bounds: &GenericBounds, where_: &str, is_trait: bool) {
|
||||||
for bound in bounds {
|
for bound in bounds {
|
||||||
if let Trait(ref poly, TraitBoundModifier::Maybe) = *bound {
|
if let GenericBound::Trait(ref poly, TraitBoundModifier::Maybe) = *bound {
|
||||||
let mut err = self.err_handler().struct_span_err(poly.span,
|
let mut err = self.err_handler().struct_span_err(poly.span,
|
||||||
&format!("`?Trait` is not permitted in {}", where_));
|
&format!("`?Trait` is not permitted in {}", where_));
|
||||||
if is_trait {
|
if is_trait {
|
||||||
|
@ -190,7 +190,7 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
|
||||||
TyKind::TraitObject(ref bounds, ..) => {
|
TyKind::TraitObject(ref bounds, ..) => {
|
||||||
let mut any_lifetime_bounds = false;
|
let mut any_lifetime_bounds = false;
|
||||||
for bound in bounds {
|
for bound in bounds {
|
||||||
if let Outlives(ref lifetime) = *bound {
|
if let GenericBound::Outlives(ref lifetime) = *bound {
|
||||||
if any_lifetime_bounds {
|
if any_lifetime_bounds {
|
||||||
span_err!(self.session, lifetime.ident.span, E0226,
|
span_err!(self.session, lifetime.ident.span, E0226,
|
||||||
"only a single explicit lifetime bound is permitted");
|
"only a single explicit lifetime bound is permitted");
|
||||||
|
@ -203,7 +203,7 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
|
||||||
}
|
}
|
||||||
TyKind::ImplTrait(ref bounds) => {
|
TyKind::ImplTrait(ref bounds) => {
|
||||||
if !bounds.iter()
|
if !bounds.iter()
|
||||||
.any(|b| if let Trait(..) = *b { true } else { false }) {
|
.any(|b| if let GenericBound::Trait(..) = *b { true } else { false }) {
|
||||||
self.err_handler().span_err(ty.span, "at least one trait must be specified");
|
self.err_handler().span_err(ty.span, "at least one trait must be specified");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -761,10 +761,8 @@ impl<'l, 'tcx: 'l, 'll, O: DumpOutput + 'll> DumpVisitor<'l, 'tcx, 'll, O> {
|
||||||
// super-traits
|
// super-traits
|
||||||
for super_bound in trait_refs.iter() {
|
for super_bound in trait_refs.iter() {
|
||||||
let trait_ref = match *super_bound {
|
let trait_ref = match *super_bound {
|
||||||
ast::Trait(ref trait_ref, _) => trait_ref,
|
ast::GenericBound::Trait(ref trait_ref, _) => trait_ref,
|
||||||
ast::Outlives(..) => {
|
ast::GenericBound::Outlives(..) => continue,
|
||||||
continue;
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
let trait_ref = &trait_ref.trait_ref;
|
let trait_ref = &trait_ref.trait_ref;
|
||||||
|
@ -1489,7 +1487,7 @@ impl<'l, 'tcx: 'l, 'll, O: DumpOutput + 'll> Visitor<'l> for DumpVisitor<'l, 'tc
|
||||||
ast::GenericParamKind::Lifetime { .. } => {}
|
ast::GenericParamKind::Lifetime { .. } => {}
|
||||||
ast::GenericParamKind::Type { ref default, .. } => {
|
ast::GenericParamKind::Type { ref default, .. } => {
|
||||||
for bound in ¶m.bounds {
|
for bound in ¶m.bounds {
|
||||||
if let ast::Trait(ref trait_ref, _) = *bound {
|
if let ast::GenericBound::Trait(ref trait_ref, _) = *bound {
|
||||||
self.process_path(trait_ref.trait_ref.ref_id, &trait_ref.trait_ref.path)
|
self.process_path(trait_ref.trait_ref.ref_id, &trait_ref.trait_ref.path)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -374,8 +374,8 @@ pub fn build_impl(cx: &DocContext, did: DefId, ret: &mut Vec<clean::Item>) {
|
||||||
let polarity = tcx.impl_polarity(did);
|
let polarity = tcx.impl_polarity(did);
|
||||||
let trait_ = associated_trait.clean(cx).map(|bound| {
|
let trait_ = associated_trait.clean(cx).map(|bound| {
|
||||||
match bound {
|
match bound {
|
||||||
clean::TraitBound(polyt, _) => polyt.trait_,
|
clean::GenericBound::TraitBound(polyt, _) => polyt.trait_,
|
||||||
clean::Outlives(..) => unreachable!(),
|
clean::GenericBound::Outlives(..) => unreachable!(),
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
if trait_.def_id() == tcx.lang_items().deref_trait() {
|
if trait_.def_id() == tcx.lang_items().deref_trait() {
|
||||||
|
@ -387,9 +387,9 @@ pub fn build_impl(cx: &DocContext, did: DefId, ret: &mut Vec<clean::Item>) {
|
||||||
|
|
||||||
let provided = trait_.def_id().map(|did| {
|
let provided = trait_.def_id().map(|did| {
|
||||||
tcx.provided_trait_methods(did)
|
tcx.provided_trait_methods(did)
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.map(|meth| meth.name.to_string())
|
.map(|meth| meth.name.to_string())
|
||||||
.collect()
|
.collect()
|
||||||
}).unwrap_or(FxHashSet());
|
}).unwrap_or(FxHashSet());
|
||||||
|
|
||||||
ret.push(clean::Item {
|
ret.push(clean::Item {
|
||||||
|
|
|
@ -14,7 +14,6 @@
|
||||||
pub use self::Type::*;
|
pub use self::Type::*;
|
||||||
pub use self::Mutability::*;
|
pub use self::Mutability::*;
|
||||||
pub use self::ItemEnum::*;
|
pub use self::ItemEnum::*;
|
||||||
pub use self::GenericBound::*;
|
|
||||||
pub use self::SelfTy::*;
|
pub use self::SelfTy::*;
|
||||||
pub use self::FunctionRetTy::*;
|
pub use self::FunctionRetTy::*;
|
||||||
pub use self::Visibility::{Public, Inherited};
|
pub use self::Visibility::{Public, Inherited};
|
||||||
|
@ -1470,7 +1469,7 @@ impl GenericBound {
|
||||||
let path = external_path(cx, &cx.tcx.item_name(did).as_str(),
|
let path = external_path(cx, &cx.tcx.item_name(did).as_str(),
|
||||||
Some(did), false, vec![], empty);
|
Some(did), false, vec![], empty);
|
||||||
inline::record_extern_fqn(cx, did, TypeKind::Trait);
|
inline::record_extern_fqn(cx, did, TypeKind::Trait);
|
||||||
TraitBound(PolyTrait {
|
GenericBound::TraitBound(PolyTrait {
|
||||||
trait_: ResolvedPath {
|
trait_: ResolvedPath {
|
||||||
path,
|
path,
|
||||||
typarams: None,
|
typarams: None,
|
||||||
|
@ -1510,8 +1509,10 @@ impl GenericBound {
|
||||||
impl Clean<GenericBound> for hir::GenericBound {
|
impl Clean<GenericBound> for hir::GenericBound {
|
||||||
fn clean(&self, cx: &DocContext) -> GenericBound {
|
fn clean(&self, cx: &DocContext) -> GenericBound {
|
||||||
match *self {
|
match *self {
|
||||||
hir::GenericBound::Outlives(lt) => Outlives(lt.clean(cx)),
|
hir::GenericBound::Outlives(lt) => GenericBound::Outlives(lt.clean(cx)),
|
||||||
hir::GenericBound::Trait(ref t, modifier) => TraitBound(t.clean(cx), modifier),
|
hir::GenericBound::Trait(ref t, modifier) => {
|
||||||
|
GenericBound::TraitBound(t.clean(cx), modifier)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1599,7 +1600,7 @@ impl<'a, 'tcx> Clean<GenericBound> for (&'a ty::TraitRef<'tcx>, Vec<TypeBinding>
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TraitBound(
|
GenericBound::TraitBound(
|
||||||
PolyTrait {
|
PolyTrait {
|
||||||
trait_: ResolvedPath {
|
trait_: ResolvedPath {
|
||||||
path,
|
path,
|
||||||
|
@ -1623,9 +1624,8 @@ impl<'tcx> Clean<GenericBound> for ty::TraitRef<'tcx> {
|
||||||
impl<'tcx> Clean<Option<Vec<GenericBound>>> for Substs<'tcx> {
|
impl<'tcx> Clean<Option<Vec<GenericBound>>> for Substs<'tcx> {
|
||||||
fn clean(&self, cx: &DocContext) -> Option<Vec<GenericBound>> {
|
fn clean(&self, cx: &DocContext) -> Option<Vec<GenericBound>> {
|
||||||
let mut v = Vec::new();
|
let mut v = Vec::new();
|
||||||
v.extend(self.regions().filter_map(|r| r.clean(cx))
|
v.extend(self.regions().filter_map(|r| r.clean(cx)).map(GenericBound::Outlives));
|
||||||
.map(GenericBound::Outlives));
|
v.extend(self.types().map(|t| GenericBound::TraitBound(PolyTrait {
|
||||||
v.extend(self.types().map(|t| TraitBound(PolyTrait {
|
|
||||||
trait_: t.clean(cx),
|
trait_: t.clean(cx),
|
||||||
generic_params: Vec::new(),
|
generic_params: Vec::new(),
|
||||||
}, hir::TraitBoundModifier::None)));
|
}, hir::TraitBoundModifier::None)));
|
||||||
|
@ -2978,10 +2978,11 @@ impl Clean<Type> for hir::Ty {
|
||||||
match bounds[0].clean(cx).trait_ {
|
match bounds[0].clean(cx).trait_ {
|
||||||
ResolvedPath { path, typarams: None, did, is_generic } => {
|
ResolvedPath { path, typarams: None, did, is_generic } => {
|
||||||
let mut bounds: Vec<self::GenericBound> = bounds[1..].iter().map(|bound| {
|
let mut bounds: Vec<self::GenericBound> = bounds[1..].iter().map(|bound| {
|
||||||
TraitBound(bound.clean(cx), hir::TraitBoundModifier::None)
|
self::GenericBound::TraitBound(bound.clean(cx),
|
||||||
|
hir::TraitBoundModifier::None)
|
||||||
}).collect();
|
}).collect();
|
||||||
if !lifetime.is_elided() {
|
if !lifetime.is_elided() {
|
||||||
bounds.push(self::Outlives(lifetime.clean(cx)));
|
bounds.push(self::GenericBound::Outlives(lifetime.clean(cx)));
|
||||||
}
|
}
|
||||||
ResolvedPath { path, typarams: Some(bounds), did, is_generic, }
|
ResolvedPath { path, typarams: Some(bounds), did, is_generic, }
|
||||||
}
|
}
|
||||||
|
@ -3086,7 +3087,7 @@ impl<'tcx> Clean<Type> for Ty<'tcx> {
|
||||||
let path = external_path(cx, &cx.tcx.item_name(did).as_str(),
|
let path = external_path(cx, &cx.tcx.item_name(did).as_str(),
|
||||||
Some(did), false, vec![], empty);
|
Some(did), false, vec![], empty);
|
||||||
inline::record_extern_fqn(cx, did, TypeKind::Trait);
|
inline::record_extern_fqn(cx, did, TypeKind::Trait);
|
||||||
let bound = TraitBound(PolyTrait {
|
let bound = GenericBound::TraitBound(PolyTrait {
|
||||||
trait_: ResolvedPath {
|
trait_: ResolvedPath {
|
||||||
path,
|
path,
|
||||||
typarams: None,
|
typarams: None,
|
||||||
|
|
|
@ -83,8 +83,8 @@ pub fn where_clauses(cx: &DocContext, clauses: Vec<WP>) -> Vec<WP> {
|
||||||
};
|
};
|
||||||
!bounds.iter_mut().any(|b| {
|
!bounds.iter_mut().any(|b| {
|
||||||
let trait_ref = match *b {
|
let trait_ref = match *b {
|
||||||
clean::TraitBound(ref mut tr, _) => tr,
|
clean::GenericBound::TraitBound(ref mut tr, _) => tr,
|
||||||
clean::Outlives(..) => return false,
|
clean::GenericBound::Outlives(..) => return false,
|
||||||
};
|
};
|
||||||
let (did, path) = match trait_ref.trait_ {
|
let (did, path) = match trait_ref.trait_ {
|
||||||
clean::ResolvedPath { did, ref mut path, ..} => (did, path),
|
clean::ResolvedPath { did, ref mut path, ..} => (did, path),
|
||||||
|
|
|
@ -270,10 +270,10 @@ impl fmt::Display for clean::PolyTrait {
|
||||||
impl fmt::Display for clean::GenericBound {
|
impl fmt::Display for clean::GenericBound {
|
||||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||||
match *self {
|
match *self {
|
||||||
clean::Outlives(ref lt) => {
|
clean::GenericBound::Outlives(ref lt) => {
|
||||||
write!(f, "{}", *lt)
|
write!(f, "{}", *lt)
|
||||||
}
|
}
|
||||||
clean::TraitBound(ref ty, modifier) => {
|
clean::GenericBound::TraitBound(ref ty, modifier) => {
|
||||||
let modifier_str = match modifier {
|
let modifier_str = match modifier {
|
||||||
hir::TraitBoundModifier::None => "",
|
hir::TraitBoundModifier::None => "",
|
||||||
hir::TraitBoundModifier::Maybe => "?",
|
hir::TraitBoundModifier::Maybe => "?",
|
||||||
|
|
|
@ -10,7 +10,6 @@
|
||||||
|
|
||||||
// The Rust abstract syntax tree.
|
// The Rust abstract syntax tree.
|
||||||
|
|
||||||
pub use self::GenericBound::*;
|
|
||||||
pub use self::UnsafeSource::*;
|
pub use self::UnsafeSource::*;
|
||||||
pub use self::GenericArgs::*;
|
pub use self::GenericArgs::*;
|
||||||
pub use symbol::{Ident, Symbol as Name};
|
pub use symbol::{Ident, Symbol as Name};
|
||||||
|
@ -290,8 +289,8 @@ pub enum GenericBound {
|
||||||
impl GenericBound {
|
impl GenericBound {
|
||||||
pub fn span(&self) -> Span {
|
pub fn span(&self) -> Span {
|
||||||
match self {
|
match self {
|
||||||
&Trait(ref t, ..) => t.span,
|
&GenericBound::Trait(ref t, ..) => t.span,
|
||||||
&Outlives(ref l) => l.ident.span,
|
&GenericBound::Outlives(ref l) => l.ident.span,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -930,8 +929,8 @@ impl Expr {
|
||||||
fn to_bound(&self) -> Option<GenericBound> {
|
fn to_bound(&self) -> Option<GenericBound> {
|
||||||
match &self.node {
|
match &self.node {
|
||||||
ExprKind::Path(None, path) =>
|
ExprKind::Path(None, path) =>
|
||||||
Some(Trait(PolyTraitRef::new(Vec::new(), path.clone(), self.span),
|
Some(GenericBound::Trait(PolyTraitRef::new(Vec::new(), path.clone(), self.span),
|
||||||
TraitBoundModifier::None)),
|
TraitBoundModifier::None)),
|
||||||
_ => None,
|
_ => None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -465,7 +465,8 @@ impl<'a> AstBuilder for ExtCtxt<'a> {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn ty_param_bound(&self, path: ast::Path) -> ast::GenericBound {
|
fn ty_param_bound(&self, path: ast::Path) -> ast::GenericBound {
|
||||||
ast::Trait(self.poly_trait_ref(path.span, path), ast::TraitBoundModifier::None)
|
ast::GenericBound::Trait(self.poly_trait_ref(path.span, path),
|
||||||
|
ast::TraitBoundModifier::None)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn lifetime(&self, span: Span, ident: ast::Ident) -> ast::Lifetime {
|
fn lifetime(&self, span: Span, ident: ast::Ident) -> ast::Lifetime {
|
||||||
|
|
|
@ -678,10 +678,12 @@ pub fn noop_fold_fn_decl<T: Folder>(decl: P<FnDecl>, fld: &mut T) -> P<FnDecl> {
|
||||||
|
|
||||||
pub fn noop_fold_param_bound<T>(pb: GenericBound, fld: &mut T) -> GenericBound where T: Folder {
|
pub fn noop_fold_param_bound<T>(pb: GenericBound, fld: &mut T) -> GenericBound where T: Folder {
|
||||||
match pb {
|
match pb {
|
||||||
Trait(ty, modifier) => {
|
GenericBound::Trait(ty, modifier) => {
|
||||||
Trait(fld.fold_poly_trait_ref(ty), modifier)
|
GenericBound::Trait(fld.fold_poly_trait_ref(ty), modifier)
|
||||||
|
}
|
||||||
|
GenericBound::Outlives(lifetime) => {
|
||||||
|
GenericBound::Outlives(noop_fold_lifetime(lifetime, fld))
|
||||||
}
|
}
|
||||||
Outlives(lifetime) => Outlives(noop_fold_lifetime(lifetime, fld)),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -10,7 +10,7 @@
|
||||||
|
|
||||||
use rustc_target::spec::abi::{self, Abi};
|
use rustc_target::spec::abi::{self, Abi};
|
||||||
use ast::{AngleBracketedArgs, ParenthesizedArgData, AttrStyle, BareFnTy};
|
use ast::{AngleBracketedArgs, ParenthesizedArgData, AttrStyle, BareFnTy};
|
||||||
use ast::{Outlives, Trait, TraitBoundModifier};
|
use ast::{GenericBound, TraitBoundModifier};
|
||||||
use ast::Unsafety;
|
use ast::Unsafety;
|
||||||
use ast::{Mod, AnonConst, Arg, Arm, Attribute, BindingMode, TraitItemKind};
|
use ast::{Mod, AnonConst, Arg, Arm, Attribute, BindingMode, TraitItemKind};
|
||||||
use ast::Block;
|
use ast::Block;
|
||||||
|
@ -1444,7 +1444,7 @@ impl<'a> Parser<'a> {
|
||||||
TyKind::TraitObject(ref bounds, TraitObjectSyntax::None)
|
TyKind::TraitObject(ref bounds, TraitObjectSyntax::None)
|
||||||
if maybe_bounds && bounds.len() == 1 && !trailing_plus => {
|
if maybe_bounds && bounds.len() == 1 && !trailing_plus => {
|
||||||
let path = match bounds[0] {
|
let path = match bounds[0] {
|
||||||
Trait(ref pt, ..) => pt.trait_ref.path.clone(),
|
GenericBound::Trait(ref pt, ..) => pt.trait_ref.path.clone(),
|
||||||
_ => self.bug("unexpected lifetime bound"),
|
_ => self.bug("unexpected lifetime bound"),
|
||||||
};
|
};
|
||||||
self.parse_remaining_bounds(Vec::new(), path, lo, true)?
|
self.parse_remaining_bounds(Vec::new(), path, lo, true)?
|
||||||
|
@ -1566,7 +1566,7 @@ impl<'a> Parser<'a> {
|
||||||
fn parse_remaining_bounds(&mut self, generic_params: Vec<GenericParam>, path: ast::Path,
|
fn parse_remaining_bounds(&mut self, generic_params: Vec<GenericParam>, path: ast::Path,
|
||||||
lo: Span, parse_plus: bool) -> PResult<'a, TyKind> {
|
lo: Span, parse_plus: bool) -> PResult<'a, TyKind> {
|
||||||
let poly_trait_ref = PolyTraitRef::new(generic_params, path, lo.to(self.prev_span));
|
let poly_trait_ref = PolyTraitRef::new(generic_params, path, lo.to(self.prev_span));
|
||||||
let mut bounds = vec![Trait(poly_trait_ref, TraitBoundModifier::None)];
|
let mut bounds = vec![GenericBound::Trait(poly_trait_ref, TraitBoundModifier::None)];
|
||||||
if parse_plus {
|
if parse_plus {
|
||||||
self.eat_plus(); // `+`, or `+=` gets split and `+` is discarded
|
self.eat_plus(); // `+`, or `+=` gets split and `+` is discarded
|
||||||
bounds.append(&mut self.parse_ty_param_bounds()?);
|
bounds.append(&mut self.parse_ty_param_bounds()?);
|
||||||
|
@ -4752,7 +4752,7 @@ impl<'a> Parser<'a> {
|
||||||
self.span_err(question_span,
|
self.span_err(question_span,
|
||||||
"`?` may only modify trait bounds, not lifetime bounds");
|
"`?` may only modify trait bounds, not lifetime bounds");
|
||||||
}
|
}
|
||||||
bounds.push(Outlives(self.expect_lifetime()));
|
bounds.push(GenericBound::Outlives(self.expect_lifetime()));
|
||||||
if has_parens {
|
if has_parens {
|
||||||
self.expect(&token::CloseDelim(token::Paren))?;
|
self.expect(&token::CloseDelim(token::Paren))?;
|
||||||
self.span_err(self.prev_span,
|
self.span_err(self.prev_span,
|
||||||
|
@ -4770,7 +4770,7 @@ impl<'a> Parser<'a> {
|
||||||
} else {
|
} else {
|
||||||
TraitBoundModifier::None
|
TraitBoundModifier::None
|
||||||
};
|
};
|
||||||
bounds.push(Trait(poly_trait, modifier));
|
bounds.push(GenericBound::Trait(poly_trait, modifier));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
break
|
break
|
||||||
|
|
|
@ -12,7 +12,7 @@ pub use self::AnnNode::*;
|
||||||
|
|
||||||
use rustc_target::spec::abi::{self, Abi};
|
use rustc_target::spec::abi::{self, Abi};
|
||||||
use ast::{self, BlockCheckMode, PatKind, RangeEnd, RangeSyntax};
|
use ast::{self, BlockCheckMode, PatKind, RangeEnd, RangeSyntax};
|
||||||
use ast::{SelfKind, Outlives, Trait, TraitBoundModifier};
|
use ast::{SelfKind, GenericBound, TraitBoundModifier};
|
||||||
use ast::{Attribute, MacDelimiter, GenericArg};
|
use ast::{Attribute, MacDelimiter, GenericArg};
|
||||||
use util::parser::{self, AssocOp, Fixity};
|
use util::parser::{self, AssocOp, Fixity};
|
||||||
use attr;
|
use attr;
|
||||||
|
@ -1364,7 +1364,7 @@ impl<'a> State<'a> {
|
||||||
self.print_generic_params(&generics.params)?;
|
self.print_generic_params(&generics.params)?;
|
||||||
let mut real_bounds = Vec::with_capacity(bounds.len());
|
let mut real_bounds = Vec::with_capacity(bounds.len());
|
||||||
for b in bounds.iter() {
|
for b in bounds.iter() {
|
||||||
if let Trait(ref ptr, ast::TraitBoundModifier::Maybe) = *b {
|
if let GenericBound::Trait(ref ptr, ast::TraitBoundModifier::Maybe) = *b {
|
||||||
self.s.space()?;
|
self.s.space()?;
|
||||||
self.word_space("for ?")?;
|
self.word_space("for ?")?;
|
||||||
self.print_trait_ref(&ptr.trait_ref)?;
|
self.print_trait_ref(&ptr.trait_ref)?;
|
||||||
|
@ -1390,7 +1390,7 @@ impl<'a> State<'a> {
|
||||||
let mut real_bounds = Vec::with_capacity(bounds.len());
|
let mut real_bounds = Vec::with_capacity(bounds.len());
|
||||||
// FIXME(durka) this seems to be some quite outdated syntax
|
// FIXME(durka) this seems to be some quite outdated syntax
|
||||||
for b in bounds.iter() {
|
for b in bounds.iter() {
|
||||||
if let Trait(ref ptr, ast::TraitBoundModifier::Maybe) = *b {
|
if let GenericBound::Trait(ref ptr, ast::TraitBoundModifier::Maybe) = *b {
|
||||||
self.s.space()?;
|
self.s.space()?;
|
||||||
self.word_space("for ?")?;
|
self.word_space("for ?")?;
|
||||||
self.print_trait_ref(&ptr.trait_ref)?;
|
self.print_trait_ref(&ptr.trait_ref)?;
|
||||||
|
@ -2826,13 +2826,13 @@ impl<'a> State<'a> {
|
||||||
}
|
}
|
||||||
|
|
||||||
match bound {
|
match bound {
|
||||||
Trait(tref, modifier) => {
|
GenericBound::Trait(tref, modifier) => {
|
||||||
if modifier == &TraitBoundModifier::Maybe {
|
if modifier == &TraitBoundModifier::Maybe {
|
||||||
self.s.word("?")?;
|
self.s.word("?")?;
|
||||||
}
|
}
|
||||||
self.print_poly_trait_ref(tref)?;
|
self.print_poly_trait_ref(tref)?;
|
||||||
}
|
}
|
||||||
Outlives(lt) => self.print_lifetime(*lt)?,
|
GenericBound::Outlives(lt) => self.print_lifetime(*lt)?,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -481,12 +481,8 @@ pub fn walk_global_asm<'a, V: Visitor<'a>>(_: &mut V, _: &'a GlobalAsm) {
|
||||||
|
|
||||||
pub fn walk_param_bound<'a, V: Visitor<'a>>(visitor: &mut V, bound: &'a GenericBound) {
|
pub fn walk_param_bound<'a, V: Visitor<'a>>(visitor: &mut V, bound: &'a GenericBound) {
|
||||||
match *bound {
|
match *bound {
|
||||||
Trait(ref typ, ref modifier) => {
|
GenericBound::Trait(ref typ, ref modifier) => visitor.visit_poly_trait_ref(typ, modifier),
|
||||||
visitor.visit_poly_trait_ref(typ, modifier);
|
GenericBound::Outlives(ref lifetime) => visitor.visit_lifetime(lifetime),
|
||||||
}
|
|
||||||
Outlives(ref lifetime) => {
|
|
||||||
visitor.visit_lifetime(lifetime);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue