Unnamed repository; edit this file 'description' to name the repository.
-rw-r--r--crates/hir/src/lib.rs124
-rw-r--r--crates/hir/src/source_analyzer.rs10
-rw-r--r--crates/hir_def/src/resolver.rs8
3 files changed, 55 insertions, 87 deletions
diff --git a/crates/hir/src/lib.rs b/crates/hir/src/lib.rs
index df17b75c05..06056217fd 100644
--- a/crates/hir/src/lib.rs
+++ b/crates/hir/src/lib.rs
@@ -809,7 +809,7 @@ impl Field {
};
let substs = TyBuilder::placeholder_subst(db, generic_def_id);
let ty = db.field_types(var_id)[self.id].clone().substitute(Interner, &substs);
- Type::new(db, self.parent.module(db).id.krate(), var_id, ty)
+ Type::new(db, var_id, ty)
}
pub fn parent_def(&self, _db: &dyn HirDatabase) -> VariantDef {
@@ -850,7 +850,7 @@ impl Struct {
}
pub fn ty(self, db: &dyn HirDatabase) -> Type {
- Type::from_def(db, self.id.lookup(db.upcast()).container.krate(), self.id)
+ Type::from_def(db, self.id)
}
pub fn repr(self, db: &dyn HirDatabase) -> Option<ReprKind> {
@@ -887,7 +887,7 @@ impl Union {
}
pub fn ty(self, db: &dyn HirDatabase) -> Type {
- Type::from_def(db, self.id.lookup(db.upcast()).container.krate(), self.id)
+ Type::from_def(db, self.id)
}
pub fn fields(self, db: &dyn HirDatabase) -> Vec<Field> {
@@ -929,7 +929,7 @@ impl Enum {
}
pub fn ty(self, db: &dyn HirDatabase) -> Type {
- Type::from_def(db, self.id.lookup(db.upcast()).container.krate(), self.id)
+ Type::from_def(db, self.id)
}
}
@@ -1005,7 +1005,7 @@ impl Adt {
/// general set of completions, but will not look very nice when printed.
pub fn ty(self, db: &dyn HirDatabase) -> Type {
let id = AdtId::from(self);
- Type::from_def(db, id.module(db.upcast()).krate(), id)
+ Type::from_def(db, id)
}
/// Turns this ADT into a type with the given type parameters. This isn't
@@ -1022,8 +1022,7 @@ impl Adt {
}
})
.build();
- let krate = id.module(db.upcast()).krate();
- Type::new(db, krate, id, ty)
+ Type::new(db, id, ty)
}
pub fn module(self, db: &dyn HirDatabase) -> Module {
@@ -1213,18 +1212,8 @@ impl DefWithBody {
acc.push(
TypeMismatch {
expr,
- expected: Type::new(
- db,
- krate,
- DefWithBodyId::from(self),
- mismatch.expected.clone(),
- ),
- actual: Type::new(
- db,
- krate,
- DefWithBodyId::from(self),
- mismatch.actual.clone(),
- ),
+ expected: Type::new(db, DefWithBodyId::from(self), mismatch.expected.clone()),
+ actual: Type::new(db, DefWithBodyId::from(self), mismatch.actual.clone()),
}
.into(),
);
@@ -1369,11 +1358,10 @@ impl Function {
/// Get this function's return type
pub fn ret_type(self, db: &dyn HirDatabase) -> Type {
let resolver = self.id.resolver(db.upcast());
- let krate = self.krate_id(db);
let ret_type = &db.function_data(self.id).ret_type;
let ctx = hir_ty::TyLoweringContext::new(db, &resolver);
let ty = ctx.lower_ty(ret_type);
- Type::new_with_resolver_inner(db, krate, &resolver, ty)
+ Type::new_with_resolver_inner(db, &resolver, ty)
}
pub fn self_param(self, db: &dyn HirDatabase) -> Option<SelfParam> {
@@ -1385,7 +1373,6 @@ impl Function {
pub fn assoc_fn_params(self, db: &dyn HirDatabase) -> Vec<Param> {
let resolver = self.id.resolver(db.upcast());
- let krate = self.krate_id(db);
let ctx = hir_ty::TyLoweringContext::new(db, &resolver);
let environment = db.trait_environment(self.id.into());
db.function_data(self.id)
@@ -1393,7 +1380,7 @@ impl Function {
.iter()
.enumerate()
.map(|(idx, (_, type_ref))| {
- let ty = Type { krate, env: environment.clone(), ty: ctx.lower_ty(type_ref) };
+ let ty = Type { env: environment.clone(), ty: ctx.lower_ty(type_ref) };
Param { func: self, ty, idx }
})
.collect()
@@ -1408,7 +1395,6 @@ impl Function {
pub fn params_without_self(self, db: &dyn HirDatabase) -> Vec<Param> {
let resolver = self.id.resolver(db.upcast());
- let krate = self.krate_id(db);
let ctx = hir_ty::TyLoweringContext::new(db, &resolver);
let environment = db.trait_environment(self.id.into());
let skip = if db.function_data(self.id).has_self_param() { 1 } else { 0 };
@@ -1418,7 +1404,7 @@ impl Function {
.enumerate()
.skip(skip)
.map(|(idx, (_, type_ref))| {
- let ty = Type { krate, env: environment.clone(), ty: ctx.lower_ty(type_ref) };
+ let ty = Type { env: environment.clone(), ty: ctx.lower_ty(type_ref) };
Param { func: self, ty, idx }
})
.collect()
@@ -1470,10 +1456,6 @@ impl Function {
result
}
-
- fn krate_id(self, db: &dyn HirDatabase) -> CrateId {
- self.id.lookup(db.upcast()).module(db.upcast()).krate()
- }
}
// Note: logically, this belongs to `hir_ty`, but we are not using it there yet.
@@ -1575,11 +1557,10 @@ impl SelfParam {
pub fn ty(&self, db: &dyn HirDatabase) -> Type {
let resolver = self.func.resolver(db.upcast());
- let krate = self.func.lookup(db.upcast()).container.module(db.upcast()).krate();
let ctx = hir_ty::TyLoweringContext::new(db, &resolver);
let environment = db.trait_environment(self.func.into());
- Type { krate, env: environment, ty: ctx.lower_ty(&db.function_data(self.func).params[0].1) }
+ Type { env: environment, ty: ctx.lower_ty(&db.function_data(self.func).params[0].1) }
}
}
@@ -1610,10 +1591,9 @@ impl Const {
pub fn ty(self, db: &dyn HirDatabase) -> Type {
let data = db.const_data(self.id);
let resolver = self.id.resolver(db.upcast());
- let krate = self.id.lookup(db.upcast()).container.krate(db);
let ctx = hir_ty::TyLoweringContext::new(db, &resolver);
let ty = ctx.lower_ty(&data.type_ref);
- Type::new_with_resolver_inner(db, krate.id, &resolver, ty)
+ Type::new_with_resolver_inner(db, &resolver, ty)
}
pub fn eval(self, db: &dyn HirDatabase) -> Result<ComputedExpr, ConstEvalError> {
@@ -1652,10 +1632,9 @@ impl Static {
pub fn ty(self, db: &dyn HirDatabase) -> Type {
let data = db.static_data(self.id);
let resolver = self.id.resolver(db.upcast());
- let krate = self.id.lookup(db.upcast()).container.module(db.upcast()).krate();
let ctx = hir_ty::TyLoweringContext::new(db, &resolver);
let ty = ctx.lower_ty(&data.type_ref);
- Type::new_with_resolver_inner(db, krate, &resolver, ty)
+ Type::new_with_resolver_inner(db, &resolver, ty)
}
}
@@ -1727,7 +1706,7 @@ impl TypeAlias {
}
pub fn ty(self, db: &dyn HirDatabase) -> Type {
- Type::from_def(db, self.id.lookup(db.upcast()).module(db.upcast()).krate(), self.id)
+ Type::from_def(db, self.id)
}
pub fn name(self, db: &dyn HirDatabase) -> Name {
@@ -2185,8 +2164,7 @@ impl Local {
let def = self.parent;
let infer = db.infer(def);
let ty = infer[self.pat_id].clone();
- let krate = def.module(db.upcast()).krate();
- Type::new(db, krate, def, ty)
+ Type::new(db, def, ty)
}
pub fn associated_locals(self, db: &dyn HirDatabase) -> Box<[Local]> {
@@ -2373,10 +2351,9 @@ impl TypeParam {
pub fn ty(self, db: &dyn HirDatabase) -> Type {
let resolver = self.id.parent().resolver(db.upcast());
- let krate = self.id.parent().module(db.upcast()).krate();
let ty =
TyKind::Placeholder(hir_ty::to_placeholder_idx(db, self.id.into())).intern(Interner);
- Type::new_with_resolver_inner(db, krate, &resolver, ty)
+ Type::new_with_resolver_inner(db, &resolver, ty)
}
/// FIXME: this only lists trait bounds from the item defining the type
@@ -2398,14 +2375,11 @@ impl TypeParam {
let params = db.generic_defaults(self.id.parent());
let local_idx = hir_ty::param_idx(db, self.id.into())?;
let resolver = self.id.parent().resolver(db.upcast());
- let krate = self.id.parent().module(db.upcast()).krate();
let ty = params.get(local_idx)?.clone();
let subst = TyBuilder::placeholder_subst(db, self.id.parent());
let ty = ty.substitute(Interner, &subst_prefix(&subst, local_idx));
match ty.data(Interner) {
- GenericArgData::Ty(x) => {
- Some(Type::new_with_resolver_inner(db, krate, &resolver, x.clone()))
- }
+ GenericArgData::Ty(x) => Some(Type::new_with_resolver_inner(db, &resolver, x.clone())),
_ => None,
}
}
@@ -2461,9 +2435,7 @@ impl ConstParam {
}
pub fn ty(self, db: &dyn HirDatabase) -> Type {
- let def = self.id.parent();
- let krate = def.module(db.upcast()).krate();
- Type::new(db, krate, def, db.const_param_ty(self.id))
+ Type::new(db, self.id.parent(), db.const_param_ty(self.id))
}
}
@@ -2522,8 +2494,8 @@ impl Impl {
inherent.all_impls().chain(trait_.all_impls()).map(Self::from).collect()
}
- pub fn all_for_type(db: &dyn HirDatabase, Type { krate, ty, .. }: Type) -> Vec<Impl> {
- let def_crates = match method_resolution::def_crates(db, &ty, krate) {
+ pub fn all_for_type(db: &dyn HirDatabase, Type { ty, env }: Type) -> Vec<Impl> {
+ let def_crates = match method_resolution::def_crates(db, &ty, env.krate) {
Some(def_crates) => def_crates,
None => return Vec::new(),
};
@@ -2589,10 +2561,9 @@ impl Impl {
pub fn self_ty(self, db: &dyn HirDatabase) -> Type {
let impl_data = db.impl_data(self.id);
let resolver = self.id.resolver(db.upcast());
- let krate = self.id.lookup(db.upcast()).container.krate();
let ctx = hir_ty::TyLoweringContext::new(db, &resolver);
let ty = ctx.lower_ty(&impl_data.self_ty);
- Type::new_with_resolver_inner(db, krate, &resolver, ty)
+ Type::new_with_resolver_inner(db, &resolver, ty)
}
pub fn items(self, db: &dyn HirDatabase) -> Vec<AssocItem> {
@@ -2615,31 +2586,29 @@ impl Impl {
#[derive(Clone, PartialEq, Eq, Debug)]
pub struct Type {
- krate: CrateId, // FIXME this is probably redundant with the TraitEnvironment
env: Arc<TraitEnvironment>,
ty: Ty,
}
impl Type {
pub(crate) fn new_with_resolver(db: &dyn HirDatabase, resolver: &Resolver, ty: Ty) -> Type {
- let krate = resolver.krate();
- Type::new_with_resolver_inner(db, krate, resolver, ty)
+ Type::new_with_resolver_inner(db, resolver, ty)
}
pub(crate) fn new_with_resolver_inner(
db: &dyn HirDatabase,
- krate: CrateId,
resolver: &Resolver,
ty: Ty,
) -> Type {
- let environment = resolver
- .generic_def()
- .map_or_else(|| Arc::new(TraitEnvironment::empty(krate)), |d| db.trait_environment(d));
- Type { krate, env: environment, ty }
+ let environment = resolver.generic_def().map_or_else(
+ || Arc::new(TraitEnvironment::empty(resolver.krate())),
+ |d| db.trait_environment(d),
+ );
+ Type { env: environment, ty }
}
pub(crate) fn new_for_crate(krate: CrateId, ty: Ty) -> Type {
- Type { krate, env: Arc::new(TraitEnvironment::empty(krate)), ty }
+ Type { env: Arc::new(TraitEnvironment::empty(krate)), ty }
}
pub fn reference(inner: &Type, m: Mutability) -> Type {
@@ -2653,25 +2622,22 @@ impl Type {
)
}
- fn new(db: &dyn HirDatabase, krate: CrateId, lexical_env: impl HasResolver, ty: Ty) -> Type {
+ fn new(db: &dyn HirDatabase, lexical_env: impl HasResolver, ty: Ty) -> Type {
let resolver = lexical_env.resolver(db.upcast());
- let environment = resolver
- .generic_def()
- .map_or_else(|| Arc::new(TraitEnvironment::empty(krate)), |d| db.trait_environment(d));
- Type { krate, env: environment, ty }
+ let environment = resolver.generic_def().map_or_else(
+ || Arc::new(TraitEnvironment::empty(resolver.krate())),
+ |d| db.trait_environment(d),
+ );
+ Type { env: environment, ty }
}
- fn from_def(
- db: &dyn HirDatabase,
- krate: CrateId,
- def: impl HasResolver + Into<TyDefId>,
- ) -> Type {
+ fn from_def(db: &dyn HirDatabase, def: impl HasResolver + Into<TyDefId>) -> Type {
let ty = TyBuilder::def_ty(db, def.into()).fill_with_unknown().build();
- Type::new(db, krate, def, ty)
+ Type::new(db, def, ty)
}
pub fn new_slice(ty: Type) -> Type {
- Type { krate: ty.krate, env: ty.env, ty: TyBuilder::slice(ty.ty) }
+ Type { env: ty.env, ty: TyBuilder::slice(ty.ty) }
}
pub fn is_unit(&self) -> bool {
@@ -2727,7 +2693,7 @@ impl Type {
/// This function is used in `.await` syntax completion.
pub fn impls_future(&self, db: &dyn HirDatabase) -> bool {
let std_future_trait = db
- .lang_item(self.krate, SmolStr::new_inline("future_trait"))
+ .lang_item(self.env.krate, SmolStr::new_inline("future_trait"))
.and_then(|it| it.as_trait());
let std_future_trait = match std_future_trait {
Some(it) => it,
@@ -2744,7 +2710,7 @@ impl Type {
/// This function can be used to check if a particular type is callable, since FnOnce is a
/// supertrait of Fn and FnMut, so all callable types implements at least FnOnce.
pub fn impls_fnonce(&self, db: &dyn HirDatabase) -> bool {
- let fnonce_trait = match FnTrait::FnOnce.get_id(db, self.krate) {
+ let fnonce_trait = match FnTrait::FnOnce.get_id(db, self.env.krate) {
Some(it) => it,
None => return false,
};
@@ -2780,7 +2746,7 @@ impl Type {
binders: CanonicalVarKinds::empty(Interner),
};
- db.trait_solve(self.krate, goal).is_some()
+ db.trait_solve(self.env.krate, goal).is_some()
}
pub fn normalize_trait_assoc_type(
@@ -2815,7 +2781,7 @@ impl Type {
[TyVariableKind::General].into_iter(),
);
- match db.trait_solve(self.krate, goal)? {
+ match db.trait_solve(self.env.krate, goal)? {
Solution::Unique(s) => s
.value
.subst
@@ -2827,7 +2793,7 @@ impl Type {
}
pub fn is_copy(&self, db: &dyn HirDatabase) -> bool {
- let lang_item = db.lang_item(self.krate, SmolStr::new_inline("copy"));
+ let lang_item = db.lang_item(self.env.krate, SmolStr::new_inline("copy"));
let copy_trait = match lang_item {
Some(LangItemTarget::TraitId(it)) => it,
_ => return false,
@@ -3170,7 +3136,7 @@ impl Type {
}
fn derived(&self, ty: Ty) -> Type {
- Type { krate: self.krate, env: self.env.clone(), ty }
+ Type { env: self.env.clone(), ty }
}
pub fn walk(&self, db: &dyn HirDatabase, mut cb: impl FnMut(Type)) {
@@ -3480,7 +3446,7 @@ impl HasCrate for TypeAlias {
impl HasCrate for Type {
fn krate(&self, _db: &dyn HirDatabase) -> Crate {
- self.krate.into()
+ self.env.krate.into()
}
}
diff --git a/crates/hir/src/source_analyzer.rs b/crates/hir/src/source_analyzer.rs
index 89ba16d087..35aef32824 100644
--- a/crates/hir/src/source_analyzer.rs
+++ b/crates/hir/src/source_analyzer.rs
@@ -44,7 +44,6 @@ use crate::{
Field, Function, Local, Macro, ModuleDef, Static, Struct, ToolModule, Trait, Type, TypeAlias,
Variant,
};
-use base_db::CrateId;
/// `SourceAnalyzer` is a convenience wrapper which exposes HIR API in terms of
/// original source files. It should not be used inside the HIR itself.
@@ -414,7 +413,6 @@ impl SourceAnalyzer {
db: &dyn HirDatabase,
literal: &ast::RecordExpr,
) -> Option<Vec<(Field, Type)>> {
- let krate = self.resolver.krate();
let body = self.body()?;
let infer = self.infer.as_ref()?;
@@ -423,7 +421,7 @@ impl SourceAnalyzer {
let (variant, missing_fields, _exhaustive) =
record_literal_missing_fields(db, infer, expr_id, &body[expr_id])?;
- let res = self.missing_fields(db, krate, substs, variant, missing_fields);
+ let res = self.missing_fields(db, substs, variant, missing_fields);
Some(res)
}
@@ -432,7 +430,6 @@ impl SourceAnalyzer {
db: &dyn HirDatabase,
pattern: &ast::RecordPat,
) -> Option<Vec<(Field, Type)>> {
- let krate = self.resolver.krate();
let body = self.body()?;
let infer = self.infer.as_ref()?;
@@ -441,14 +438,13 @@ impl SourceAnalyzer {
let (variant, missing_fields, _exhaustive) =
record_pattern_missing_fields(db, infer, pat_id, &body[pat_id])?;
- let res = self.missing_fields(db, krate, substs, variant, missing_fields);
+ let res = self.missing_fields(db, substs, variant, missing_fields);
Some(res)
}
fn missing_fields(
&self,
db: &dyn HirDatabase,
- krate: CrateId,
substs: &Substitution,
variant: VariantId,
missing_fields: Vec<LocalFieldId>,
@@ -460,7 +456,7 @@ impl SourceAnalyzer {
.map(|local_id| {
let field = FieldId { parent: variant, local_id };
let ty = field_types[local_id].clone().substitute(Interner, substs);
- (field.into(), Type::new_with_resolver_inner(db, krate, &self.resolver, ty))
+ (field.into(), Type::new_with_resolver_inner(db, &self.resolver, ty))
})
.collect()
}
diff --git a/crates/hir_def/src/resolver.rs b/crates/hir_def/src/resolver.rs
index 2a990765ea..f3dcdcfa4a 100644
--- a/crates/hir_def/src/resolver.rs
+++ b/crates/hir_def/src/resolver.rs
@@ -448,7 +448,13 @@ impl Resolver {
}
pub fn krate(&self) -> CrateId {
- self.module_scope().0.krate()
+ self.scopes
+ .get(0)
+ .and_then(|scope| match scope {
+ Scope::ModuleScope(m) => Some(m.def_map.krate()),
+ _ => None,
+ })
+ .expect("module scope invariant violated")
}
pub fn where_predicates_in_scope(