TAIT: use hack in ->HIR to avoid more changes
This commit is contained in:
parent
0e8e176b69
commit
aa6a72f4a5
@ -452,7 +452,6 @@ fn visit_item(&mut self, item: &'tcx Item) {
|
||||
| ItemKind::Union(_, ref generics)
|
||||
| ItemKind::Enum(_, ref generics)
|
||||
| ItemKind::TyAlias(_, ref generics)
|
||||
| ItemKind::OpaqueTy(_, ref generics)
|
||||
| ItemKind::Trait(_, _, ref generics, ..) => {
|
||||
let def_id = self.lctx.resolver.definitions().local_def_id(item.id);
|
||||
let count = generics
|
||||
|
@ -335,20 +335,22 @@ fn lower_item_kind(
|
||||
ItemKind::Mod(ref m) => hir::ItemKind::Mod(self.lower_mod(m)),
|
||||
ItemKind::ForeignMod(ref nm) => hir::ItemKind::ForeignMod(self.lower_foreign_mod(nm)),
|
||||
ItemKind::GlobalAsm(ref ga) => hir::ItemKind::GlobalAsm(self.lower_global_asm(ga)),
|
||||
ItemKind::TyAlias(ref t, ref generics) => hir::ItemKind::TyAlias(
|
||||
self.lower_ty(t, ImplTraitContext::disallowed()),
|
||||
self.lower_generics(generics, ImplTraitContext::disallowed()),
|
||||
),
|
||||
ItemKind::OpaqueTy(ref b, ref generics) => hir::ItemKind::OpaqueTy(
|
||||
hir::OpaqueTy {
|
||||
generics: self.lower_generics(generics,
|
||||
ImplTraitContext::OpaqueTy(None)),
|
||||
bounds: self.lower_param_bounds(b,
|
||||
ImplTraitContext::OpaqueTy(None)),
|
||||
impl_trait_fn: None,
|
||||
origin: hir::OpaqueTyOrigin::TypeAlias,
|
||||
ItemKind::TyAlias(ref ty, ref generics) => match ty.kind.opaque_top_hack() {
|
||||
None => {
|
||||
let ty = self.lower_ty(ty, ImplTraitContext::disallowed());
|
||||
let generics = self.lower_generics(generics, ImplTraitContext::disallowed());
|
||||
hir::ItemKind::TyAlias(ty, generics)
|
||||
},
|
||||
),
|
||||
Some(bounds) => {
|
||||
let ty = hir::OpaqueTy {
|
||||
generics: self.lower_generics(generics, ImplTraitContext::OpaqueTy(None)),
|
||||
bounds: self.lower_param_bounds(bounds, ImplTraitContext::OpaqueTy(None)),
|
||||
impl_trait_fn: None,
|
||||
origin: hir::OpaqueTyOrigin::TypeAlias,
|
||||
};
|
||||
hir::ItemKind::OpaqueTy(ty)
|
||||
}
|
||||
}
|
||||
ItemKind::Enum(ref enum_definition, ref generics) => {
|
||||
hir::ItemKind::Enum(
|
||||
hir::EnumDef {
|
||||
@ -914,16 +916,20 @@ fn lower_impl_item(&mut self, i: &ImplItem) -> hir::ImplItem {
|
||||
|
||||
(generics, hir::ImplItemKind::Method(sig, body_id))
|
||||
}
|
||||
ImplItemKind::TyAlias(ref ty) => (
|
||||
self.lower_generics(&i.generics, ImplTraitContext::disallowed()),
|
||||
hir::ImplItemKind::TyAlias(self.lower_ty(ty, ImplTraitContext::disallowed())),
|
||||
),
|
||||
ImplItemKind::OpaqueTy(ref bounds) => (
|
||||
self.lower_generics(&i.generics, ImplTraitContext::disallowed()),
|
||||
hir::ImplItemKind::OpaqueTy(
|
||||
self.lower_param_bounds(bounds, ImplTraitContext::disallowed()),
|
||||
),
|
||||
),
|
||||
ImplItemKind::TyAlias(ref ty) => {
|
||||
let generics = self.lower_generics(&i.generics, ImplTraitContext::disallowed());
|
||||
let kind = match ty.kind.opaque_top_hack() {
|
||||
None => {
|
||||
let ty = self.lower_ty(ty, ImplTraitContext::disallowed());
|
||||
hir::ImplItemKind::TyAlias(ty)
|
||||
}
|
||||
Some(bs) => {
|
||||
let bounds = self.lower_param_bounds(bs, ImplTraitContext::disallowed());
|
||||
hir::ImplItemKind::OpaqueTy(bounds)
|
||||
}
|
||||
};
|
||||
(generics, kind)
|
||||
},
|
||||
ImplItemKind::Macro(..) => bug!("`TyMac` should have been expanded by now"),
|
||||
};
|
||||
|
||||
@ -948,11 +954,13 @@ fn lower_impl_item_ref(&mut self, i: &ImplItem) -> hir::ImplItemRef {
|
||||
span: i.span,
|
||||
vis: self.lower_visibility(&i.vis, Some(i.id)),
|
||||
defaultness: self.lower_defaultness(i.defaultness, true /* [1] */),
|
||||
kind: match i.kind {
|
||||
kind: match &i.kind {
|
||||
ImplItemKind::Const(..) => hir::AssocItemKind::Const,
|
||||
ImplItemKind::TyAlias(..) => hir::AssocItemKind::Type,
|
||||
ImplItemKind::OpaqueTy(..) => hir::AssocItemKind::OpaqueTy,
|
||||
ImplItemKind::Method(ref sig, _) => hir::AssocItemKind::Method {
|
||||
ImplItemKind::TyAlias(ty) => match ty.kind.opaque_top_hack() {
|
||||
None => hir::AssocItemKind::Type,
|
||||
Some(_) => hir::AssocItemKind::OpaqueTy,
|
||||
},
|
||||
ImplItemKind::Method(sig, _) => hir::AssocItemKind::Method {
|
||||
has_self: sig.decl.has_self(),
|
||||
},
|
||||
ImplItemKind::Macro(..) => unimplemented!(),
|
||||
|
@ -107,7 +107,7 @@ fn visit_item(&mut self, i: &'a Item) {
|
||||
}
|
||||
ItemKind::Mod(..) | ItemKind::Trait(..) | ItemKind::TraitAlias(..) |
|
||||
ItemKind::Enum(..) | ItemKind::Struct(..) | ItemKind::Union(..) |
|
||||
ItemKind::OpaqueTy(..) | ItemKind::ExternCrate(..) | ItemKind::ForeignMod(..) |
|
||||
ItemKind::ExternCrate(..) | ItemKind::ForeignMod(..) |
|
||||
ItemKind::TyAlias(..) => DefPathData::TypeNs(i.ident.name),
|
||||
ItemKind::Fn(sig, generics, body) if sig.header.asyncness.node.is_async() => {
|
||||
return self.visit_async_fn(
|
||||
@ -239,8 +239,7 @@ fn visit_impl_item(&mut self, ii: &'a ImplItem) {
|
||||
}
|
||||
ImplItemKind::Method(..) |
|
||||
ImplItemKind::Const(..) => DefPathData::ValueNs(ii.ident.name),
|
||||
ImplItemKind::TyAlias(..) |
|
||||
ImplItemKind::OpaqueTy(..) => DefPathData::TypeNs(ii.ident.name),
|
||||
ImplItemKind::TyAlias(..) => DefPathData::TypeNs(ii.ident.name),
|
||||
ImplItemKind::Macro(..) => return self.visit_macro_invoc(ii.id),
|
||||
};
|
||||
|
||||
|
@ -1815,6 +1815,15 @@ pub fn is_unit(&self) -> bool {
|
||||
false
|
||||
}
|
||||
}
|
||||
|
||||
/// HACK(type_alias_impl_trait, Centril): A temporary crutch used
|
||||
/// in lowering to avoid making larger changes there and beyond.
|
||||
pub fn opaque_top_hack(&self) -> Option<&GenericBounds> {
|
||||
match self {
|
||||
Self::ImplTrait(_, bounds) => Some(bounds),
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Syntax used to declare a trait object.
|
||||
|
Loading…
Reference in New Issue
Block a user