aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir_ty/src/traits
diff options
context:
space:
mode:
authorAleksey Kladov <[email protected]>2020-03-13 15:05:46 +0000
committerAleksey Kladov <[email protected]>2020-03-16 16:42:30 +0000
commit9faea2364dee4fbc9391ad233c570b70256ef002 (patch)
tree160af959553ce57fdfcbc0a6c79bafcc3611aeea /crates/ra_hir_ty/src/traits
parent648df02953a6ebf87a5876668eceba208687e8a7 (diff)
Use `dyn Trait` for working with databse
It improves compile time in `--release` mode quite a bit, it doesn't really slow things down and, conceptually, it seems closer to what we want the physical architecture to look like (we don't want to monomorphise EVERYTHING in a single leaf crate).
Diffstat (limited to 'crates/ra_hir_ty/src/traits')
-rw-r--r--crates/ra_hir_ty/src/traits/builtin.rs36
-rw-r--r--crates/ra_hir_ty/src/traits/chalk.rs111
2 files changed, 70 insertions, 77 deletions
diff --git a/crates/ra_hir_ty/src/traits/builtin.rs b/crates/ra_hir_ty/src/traits/builtin.rs
index 03f9b4e27..73e3c5c78 100644
--- a/crates/ra_hir_ty/src/traits/builtin.rs
+++ b/crates/ra_hir_ty/src/traits/builtin.rs
@@ -26,7 +26,7 @@ pub(super) struct BuiltinImplAssocTyValueData {
26} 26}
27 27
28pub(super) fn get_builtin_impls( 28pub(super) fn get_builtin_impls(
29 db: &impl HirDatabase, 29 db: &dyn HirDatabase,
30 krate: CrateId, 30 krate: CrateId,
31 ty: &Ty, 31 ty: &Ty,
32 // The first argument for the trait, if present 32 // The first argument for the trait, if present
@@ -59,7 +59,7 @@ pub(super) fn get_builtin_impls(
59} 59}
60 60
61fn get_builtin_unsize_impls( 61fn get_builtin_unsize_impls(
62 db: &impl HirDatabase, 62 db: &dyn HirDatabase,
63 krate: CrateId, 63 krate: CrateId,
64 ty: &Ty, 64 ty: &Ty,
65 // The first argument for the trait, if present 65 // The first argument for the trait, if present
@@ -79,7 +79,7 @@ fn get_builtin_unsize_impls(
79 // FIXME what about more complicated dyn tys with marker traits? 79 // FIXME what about more complicated dyn tys with marker traits?
80 if let Some(trait_ref) = ty.dyn_trait_ref() { 80 if let Some(trait_ref) = ty.dyn_trait_ref() {
81 if trait_ref.trait_ != target_trait.trait_ { 81 if trait_ref.trait_ != target_trait.trait_ {
82 let super_traits = all_super_traits(db, trait_ref.trait_); 82 let super_traits = all_super_traits(db.upcast(), trait_ref.trait_);
83 if super_traits.contains(&target_trait.trait_) { 83 if super_traits.contains(&target_trait.trait_) {
84 callback(Impl::UnsizeToSuperTraitObject(UnsizeToSuperTraitObjectData { 84 callback(Impl::UnsizeToSuperTraitObject(UnsizeToSuperTraitObjectData {
85 trait_: trait_ref.trait_, 85 trait_: trait_ref.trait_,
@@ -94,7 +94,7 @@ fn get_builtin_unsize_impls(
94 } 94 }
95} 95}
96 96
97pub(super) fn impl_datum(db: &impl HirDatabase, krate: CrateId, impl_: Impl) -> BuiltinImplData { 97pub(super) fn impl_datum(db: &dyn HirDatabase, krate: CrateId, impl_: Impl) -> BuiltinImplData {
98 match impl_ { 98 match impl_ {
99 Impl::ImplDef(_) => unreachable!(), 99 Impl::ImplDef(_) => unreachable!(),
100 Impl::ClosureFnTraitImpl(data) => closure_fn_trait_impl_datum(db, krate, data), 100 Impl::ClosureFnTraitImpl(data) => closure_fn_trait_impl_datum(db, krate, data),
@@ -107,7 +107,7 @@ pub(super) fn impl_datum(db: &impl HirDatabase, krate: CrateId, impl_: Impl) ->
107} 107}
108 108
109pub(super) fn associated_ty_value( 109pub(super) fn associated_ty_value(
110 db: &impl HirDatabase, 110 db: &dyn HirDatabase,
111 krate: CrateId, 111 krate: CrateId,
112 data: AssocTyValue, 112 data: AssocTyValue,
113) -> BuiltinImplAssocTyValueData { 113) -> BuiltinImplAssocTyValueData {
@@ -122,7 +122,7 @@ pub(super) fn associated_ty_value(
122// Closure Fn trait impls 122// Closure Fn trait impls
123 123
124fn check_closure_fn_trait_impl_prerequisites( 124fn check_closure_fn_trait_impl_prerequisites(
125 db: &impl HirDatabase, 125 db: &dyn HirDatabase,
126 krate: CrateId, 126 krate: CrateId,
127 data: super::ClosureFnTraitImplData, 127 data: super::ClosureFnTraitImplData,
128) -> bool { 128) -> bool {
@@ -143,7 +143,7 @@ fn check_closure_fn_trait_impl_prerequisites(
143} 143}
144 144
145fn closure_fn_trait_impl_datum( 145fn closure_fn_trait_impl_datum(
146 db: &impl HirDatabase, 146 db: &dyn HirDatabase,
147 krate: CrateId, 147 krate: CrateId,
148 data: super::ClosureFnTraitImplData, 148 data: super::ClosureFnTraitImplData,
149) -> BuiltinImplData { 149) -> BuiltinImplData {
@@ -189,7 +189,7 @@ fn closure_fn_trait_impl_datum(
189} 189}
190 190
191fn closure_fn_trait_output_assoc_ty_value( 191fn closure_fn_trait_output_assoc_ty_value(
192 db: &impl HirDatabase, 192 db: &dyn HirDatabase,
193 krate: CrateId, 193 krate: CrateId,
194 data: super::ClosureFnTraitImplData, 194 data: super::ClosureFnTraitImplData,
195) -> BuiltinImplAssocTyValueData { 195) -> BuiltinImplAssocTyValueData {
@@ -223,17 +223,17 @@ fn closure_fn_trait_output_assoc_ty_value(
223 223
224// Array unsizing 224// Array unsizing
225 225
226fn check_unsize_impl_prerequisites(db: &impl HirDatabase, krate: CrateId) -> bool { 226fn check_unsize_impl_prerequisites(db: &dyn HirDatabase, krate: CrateId) -> bool {
227 // the Unsize trait needs to exist and have two type parameters (Self and T) 227 // the Unsize trait needs to exist and have two type parameters (Self and T)
228 let unsize_trait = match get_unsize_trait(db, krate) { 228 let unsize_trait = match get_unsize_trait(db, krate) {
229 Some(t) => t, 229 Some(t) => t,
230 None => return false, 230 None => return false,
231 }; 231 };
232 let generic_params = generics(db, unsize_trait.into()); 232 let generic_params = generics(db.upcast(), unsize_trait.into());
233 generic_params.len() == 2 233 generic_params.len() == 2
234} 234}
235 235
236fn array_unsize_impl_datum(db: &impl HirDatabase, krate: CrateId) -> BuiltinImplData { 236fn array_unsize_impl_datum(db: &dyn HirDatabase, krate: CrateId) -> BuiltinImplData {
237 // impl<T> Unsize<[T]> for [T; _] 237 // impl<T> Unsize<[T]> for [T; _]
238 // (this can be a single impl because we don't distinguish array sizes currently) 238 // (this can be a single impl because we don't distinguish array sizes currently)
239 239
@@ -260,7 +260,7 @@ fn array_unsize_impl_datum(db: &impl HirDatabase, krate: CrateId) -> BuiltinImpl
260// Trait object unsizing 260// Trait object unsizing
261 261
262fn trait_object_unsize_impl_datum( 262fn trait_object_unsize_impl_datum(
263 db: &impl HirDatabase, 263 db: &dyn HirDatabase,
264 krate: CrateId, 264 krate: CrateId,
265 trait_: TraitId, 265 trait_: TraitId,
266) -> BuiltinImplData { 266) -> BuiltinImplData {
@@ -295,7 +295,7 @@ fn trait_object_unsize_impl_datum(
295} 295}
296 296
297fn super_trait_object_unsize_impl_datum( 297fn super_trait_object_unsize_impl_datum(
298 db: &impl HirDatabase, 298 db: &dyn HirDatabase,
299 krate: CrateId, 299 krate: CrateId,
300 data: UnsizeToSuperTraitObjectData, 300 data: UnsizeToSuperTraitObjectData,
301) -> BuiltinImplData { 301) -> BuiltinImplData {
@@ -313,7 +313,7 @@ fn super_trait_object_unsize_impl_datum(
313 let self_bounds = vec![GenericPredicate::Implemented(self_trait_ref.clone())]; 313 let self_bounds = vec![GenericPredicate::Implemented(self_trait_ref.clone())];
314 314
315 // we need to go from our trait to the super trait, substituting type parameters 315 // we need to go from our trait to the super trait, substituting type parameters
316 let path = crate::utils::find_super_trait_path(db, data.trait_, data.super_trait); 316 let path = crate::utils::find_super_trait_path(db.upcast(), data.trait_, data.super_trait);
317 317
318 let mut current_trait_ref = self_trait_ref; 318 let mut current_trait_ref = self_trait_ref;
319 for t in path.into_iter().skip(1) { 319 for t in path.into_iter().skip(1) {
@@ -344,11 +344,7 @@ fn super_trait_object_unsize_impl_datum(
344 BuiltinImplData { num_vars, trait_ref, where_clauses: Vec::new(), assoc_ty_values: Vec::new() } 344 BuiltinImplData { num_vars, trait_ref, where_clauses: Vec::new(), assoc_ty_values: Vec::new() }
345} 345}
346 346
347fn get_fn_trait( 347fn get_fn_trait(db: &dyn HirDatabase, krate: CrateId, fn_trait: super::FnTrait) -> Option<TraitId> {
348 db: &impl HirDatabase,
349 krate: CrateId,
350 fn_trait: super::FnTrait,
351) -> Option<TraitId> {
352 let target = db.lang_item(krate, fn_trait.lang_item_name().into())?; 348 let target = db.lang_item(krate, fn_trait.lang_item_name().into())?;
353 match target { 349 match target {
354 LangItemTarget::TraitId(t) => Some(t), 350 LangItemTarget::TraitId(t) => Some(t),
@@ -356,7 +352,7 @@ fn get_fn_trait(
356 } 352 }
357} 353}
358 354
359fn get_unsize_trait(db: &impl HirDatabase, krate: CrateId) -> Option<TraitId> { 355fn get_unsize_trait(db: &dyn HirDatabase, krate: CrateId) -> Option<TraitId> {
360 let target = db.lang_item(krate, "unsize".into())?; 356 let target = db.lang_item(krate, "unsize".into())?;
361 match target { 357 match target {
362 LangItemTarget::TraitId(t) => Some(t), 358 LangItemTarget::TraitId(t) => Some(t),
diff --git a/crates/ra_hir_ty/src/traits/chalk.rs b/crates/ra_hir_ty/src/traits/chalk.rs
index 62509bc29..943d5f125 100644
--- a/crates/ra_hir_ty/src/traits/chalk.rs
+++ b/crates/ra_hir_ty/src/traits/chalk.rs
@@ -127,11 +127,11 @@ pub type AssociatedTyValue = chalk_rust_ir::AssociatedTyValue<Interner>;
127 127
128pub(super) trait ToChalk { 128pub(super) trait ToChalk {
129 type Chalk; 129 type Chalk;
130 fn to_chalk(self, db: &impl HirDatabase) -> Self::Chalk; 130 fn to_chalk(self, db: &dyn HirDatabase) -> Self::Chalk;
131 fn from_chalk(db: &impl HirDatabase, chalk: Self::Chalk) -> Self; 131 fn from_chalk(db: &dyn HirDatabase, chalk: Self::Chalk) -> Self;
132} 132}
133 133
134pub(super) fn from_chalk<T, ChalkT>(db: &impl HirDatabase, chalk: ChalkT) -> T 134pub(super) fn from_chalk<T, ChalkT>(db: &dyn HirDatabase, chalk: ChalkT) -> T
135where 135where
136 T: ToChalk<Chalk = ChalkT>, 136 T: ToChalk<Chalk = ChalkT>,
137{ 137{
@@ -140,7 +140,7 @@ where
140 140
141impl ToChalk for Ty { 141impl ToChalk for Ty {
142 type Chalk = chalk_ir::Ty<Interner>; 142 type Chalk = chalk_ir::Ty<Interner>;
143 fn to_chalk(self, db: &impl HirDatabase) -> chalk_ir::Ty<Interner> { 143 fn to_chalk(self, db: &dyn HirDatabase) -> chalk_ir::Ty<Interner> {
144 match self { 144 match self {
145 Ty::Apply(apply_ty) => { 145 Ty::Apply(apply_ty) => {
146 let name = apply_ty.ctor.to_chalk(db); 146 let name = apply_ty.ctor.to_chalk(db);
@@ -179,7 +179,7 @@ impl ToChalk for Ty {
179 } 179 }
180 } 180 }
181 } 181 }
182 fn from_chalk(db: &impl HirDatabase, chalk: chalk_ir::Ty<Interner>) -> Self { 182 fn from_chalk(db: &dyn HirDatabase, chalk: chalk_ir::Ty<Interner>) -> Self {
183 match chalk.data().clone() { 183 match chalk.data().clone() {
184 chalk_ir::TyData::Apply(apply_ty) => match apply_ty.name { 184 chalk_ir::TyData::Apply(apply_ty) => match apply_ty.name {
185 TypeName::Error => Ty::Unknown, 185 TypeName::Error => Ty::Unknown,
@@ -217,11 +217,11 @@ impl ToChalk for Ty {
217impl ToChalk for Substs { 217impl ToChalk for Substs {
218 type Chalk = chalk_ir::Substitution<Interner>; 218 type Chalk = chalk_ir::Substitution<Interner>;
219 219
220 fn to_chalk(self, db: &impl HirDatabase) -> chalk_ir::Substitution<Interner> { 220 fn to_chalk(self, db: &dyn HirDatabase) -> chalk_ir::Substitution<Interner> {
221 chalk_ir::Substitution::from(self.iter().map(|ty| ty.clone().to_chalk(db))) 221 chalk_ir::Substitution::from(self.iter().map(|ty| ty.clone().to_chalk(db)))
222 } 222 }
223 223
224 fn from_chalk(db: &impl HirDatabase, parameters: chalk_ir::Substitution<Interner>) -> Substs { 224 fn from_chalk(db: &dyn HirDatabase, parameters: chalk_ir::Substitution<Interner>) -> Substs {
225 let tys = parameters 225 let tys = parameters
226 .into_iter() 226 .into_iter()
227 .map(|p| match p.ty() { 227 .map(|p| match p.ty() {
@@ -236,13 +236,13 @@ impl ToChalk for Substs {
236impl ToChalk for TraitRef { 236impl ToChalk for TraitRef {
237 type Chalk = chalk_ir::TraitRef<Interner>; 237 type Chalk = chalk_ir::TraitRef<Interner>;
238 238
239 fn to_chalk(self: TraitRef, db: &impl HirDatabase) -> chalk_ir::TraitRef<Interner> { 239 fn to_chalk(self: TraitRef, db: &dyn HirDatabase) -> chalk_ir::TraitRef<Interner> {
240 let trait_id = self.trait_.to_chalk(db); 240 let trait_id = self.trait_.to_chalk(db);
241 let substitution = self.substs.to_chalk(db); 241 let substitution = self.substs.to_chalk(db);
242 chalk_ir::TraitRef { trait_id, substitution } 242 chalk_ir::TraitRef { trait_id, substitution }
243 } 243 }
244 244
245 fn from_chalk(db: &impl HirDatabase, trait_ref: chalk_ir::TraitRef<Interner>) -> Self { 245 fn from_chalk(db: &dyn HirDatabase, trait_ref: chalk_ir::TraitRef<Interner>) -> Self {
246 let trait_ = from_chalk(db, trait_ref.trait_id); 246 let trait_ = from_chalk(db, trait_ref.trait_id);
247 let substs = from_chalk(db, trait_ref.substitution); 247 let substs = from_chalk(db, trait_ref.substitution);
248 TraitRef { trait_, substs } 248 TraitRef { trait_, substs }
@@ -252,11 +252,11 @@ impl ToChalk for TraitRef {
252impl ToChalk for hir_def::TraitId { 252impl ToChalk for hir_def::TraitId {
253 type Chalk = TraitId; 253 type Chalk = TraitId;
254 254
255 fn to_chalk(self, _db: &impl HirDatabase) -> TraitId { 255 fn to_chalk(self, _db: &dyn HirDatabase) -> TraitId {
256 chalk_ir::TraitId(self.as_intern_id()) 256 chalk_ir::TraitId(self.as_intern_id())
257 } 257 }
258 258
259 fn from_chalk(_db: &impl HirDatabase, trait_id: TraitId) -> hir_def::TraitId { 259 fn from_chalk(_db: &dyn HirDatabase, trait_id: TraitId) -> hir_def::TraitId {
260 InternKey::from_intern_id(trait_id.0) 260 InternKey::from_intern_id(trait_id.0)
261 } 261 }
262} 262}
@@ -264,7 +264,7 @@ impl ToChalk for hir_def::TraitId {
264impl ToChalk for TypeCtor { 264impl ToChalk for TypeCtor {
265 type Chalk = TypeName<Interner>; 265 type Chalk = TypeName<Interner>;
266 266
267 fn to_chalk(self, db: &impl HirDatabase) -> TypeName<Interner> { 267 fn to_chalk(self, db: &dyn HirDatabase) -> TypeName<Interner> {
268 match self { 268 match self {
269 TypeCtor::AssociatedType(type_alias) => { 269 TypeCtor::AssociatedType(type_alias) => {
270 let type_id = type_alias.to_chalk(db); 270 let type_id = type_alias.to_chalk(db);
@@ -278,7 +278,7 @@ impl ToChalk for TypeCtor {
278 } 278 }
279 } 279 }
280 280
281 fn from_chalk(db: &impl HirDatabase, type_name: TypeName<Interner>) -> TypeCtor { 281 fn from_chalk(db: &dyn HirDatabase, type_name: TypeName<Interner>) -> TypeCtor {
282 match type_name { 282 match type_name {
283 TypeName::Struct(struct_id) => db.lookup_intern_type_ctor(struct_id.into()), 283 TypeName::Struct(struct_id) => db.lookup_intern_type_ctor(struct_id.into()),
284 TypeName::AssociatedType(type_id) => TypeCtor::AssociatedType(from_chalk(db, type_id)), 284 TypeName::AssociatedType(type_id) => TypeCtor::AssociatedType(from_chalk(db, type_id)),
@@ -293,11 +293,11 @@ impl ToChalk for TypeCtor {
293impl ToChalk for Impl { 293impl ToChalk for Impl {
294 type Chalk = ImplId; 294 type Chalk = ImplId;
295 295
296 fn to_chalk(self, db: &impl HirDatabase) -> ImplId { 296 fn to_chalk(self, db: &dyn HirDatabase) -> ImplId {
297 db.intern_chalk_impl(self).into() 297 db.intern_chalk_impl(self).into()
298 } 298 }
299 299
300 fn from_chalk(db: &impl HirDatabase, impl_id: ImplId) -> Impl { 300 fn from_chalk(db: &dyn HirDatabase, impl_id: ImplId) -> Impl {
301 db.lookup_intern_chalk_impl(impl_id.into()) 301 db.lookup_intern_chalk_impl(impl_id.into())
302 } 302 }
303} 303}
@@ -305,11 +305,11 @@ impl ToChalk for Impl {
305impl ToChalk for TypeAliasId { 305impl ToChalk for TypeAliasId {
306 type Chalk = AssocTypeId; 306 type Chalk = AssocTypeId;
307 307
308 fn to_chalk(self, _db: &impl HirDatabase) -> AssocTypeId { 308 fn to_chalk(self, _db: &dyn HirDatabase) -> AssocTypeId {
309 chalk_ir::AssocTypeId(self.as_intern_id()) 309 chalk_ir::AssocTypeId(self.as_intern_id())
310 } 310 }
311 311
312 fn from_chalk(_db: &impl HirDatabase, type_alias_id: AssocTypeId) -> TypeAliasId { 312 fn from_chalk(_db: &dyn HirDatabase, type_alias_id: AssocTypeId) -> TypeAliasId {
313 InternKey::from_intern_id(type_alias_id.0) 313 InternKey::from_intern_id(type_alias_id.0)
314 } 314 }
315} 315}
@@ -317,11 +317,11 @@ impl ToChalk for TypeAliasId {
317impl ToChalk for AssocTyValue { 317impl ToChalk for AssocTyValue {
318 type Chalk = AssociatedTyValueId; 318 type Chalk = AssociatedTyValueId;
319 319
320 fn to_chalk(self, db: &impl HirDatabase) -> AssociatedTyValueId { 320 fn to_chalk(self, db: &dyn HirDatabase) -> AssociatedTyValueId {
321 db.intern_assoc_ty_value(self).into() 321 db.intern_assoc_ty_value(self).into()
322 } 322 }
323 323
324 fn from_chalk(db: &impl HirDatabase, assoc_ty_value_id: AssociatedTyValueId) -> AssocTyValue { 324 fn from_chalk(db: &dyn HirDatabase, assoc_ty_value_id: AssociatedTyValueId) -> AssocTyValue {
325 db.lookup_intern_assoc_ty_value(assoc_ty_value_id.into()) 325 db.lookup_intern_assoc_ty_value(assoc_ty_value_id.into())
326 } 326 }
327} 327}
@@ -329,7 +329,7 @@ impl ToChalk for AssocTyValue {
329impl ToChalk for GenericPredicate { 329impl ToChalk for GenericPredicate {
330 type Chalk = chalk_ir::QuantifiedWhereClause<Interner>; 330 type Chalk = chalk_ir::QuantifiedWhereClause<Interner>;
331 331
332 fn to_chalk(self, db: &impl HirDatabase) -> chalk_ir::QuantifiedWhereClause<Interner> { 332 fn to_chalk(self, db: &dyn HirDatabase) -> chalk_ir::QuantifiedWhereClause<Interner> {
333 match self { 333 match self {
334 GenericPredicate::Implemented(trait_ref) => { 334 GenericPredicate::Implemented(trait_ref) => {
335 make_binders(chalk_ir::WhereClause::Implemented(trait_ref.to_chalk(db)), 0) 335 make_binders(chalk_ir::WhereClause::Implemented(trait_ref.to_chalk(db)), 0)
@@ -346,7 +346,7 @@ impl ToChalk for GenericPredicate {
346 } 346 }
347 347
348 fn from_chalk( 348 fn from_chalk(
349 db: &impl HirDatabase, 349 db: &dyn HirDatabase,
350 where_clause: chalk_ir::QuantifiedWhereClause<Interner>, 350 where_clause: chalk_ir::QuantifiedWhereClause<Interner>,
351 ) -> GenericPredicate { 351 ) -> GenericPredicate {
352 match where_clause.value { 352 match where_clause.value {
@@ -365,7 +365,7 @@ impl ToChalk for GenericPredicate {
365impl ToChalk for ProjectionTy { 365impl ToChalk for ProjectionTy {
366 type Chalk = chalk_ir::AliasTy<Interner>; 366 type Chalk = chalk_ir::AliasTy<Interner>;
367 367
368 fn to_chalk(self, db: &impl HirDatabase) -> chalk_ir::AliasTy<Interner> { 368 fn to_chalk(self, db: &dyn HirDatabase) -> chalk_ir::AliasTy<Interner> {
369 chalk_ir::AliasTy { 369 chalk_ir::AliasTy {
370 associated_ty_id: self.associated_ty.to_chalk(db), 370 associated_ty_id: self.associated_ty.to_chalk(db),
371 substitution: self.parameters.to_chalk(db), 371 substitution: self.parameters.to_chalk(db),
@@ -373,7 +373,7 @@ impl ToChalk for ProjectionTy {
373 } 373 }
374 374
375 fn from_chalk( 375 fn from_chalk(
376 db: &impl HirDatabase, 376 db: &dyn HirDatabase,
377 projection_ty: chalk_ir::AliasTy<Interner>, 377 projection_ty: chalk_ir::AliasTy<Interner>,
378 ) -> ProjectionTy { 378 ) -> ProjectionTy {
379 ProjectionTy { 379 ProjectionTy {
@@ -386,11 +386,11 @@ impl ToChalk for ProjectionTy {
386impl ToChalk for super::ProjectionPredicate { 386impl ToChalk for super::ProjectionPredicate {
387 type Chalk = chalk_ir::Normalize<Interner>; 387 type Chalk = chalk_ir::Normalize<Interner>;
388 388
389 fn to_chalk(self, db: &impl HirDatabase) -> chalk_ir::Normalize<Interner> { 389 fn to_chalk(self, db: &dyn HirDatabase) -> chalk_ir::Normalize<Interner> {
390 chalk_ir::Normalize { alias: self.projection_ty.to_chalk(db), ty: self.ty.to_chalk(db) } 390 chalk_ir::Normalize { alias: self.projection_ty.to_chalk(db), ty: self.ty.to_chalk(db) }
391 } 391 }
392 392
393 fn from_chalk(_db: &impl HirDatabase, _normalize: chalk_ir::Normalize<Interner>) -> Self { 393 fn from_chalk(_db: &dyn HirDatabase, _normalize: chalk_ir::Normalize<Interner>) -> Self {
394 unimplemented!() 394 unimplemented!()
395 } 395 }
396} 396}
@@ -398,14 +398,14 @@ impl ToChalk for super::ProjectionPredicate {
398impl ToChalk for Obligation { 398impl ToChalk for Obligation {
399 type Chalk = chalk_ir::DomainGoal<Interner>; 399 type Chalk = chalk_ir::DomainGoal<Interner>;
400 400
401 fn to_chalk(self, db: &impl HirDatabase) -> chalk_ir::DomainGoal<Interner> { 401 fn to_chalk(self, db: &dyn HirDatabase) -> chalk_ir::DomainGoal<Interner> {
402 match self { 402 match self {
403 Obligation::Trait(tr) => tr.to_chalk(db).cast(), 403 Obligation::Trait(tr) => tr.to_chalk(db).cast(),
404 Obligation::Projection(pr) => pr.to_chalk(db).cast(), 404 Obligation::Projection(pr) => pr.to_chalk(db).cast(),
405 } 405 }
406 } 406 }
407 407
408 fn from_chalk(_db: &impl HirDatabase, _goal: chalk_ir::DomainGoal<Interner>) -> Self { 408 fn from_chalk(_db: &dyn HirDatabase, _goal: chalk_ir::DomainGoal<Interner>) -> Self {
409 unimplemented!() 409 unimplemented!()
410 } 410 }
411} 411}
@@ -416,13 +416,13 @@ where
416{ 416{
417 type Chalk = chalk_ir::Canonical<T::Chalk>; 417 type Chalk = chalk_ir::Canonical<T::Chalk>;
418 418
419 fn to_chalk(self, db: &impl HirDatabase) -> chalk_ir::Canonical<T::Chalk> { 419 fn to_chalk(self, db: &dyn HirDatabase) -> chalk_ir::Canonical<T::Chalk> {
420 let parameter = chalk_ir::ParameterKind::Ty(chalk_ir::UniverseIndex::ROOT); 420 let parameter = chalk_ir::ParameterKind::Ty(chalk_ir::UniverseIndex::ROOT);
421 let value = self.value.to_chalk(db); 421 let value = self.value.to_chalk(db);
422 chalk_ir::Canonical { value, binders: vec![parameter; self.num_vars] } 422 chalk_ir::Canonical { value, binders: vec![parameter; self.num_vars] }
423 } 423 }
424 424
425 fn from_chalk(db: &impl HirDatabase, canonical: chalk_ir::Canonical<T::Chalk>) -> Canonical<T> { 425 fn from_chalk(db: &dyn HirDatabase, canonical: chalk_ir::Canonical<T::Chalk>) -> Canonical<T> {
426 Canonical { num_vars: canonical.binders.len(), value: from_chalk(db, canonical.value) } 426 Canonical { num_vars: canonical.binders.len(), value: from_chalk(db, canonical.value) }
427 } 427 }
428} 428}
@@ -430,7 +430,7 @@ where
430impl ToChalk for Arc<super::TraitEnvironment> { 430impl ToChalk for Arc<super::TraitEnvironment> {
431 type Chalk = chalk_ir::Environment<Interner>; 431 type Chalk = chalk_ir::Environment<Interner>;
432 432
433 fn to_chalk(self, db: &impl HirDatabase) -> chalk_ir::Environment<Interner> { 433 fn to_chalk(self, db: &dyn HirDatabase) -> chalk_ir::Environment<Interner> {
434 let mut clauses = Vec::new(); 434 let mut clauses = Vec::new();
435 for pred in &self.predicates { 435 for pred in &self.predicates {
436 if pred.is_error() { 436 if pred.is_error() {
@@ -445,7 +445,7 @@ impl ToChalk for Arc<super::TraitEnvironment> {
445 } 445 }
446 446
447 fn from_chalk( 447 fn from_chalk(
448 _db: &impl HirDatabase, 448 _db: &dyn HirDatabase,
449 _env: chalk_ir::Environment<Interner>, 449 _env: chalk_ir::Environment<Interner>,
450 ) -> Arc<super::TraitEnvironment> { 450 ) -> Arc<super::TraitEnvironment> {
451 unimplemented!() 451 unimplemented!()
@@ -458,7 +458,7 @@ where
458{ 458{
459 type Chalk = chalk_ir::InEnvironment<T::Chalk>; 459 type Chalk = chalk_ir::InEnvironment<T::Chalk>;
460 460
461 fn to_chalk(self, db: &impl HirDatabase) -> chalk_ir::InEnvironment<T::Chalk> { 461 fn to_chalk(self, db: &dyn HirDatabase) -> chalk_ir::InEnvironment<T::Chalk> {
462 chalk_ir::InEnvironment { 462 chalk_ir::InEnvironment {
463 environment: self.environment.to_chalk(db), 463 environment: self.environment.to_chalk(db),
464 goal: self.value.to_chalk(db), 464 goal: self.value.to_chalk(db),
@@ -466,7 +466,7 @@ where
466 } 466 }
467 467
468 fn from_chalk( 468 fn from_chalk(
469 db: &impl HirDatabase, 469 db: &dyn HirDatabase,
470 in_env: chalk_ir::InEnvironment<T::Chalk>, 470 in_env: chalk_ir::InEnvironment<T::Chalk>,
471 ) -> super::InEnvironment<T> { 471 ) -> super::InEnvironment<T> {
472 super::InEnvironment { 472 super::InEnvironment {
@@ -479,7 +479,7 @@ where
479impl ToChalk for builtin::BuiltinImplData { 479impl ToChalk for builtin::BuiltinImplData {
480 type Chalk = ImplDatum; 480 type Chalk = ImplDatum;
481 481
482 fn to_chalk(self, db: &impl HirDatabase) -> ImplDatum { 482 fn to_chalk(self, db: &dyn HirDatabase) -> ImplDatum {
483 let impl_type = chalk_rust_ir::ImplType::External; 483 let impl_type = chalk_rust_ir::ImplType::External;
484 let where_clauses = self.where_clauses.into_iter().map(|w| w.to_chalk(db)).collect(); 484 let where_clauses = self.where_clauses.into_iter().map(|w| w.to_chalk(db)).collect();
485 485
@@ -495,7 +495,7 @@ impl ToChalk for builtin::BuiltinImplData {
495 } 495 }
496 } 496 }
497 497
498 fn from_chalk(_db: &impl HirDatabase, _data: ImplDatum) -> Self { 498 fn from_chalk(_db: &dyn HirDatabase, _data: ImplDatum) -> Self {
499 unimplemented!() 499 unimplemented!()
500 } 500 }
501} 501}
@@ -503,7 +503,7 @@ impl ToChalk for builtin::BuiltinImplData {
503impl ToChalk for builtin::BuiltinImplAssocTyValueData { 503impl ToChalk for builtin::BuiltinImplAssocTyValueData {
504 type Chalk = AssociatedTyValue; 504 type Chalk = AssociatedTyValue;
505 505
506 fn to_chalk(self, db: &impl HirDatabase) -> AssociatedTyValue { 506 fn to_chalk(self, db: &dyn HirDatabase) -> AssociatedTyValue {
507 let value_bound = chalk_rust_ir::AssociatedTyValueBound { ty: self.value.to_chalk(db) }; 507 let value_bound = chalk_rust_ir::AssociatedTyValueBound { ty: self.value.to_chalk(db) };
508 508
509 chalk_rust_ir::AssociatedTyValue { 509 chalk_rust_ir::AssociatedTyValue {
@@ -514,7 +514,7 @@ impl ToChalk for builtin::BuiltinImplAssocTyValueData {
514 } 514 }
515 515
516 fn from_chalk( 516 fn from_chalk(
517 _db: &impl HirDatabase, 517 _db: &dyn HirDatabase,
518 _data: AssociatedTyValue, 518 _data: AssociatedTyValue,
519 ) -> builtin::BuiltinImplAssocTyValueData { 519 ) -> builtin::BuiltinImplAssocTyValueData {
520 unimplemented!() 520 unimplemented!()
@@ -529,7 +529,7 @@ fn make_binders<T>(value: T, num_vars: usize) -> chalk_ir::Binders<T> {
529} 529}
530 530
531fn convert_where_clauses( 531fn convert_where_clauses(
532 db: &impl HirDatabase, 532 db: &dyn HirDatabase,
533 def: GenericDefId, 533 def: GenericDefId,
534 substs: &Substs, 534 substs: &Substs,
535) -> Vec<chalk_ir::QuantifiedWhereClause<Interner>> { 535) -> Vec<chalk_ir::QuantifiedWhereClause<Interner>> {
@@ -545,10 +545,7 @@ fn convert_where_clauses(
545 result 545 result
546} 546}
547 547
548impl<'a, DB> chalk_solve::RustIrDatabase<Interner> for ChalkContext<'a, DB> 548impl<'a> chalk_solve::RustIrDatabase<Interner> for ChalkContext<'a> {
549where
550 DB: HirDatabase,
551{
552 fn associated_ty_data(&self, id: AssocTypeId) -> Arc<AssociatedTyDatum> { 549 fn associated_ty_data(&self, id: AssocTypeId) -> Arc<AssociatedTyDatum> {
553 self.db.associated_ty_data(id) 550 self.db.associated_ty_data(id)
554 } 551 }
@@ -618,16 +615,16 @@ where
618} 615}
619 616
620pub(crate) fn associated_ty_data_query( 617pub(crate) fn associated_ty_data_query(
621 db: &impl HirDatabase, 618 db: &dyn HirDatabase,
622 id: AssocTypeId, 619 id: AssocTypeId,
623) -> Arc<AssociatedTyDatum> { 620) -> Arc<AssociatedTyDatum> {
624 debug!("associated_ty_data {:?}", id); 621 debug!("associated_ty_data {:?}", id);
625 let type_alias: TypeAliasId = from_chalk(db, id); 622 let type_alias: TypeAliasId = from_chalk(db, id);
626 let trait_ = match type_alias.lookup(db).container { 623 let trait_ = match type_alias.lookup(db.upcast()).container {
627 AssocContainerId::TraitId(t) => t, 624 AssocContainerId::TraitId(t) => t,
628 _ => panic!("associated type not in trait"), 625 _ => panic!("associated type not in trait"),
629 }; 626 };
630 let generic_params = generics(db, type_alias.into()); 627 let generic_params = generics(db.upcast(), type_alias.into());
631 let bound_data = chalk_rust_ir::AssociatedTyDatumBound { 628 let bound_data = chalk_rust_ir::AssociatedTyDatumBound {
632 // FIXME add bounds and where clauses 629 // FIXME add bounds and where clauses
633 bounds: vec![], 630 bounds: vec![],
@@ -643,7 +640,7 @@ pub(crate) fn associated_ty_data_query(
643} 640}
644 641
645pub(crate) fn trait_datum_query( 642pub(crate) fn trait_datum_query(
646 db: &impl HirDatabase, 643 db: &dyn HirDatabase,
647 krate: CrateId, 644 krate: CrateId,
648 trait_id: TraitId, 645 trait_id: TraitId,
649) -> Arc<TraitDatum> { 646) -> Arc<TraitDatum> {
@@ -651,11 +648,11 @@ pub(crate) fn trait_datum_query(
651 let trait_: hir_def::TraitId = from_chalk(db, trait_id); 648 let trait_: hir_def::TraitId = from_chalk(db, trait_id);
652 let trait_data = db.trait_data(trait_); 649 let trait_data = db.trait_data(trait_);
653 debug!("trait {:?} = {:?}", trait_id, trait_data.name); 650 debug!("trait {:?} = {:?}", trait_id, trait_data.name);
654 let generic_params = generics(db, trait_.into()); 651 let generic_params = generics(db.upcast(), trait_.into());
655 let bound_vars = Substs::bound_vars(&generic_params); 652 let bound_vars = Substs::bound_vars(&generic_params);
656 let flags = chalk_rust_ir::TraitFlags { 653 let flags = chalk_rust_ir::TraitFlags {
657 auto: trait_data.auto, 654 auto: trait_data.auto,
658 upstream: trait_.lookup(db).container.module(db).krate != krate, 655 upstream: trait_.lookup(db.upcast()).container.module(db.upcast()).krate != krate,
659 non_enumerable: true, 656 non_enumerable: true,
660 coinductive: false, // only relevant for Chalk testing 657 coinductive: false, // only relevant for Chalk testing
661 // FIXME set these flags correctly 658 // FIXME set these flags correctly
@@ -676,7 +673,7 @@ pub(crate) fn trait_datum_query(
676} 673}
677 674
678pub(crate) fn struct_datum_query( 675pub(crate) fn struct_datum_query(
679 db: &impl HirDatabase, 676 db: &dyn HirDatabase,
680 krate: CrateId, 677 krate: CrateId,
681 struct_id: StructId, 678 struct_id: StructId,
682) -> Arc<StructDatum> { 679) -> Arc<StructDatum> {
@@ -688,7 +685,7 @@ pub(crate) fn struct_datum_query(
688 let where_clauses = type_ctor 685 let where_clauses = type_ctor
689 .as_generic_def() 686 .as_generic_def()
690 .map(|generic_def| { 687 .map(|generic_def| {
691 let generic_params = generics(db, generic_def); 688 let generic_params = generics(db.upcast(), generic_def);
692 let bound_vars = Substs::bound_vars(&generic_params); 689 let bound_vars = Substs::bound_vars(&generic_params);
693 convert_where_clauses(db, generic_def, &bound_vars) 690 convert_where_clauses(db, generic_def, &bound_vars)
694 }) 691 })
@@ -708,7 +705,7 @@ pub(crate) fn struct_datum_query(
708} 705}
709 706
710pub(crate) fn impl_datum_query( 707pub(crate) fn impl_datum_query(
711 db: &impl HirDatabase, 708 db: &dyn HirDatabase,
712 krate: CrateId, 709 krate: CrateId,
713 impl_id: ImplId, 710 impl_id: ImplId,
714) -> Arc<ImplDatum> { 711) -> Arc<ImplDatum> {
@@ -722,7 +719,7 @@ pub(crate) fn impl_datum_query(
722} 719}
723 720
724fn impl_def_datum( 721fn impl_def_datum(
725 db: &impl HirDatabase, 722 db: &dyn HirDatabase,
726 krate: CrateId, 723 krate: CrateId,
727 chalk_id: ImplId, 724 chalk_id: ImplId,
728 impl_id: hir_def::ImplId, 725 impl_id: hir_def::ImplId,
@@ -734,10 +731,10 @@ fn impl_def_datum(
734 .value; 731 .value;
735 let impl_data = db.impl_data(impl_id); 732 let impl_data = db.impl_data(impl_id);
736 733
737 let generic_params = generics(db, impl_id.into()); 734 let generic_params = generics(db.upcast(), impl_id.into());
738 let bound_vars = Substs::bound_vars(&generic_params); 735 let bound_vars = Substs::bound_vars(&generic_params);
739 let trait_ = trait_ref.trait_; 736 let trait_ = trait_ref.trait_;
740 let impl_type = if impl_id.lookup(db).container.module(db).krate == krate { 737 let impl_type = if impl_id.lookup(db.upcast()).container.module(db.upcast()).krate == krate {
741 chalk_rust_ir::ImplType::Local 738 chalk_rust_ir::ImplType::Local
742 } else { 739 } else {
743 chalk_rust_ir::ImplType::External 740 chalk_rust_ir::ImplType::External
@@ -786,7 +783,7 @@ fn impl_def_datum(
786} 783}
787 784
788pub(crate) fn associated_ty_value_query( 785pub(crate) fn associated_ty_value_query(
789 db: &impl HirDatabase, 786 db: &dyn HirDatabase,
790 krate: CrateId, 787 krate: CrateId,
791 id: AssociatedTyValueId, 788 id: AssociatedTyValueId,
792) -> Arc<AssociatedTyValue> { 789) -> Arc<AssociatedTyValue> {
@@ -800,12 +797,12 @@ pub(crate) fn associated_ty_value_query(
800} 797}
801 798
802fn type_alias_associated_ty_value( 799fn type_alias_associated_ty_value(
803 db: &impl HirDatabase, 800 db: &dyn HirDatabase,
804 _krate: CrateId, 801 _krate: CrateId,
805 type_alias: TypeAliasId, 802 type_alias: TypeAliasId,
806) -> Arc<AssociatedTyValue> { 803) -> Arc<AssociatedTyValue> {
807 let type_alias_data = db.type_alias_data(type_alias); 804 let type_alias_data = db.type_alias_data(type_alias);
808 let impl_id = match type_alias.lookup(db).container { 805 let impl_id = match type_alias.lookup(db.upcast()).container {
809 AssocContainerId::ImplId(it) => it, 806 AssocContainerId::ImplId(it) => it,
810 _ => panic!("assoc ty value should be in impl"), 807 _ => panic!("assoc ty value should be in impl"),
811 }; 808 };