diff --git a/crates/hir_def/src/data.rs b/crates/hir_def/src/data.rs index 9a8eb4edec7c..6190906da985 100644 --- a/crates/hir_def/src/data.rs +++ b/crates/hir_def/src/data.rs @@ -54,6 +54,7 @@ pub struct TypeAliasData { pub name: Name, pub type_ref: Option, pub visibility: RawVisibility, + pub is_extern: bool, /// Bounds restricting the type alias itself (eg. `type Ty: Bound;` in a trait or impl). pub bounds: Vec, } @@ -71,6 +72,7 @@ impl TypeAliasData { name: typ.name.clone(), type_ref: typ.type_ref.clone(), visibility: item_tree[typ.visibility].clone(), + is_extern: typ.is_extern, bounds: typ.bounds.to_vec(), }) } diff --git a/crates/hir_ty/src/lower.rs b/crates/hir_ty/src/lower.rs index cd574e983f90..39252bc5e2cb 100644 --- a/crates/hir_ty/src/lower.rs +++ b/crates/hir_ty/src/lower.rs @@ -1101,9 +1101,13 @@ fn type_for_type_alias(db: &dyn HirDatabase, t: TypeAliasId) -> Binders { let resolver = t.resolver(db.upcast()); let ctx = TyLoweringContext::new(db, &resolver).with_type_param_mode(TypeParamLoweringMode::Variable); - let type_ref = &db.type_alias_data(t).type_ref; let substs = Substs::bound_vars(&generics, DebruijnIndex::INNERMOST); - let inner = Ty::from_hir(&ctx, type_ref.as_ref().unwrap_or(&TypeRef::Error)); + let inner = if db.type_alias_data(t).is_extern { + Ty::simple(TypeCtor::ForeignType(t)) + } else { + let type_ref = &db.type_alias_data(t).type_ref; + Ty::from_hir(&ctx, type_ref.as_ref().unwrap_or(&TypeRef::Error)) + }; Binders::new(substs.len(), inner) }