]> git.lizzy.rs Git - rust.git/commitdiff
Use chalk_ir::FnDefId
authorFlorian Diebold <flodiebold@gmail.com>
Sat, 13 Mar 2021 16:55:50 +0000 (17:55 +0100)
committerFlorian Diebold <flodiebold@gmail.com>
Sat, 13 Mar 2021 16:56:48 +0000 (17:56 +0100)
crates/hir/src/lib.rs
crates/hir_ty/src/db.rs
crates/hir_ty/src/diagnostics/unsafe_check.rs
crates/hir_ty/src/display.rs
crates/hir_ty/src/infer/expr.rs
crates/hir_ty/src/lib.rs
crates/hir_ty/src/lower.rs
crates/hir_ty/src/traits/chalk.rs
crates/hir_ty/src/traits/chalk/interner.rs
crates/hir_ty/src/traits/chalk/mapping.rs

index f15fb1a8276c0f0e818c0a94475857da4482a7ad..7f8f936d3bc7d6d3b40bf53797f83c8cb4e1ef5b 100644 (file)
@@ -1715,10 +1715,7 @@ pub fn is_copy(&self, db: &dyn HirDatabase) -> bool {
     }
 
     pub fn as_callable(&self, db: &dyn HirDatabase) -> Option<Callable> {
-        let def = match self.ty.value.interned(&Interner) {
-            &TyKind::FnDef(def, _) => Some(def),
-            _ => None,
-        };
+        let def = self.ty.value.callable_def(db);
 
         let sig = self.ty.value.callable_sig(db)?;
         Some(Callable { ty: self.clone(), sig, def, is_bound_method: false })
index 06714409fffb9b1758f807181e54d178e4f96aa7..a038674cf6a11ffc5afcaa989cbde4f16c308678 100644 (file)
@@ -12,7 +12,7 @@
 use crate::{
     method_resolution::{InherentImpls, TraitImpls},
     traits::chalk,
-    Binders, CallableDefId, GenericPredicate, InferenceResult, OpaqueTyId, PolyFnSig,
+    Binders, CallableDefId, FnDefId, GenericPredicate, InferenceResult, OpaqueTyId, PolyFnSig,
     ReturnTypeImplTraits, TraitRef, Ty, TyDefId, ValueTyDefId,
 };
 use hir_expand::name::Name;
@@ -100,10 +100,10 @@ fn generic_predicates_for_param(
     fn impl_datum(&self, krate: CrateId, impl_id: chalk::ImplId) -> Arc<chalk::ImplDatum>;
 
     #[salsa::invoke(crate::traits::chalk::fn_def_datum_query)]
-    fn fn_def_datum(&self, krate: CrateId, fn_def_id: chalk::FnDefId) -> Arc<chalk::FnDefDatum>;
+    fn fn_def_datum(&self, krate: CrateId, fn_def_id: FnDefId) -> Arc<chalk::FnDefDatum>;
 
     #[salsa::invoke(crate::traits::chalk::fn_def_variance_query)]
-    fn fn_def_variance(&self, krate: CrateId, fn_def_id: chalk::FnDefId) -> chalk::Variances;
+    fn fn_def_variance(&self, krate: CrateId, fn_def_id: FnDefId) -> chalk::Variances;
 
     #[salsa::invoke(crate::traits::chalk::adt_variance_query)]
     fn adt_variance(&self, krate: CrateId, adt_id: chalk::AdtId) -> chalk::Variances;
index e095bee28265753ebdf42f06eb52e5722fb21799..20bb6482796b1b76b07a48c1bd4669e8bca61843 100644 (file)
@@ -85,7 +85,7 @@ fn walk_unsafe(
     let expr = &body.exprs[current];
     match expr {
         &Expr::Call { callee, .. } => {
-            if let Some(func) = infer[callee].as_fn_def() {
+            if let Some(func) = infer[callee].as_fn_def(db) {
                 if db.function_data(func).is_unsafe {
                     unsafe_exprs.push(UnsafeExpr { expr: current, inside_unsafe_block });
                 }
index 2022069d8bbafd2e09b97658b809ee30860102d8..b7e85e024db41d7f6563dc97fcd531932445620b 100644 (file)
@@ -12,8 +12,9 @@
 
 use crate::{
     db::HirDatabase, from_assoc_type_id, from_foreign_def_id, primitive, to_assoc_type_id,
-    utils::generics, AdtId, AliasTy, CallableDefId, CallableSig, GenericPredicate, Interner,
-    Lifetime, Obligation, OpaqueTy, OpaqueTyId, ProjectionTy, Scalar, Substs, TraitRef, Ty, TyKind,
+    traits::chalk::from_chalk, utils::generics, AdtId, AliasTy, CallableDefId, CallableSig,
+    GenericPredicate, Interner, Lifetime, Obligation, OpaqueTy, OpaqueTyId, ProjectionTy, Scalar,
+    Substs, TraitRef, Ty, TyKind,
 };
 
 pub struct HirFormatter<'a> {
@@ -363,7 +364,7 @@ fn hir_fmt(&self, f: &mut HirFormatter) -> Result<(), HirDisplayError> {
                 sig.hir_fmt(f)?;
             }
             TyKind::FnDef(def, parameters) => {
-                let def = *def;
+                let def = from_chalk(f.db, *def);
                 let sig = f.db.callable_item_signature(def).subst(parameters);
                 match def {
                     CallableDefId::FunctionId(ff) => {
@@ -431,7 +432,7 @@ fn hir_fmt(&self, f: &mut HirFormatter) -> Result<(), HirDisplayError> {
                         || f.omit_verbose_types()
                     {
                         match self
-                            .as_generic_def()
+                            .as_generic_def(f.db)
                             .map(|generic_def_id| f.db.generic_defaults(generic_def_id))
                             .filter(|defaults| !defaults.is_empty())
                         {
index a72424dc7a4c494a4e462b7b0a74be1880344ec4..153f22f25f8c580223264dbf2c7f57b8b6b903d8 100644 (file)
@@ -19,7 +19,7 @@
     method_resolution, op,
     primitive::{self, UintTy},
     to_assoc_type_id,
-    traits::{FnTrait, InEnvironment},
+    traits::{chalk::from_chalk, FnTrait, InEnvironment},
     utils::{generics, variant_data, Generics},
     AdtId, Binders, CallableDefId, FnPointer, FnSig, Interner, Obligation, OpaqueTyId, Rawness,
     Scalar, Substs, TraitRef, Ty, TyKind,
@@ -932,8 +932,9 @@ fn substs_for_method_call(
     }
 
     fn register_obligations_for_call(&mut self, callable_ty: &Ty) {
-        if let TyKind::FnDef(def, parameters) = callable_ty.interned(&Interner) {
-            let generic_predicates = self.db.generic_predicates((*def).into());
+        if let TyKind::FnDef(fn_def, parameters) = callable_ty.interned(&Interner) {
+            let def: CallableDefId = from_chalk(self.db, *fn_def);
+            let generic_predicates = self.db.generic_predicates(def.into());
             for predicate in generic_predicates.iter() {
                 let predicate = predicate.clone().subst(parameters);
                 if let Some(obligation) = Obligation::from_predicate(predicate) {
index 5752ddc4eb71d1e63fef3b553d32c0809c8e75e2..6b34852645da0204d2c3c77272cf3b7d721e63aa 100644 (file)
@@ -53,6 +53,7 @@ macro_rules! eprintln {
 
 pub type ForeignDefId = chalk_ir::ForeignDefId<Interner>;
 pub type AssocTypeId = chalk_ir::AssocTypeId<Interner>;
+pub(crate) type FnDefId = chalk_ir::FnDefId<Interner>;
 
 #[derive(Clone, PartialEq, Eq, Debug, Hash)]
 pub enum Lifetime {
@@ -182,7 +183,7 @@ pub enum TyKind {
     /// fn foo() -> i32 { 1 }
     /// let bar = foo; // bar: fn() -> i32 {foo}
     /// ```
-    FnDef(CallableDefId, Substs),
+    FnDef(FnDefId, Substs),
 
     /// The pointee of a string slice. Written as `str`.
     Str,
@@ -703,10 +704,12 @@ pub fn as_tuple(&self) -> Option<&Substs> {
         }
     }
 
-    pub fn as_generic_def(&self) -> Option<GenericDefId> {
+    pub fn as_generic_def(&self, db: &dyn HirDatabase) -> Option<GenericDefId> {
         match *self.interned(&Interner) {
             TyKind::Adt(AdtId(adt), ..) => Some(adt.into()),
-            TyKind::FnDef(callable, ..) => Some(callable.into()),
+            TyKind::FnDef(callable, ..) => {
+                Some(db.lookup_intern_callable_def(callable.into()).into())
+            }
             TyKind::AssociatedType(type_alias, ..) => Some(from_assoc_type_id(type_alias).into()),
             TyKind::ForeignType(type_alias, ..) => Some(from_foreign_def_id(type_alias).into()),
             _ => None,
@@ -775,18 +778,27 @@ fn builtin_deref(&self) -> Option<Ty> {
         }
     }
 
-    pub fn as_fn_def(&self) -> Option<FunctionId> {
+    pub fn callable_def(&self, db: &dyn HirDatabase) -> Option<CallableDefId> {
         match self.interned(&Interner) {
-            &TyKind::FnDef(CallableDefId::FunctionId(func), ..) => Some(func),
+            &TyKind::FnDef(def, ..) => Some(db.lookup_intern_callable_def(def.into())),
             _ => None,
         }
     }
 
+    pub fn as_fn_def(&self, db: &dyn HirDatabase) -> Option<FunctionId> {
+        if let Some(CallableDefId::FunctionId(func)) = self.callable_def(db) {
+            Some(func)
+        } else {
+            None
+        }
+    }
+
     pub fn callable_sig(&self, db: &dyn HirDatabase) -> Option<CallableSig> {
         match self.interned(&Interner) {
             TyKind::Function(fn_ptr) => Some(CallableSig::from_fn_ptr(fn_ptr)),
             TyKind::FnDef(def, parameters) => {
-                let sig = db.callable_item_signature(*def);
+                let callable_def = db.lookup_intern_callable_def((*def).into());
+                let sig = db.callable_item_signature(callable_def);
                 Some(sig.subst(&parameters))
             }
             TyKind::Closure(.., substs) => {
index a5ab1ff70ab2b9008dc0ac08b11ac40d2852f4b8..b8b1400ebc5665bc2b1311d1d5e2b394605ca9c2 100644 (file)
@@ -1064,7 +1064,10 @@ fn fn_sig_for_fn(db: &dyn HirDatabase, def: FunctionId) -> PolyFnSig {
 fn type_for_fn(db: &dyn HirDatabase, def: FunctionId) -> Binders<Ty> {
     let generics = generics(db.upcast(), def.into());
     let substs = Substs::bound_vars(&generics, DebruijnIndex::INNERMOST);
-    Binders::new(substs.len(), TyKind::FnDef(def.into(), substs).intern(&Interner))
+    Binders::new(
+        substs.len(),
+        TyKind::FnDef(CallableDefId::FunctionId(def).to_chalk(db), substs).intern(&Interner),
+    )
 }
 
 /// Build the declared type of a const.
@@ -1107,7 +1110,10 @@ fn type_for_struct_constructor(db: &dyn HirDatabase, def: StructId) -> Binders<T
     }
     let generics = generics(db.upcast(), def.into());
     let substs = Substs::bound_vars(&generics, DebruijnIndex::INNERMOST);
-    Binders::new(substs.len(), TyKind::FnDef(def.into(), substs).intern(&Interner))
+    Binders::new(
+        substs.len(),
+        TyKind::FnDef(CallableDefId::StructId(def).to_chalk(db), substs).intern(&Interner),
+    )
 }
 
 fn fn_sig_for_enum_variant_constructor(db: &dyn HirDatabase, def: EnumVariantId) -> PolyFnSig {
@@ -1132,7 +1138,10 @@ fn type_for_enum_variant_constructor(db: &dyn HirDatabase, def: EnumVariantId) -
     }
     let generics = generics(db.upcast(), def.parent.into());
     let substs = Substs::bound_vars(&generics, DebruijnIndex::INNERMOST);
-    Binders::new(substs.len(), TyKind::FnDef(def.into(), substs).intern(&Interner))
+    Binders::new(
+        substs.len(),
+        TyKind::FnDef(CallableDefId::EnumVariantId(def).to_chalk(db), substs).intern(&Interner),
+    )
 }
 
 fn type_for_adt(db: &dyn HirDatabase, adt: AdtId) -> Binders<Ty> {
index 2d3cd671950ee1aeffbdc3e0da4c5560fb27ea16..bb92d8e2a77966d04ae85ea9e7e809bb12e5f3ba 100644 (file)
@@ -21,8 +21,8 @@
     method_resolution::{TyFingerprint, ALL_FLOAT_FPS, ALL_INT_FPS},
     to_assoc_type_id,
     utils::generics,
-    BoundVar, CallableDefId, CallableSig, DebruijnIndex, GenericPredicate, ProjectionPredicate,
-    ProjectionTy, Substs, TraitRef, Ty, TyKind,
+    BoundVar, CallableDefId, CallableSig, DebruijnIndex, FnDefId, GenericPredicate,
+    ProjectionPredicate, ProjectionTy, Substs, TraitRef, Ty, TyKind,
 };
 use mapping::{
     convert_where_clauses, generic_predicate_to_inline_bound, make_binders, TypeAliasAsValue,
index e891efb7ba56fb5a24879667578c267d1a989c43..1dc3f497d484eadfc14bc6e1b26b3c8bcbfb6bb6 100644 (file)
@@ -20,7 +20,6 @@
 pub(crate) type ImplDatum = chalk_solve::rust_ir::ImplDatum<Interner>;
 pub(crate) type AssociatedTyValueId = chalk_solve::rust_ir::AssociatedTyValueId<Interner>;
 pub(crate) type AssociatedTyValue = chalk_solve::rust_ir::AssociatedTyValue<Interner>;
-pub(crate) type FnDefId = chalk_ir::FnDefId<Interner>;
 pub(crate) type FnDefDatum = chalk_solve::rust_ir::FnDefDatum<Interner>;
 pub(crate) type OpaqueTyId = chalk_ir::OpaqueTyId<Interner>;
 pub(crate) type OpaqueTyDatum = chalk_solve::rust_ir::OpaqueTyDatum<Interner>;
index 67ac95a0e48eea085f94668d85072c44067b13a6..23ef07d779a8527ffea7a124e49d2376b6febfa6 100644 (file)
@@ -66,8 +66,7 @@ fn to_chalk(self, db: &dyn HirDatabase) -> chalk_ir::Ty<Interner> {
                 chalk_ir::TyKind::Slice(substs[0].clone().to_chalk(db)).intern(&Interner)
             }
             TyKind::Str => chalk_ir::TyKind::Str.intern(&Interner),
-            TyKind::FnDef(callable_def, substs) => {
-                let id = callable_def.to_chalk(db);
+            TyKind::FnDef(id, substs) => {
                 let substitution = substs.to_chalk(db);
                 chalk_ir::TyKind::FnDef(id, substitution).intern(&Interner)
             }
@@ -201,7 +200,7 @@ fn from_chalk(db: &dyn HirDatabase, chalk: chalk_ir::Ty<Interner>) -> Self {
             chalk_ir::TyKind::Never => TyKind::Never,
 
             chalk_ir::TyKind::FnDef(fn_def_id, subst) => {
-                TyKind::FnDef(from_chalk(db, fn_def_id), from_chalk(db, subst))
+                TyKind::FnDef(fn_def_id, from_chalk(db, subst))
             }
 
             chalk_ir::TyKind::Closure(id, subst) => {