aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_hir')
-rw-r--r--crates/ra_hir/src/code_model.rs2
-rw-r--r--crates/ra_hir/src/ty.rs13
-rw-r--r--crates/ra_hir/src/ty/infer/path.rs39
-rw-r--r--crates/ra_hir/src/ty/lower.rs14
-rw-r--r--crates/ra_hir/src/ty/method_resolution.rs18
-rw-r--r--crates/ra_hir/src/ty/traits/chalk.rs50
6 files changed, 68 insertions, 68 deletions
diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs
index 9578c20b0..7b5d78543 100644
--- a/crates/ra_hir/src/code_model.rs
+++ b/crates/ra_hir/src/code_model.rs
@@ -741,7 +741,7 @@ impl Trait {
741 } 741 }
742 742
743 pub fn trait_ref(self, db: &impl HirDatabase) -> TraitRef { 743 pub fn trait_ref(self, db: &impl HirDatabase) -> TraitRef {
744 TraitRef::for_trait(db, self) 744 TraitRef::for_trait(db, self.id)
745 } 745 }
746 746
747 pub fn is_auto(self, db: &impl DefDatabase) -> bool { 747 pub fn is_auto(self, db: &impl DefDatabase) -> bool {
diff --git a/crates/ra_hir/src/ty.rs b/crates/ra_hir/src/ty.rs
index 2a2dc26b4..3711068fa 100644
--- a/crates/ra_hir/src/ty.rs
+++ b/crates/ra_hir/src/ty.rs
@@ -26,7 +26,7 @@ use ra_db::{impl_intern_key, salsa};
26 26
27use crate::{ 27use crate::{
28 db::HirDatabase, expr::ExprId, util::make_mut_slice, Adt, Crate, FloatTy, IntTy, Mutability, 28 db::HirDatabase, expr::ExprId, util::make_mut_slice, Adt, Crate, FloatTy, IntTy, Mutability,
29 Name, Trait, Uncertain, 29 Name, Uncertain,
30}; 30};
31use display::{HirDisplay, HirFormatter}; 31use display::{HirDisplay, HirFormatter};
32 32
@@ -445,7 +445,7 @@ impl Deref for Substs {
445#[derive(Clone, PartialEq, Eq, Debug, Hash)] 445#[derive(Clone, PartialEq, Eq, Debug, Hash)]
446pub struct TraitRef { 446pub struct TraitRef {
447 /// FIXME name? 447 /// FIXME name?
448 pub trait_: Trait, 448 pub trait_: TraitId,
449 pub substs: Substs, 449 pub substs: Substs,
450} 450}
451 451
@@ -676,7 +676,7 @@ impl Ty {
676 } 676 }
677 677
678 /// If this is an `impl Trait` or `dyn Trait`, returns that trait. 678 /// If this is an `impl Trait` or `dyn Trait`, returns that trait.
679 pub fn inherent_trait(&self) -> Option<Trait> { 679 pub fn inherent_trait(&self) -> Option<TraitId> {
680 match self { 680 match self {
681 Ty::Dyn(predicates) | Ty::Opaque(predicates) => { 681 Ty::Dyn(predicates) | Ty::Opaque(predicates) => {
682 predicates.iter().find_map(|pred| match pred { 682 predicates.iter().find_map(|pred| match pred {
@@ -988,7 +988,10 @@ impl HirDisplay for Ty {
988 write!( 988 write!(
989 f, 989 f,
990 "{}", 990 "{}",
991 trait_ref.trait_.name(f.db).unwrap_or_else(Name::missing) 991 f.db.trait_data(trait_ref.trait_)
992 .name
993 .clone()
994 .unwrap_or_else(Name::missing)
992 )?; 995 )?;
993 if trait_ref.substs.len() > 1 { 996 if trait_ref.substs.len() > 1 {
994 write!(f, "<")?; 997 write!(f, "<")?;
@@ -1049,7 +1052,7 @@ impl TraitRef {
1049 } else { 1052 } else {
1050 write!(f, ": ")?; 1053 write!(f, ": ")?;
1051 } 1054 }
1052 write!(f, "{}", self.trait_.name(f.db).unwrap_or_else(Name::missing))?; 1055 write!(f, "{}", f.db.trait_data(self.trait_).name.clone().unwrap_or_else(Name::missing))?;
1053 if self.substs.len() > 1 { 1056 if self.substs.len() > 1 {
1054 write!(f, "<")?; 1057 write!(f, "<")?;
1055 f.write_joined(&self.substs[1..], ", ")?; 1058 f.write_joined(&self.substs[1..], ", ")?;
diff --git a/crates/ra_hir/src/ty/infer/path.rs b/crates/ra_hir/src/ty/infer/path.rs
index 6165eba4f..202fff4f3 100644
--- a/crates/ra_hir/src/ty/infer/path.rs
+++ b/crates/ra_hir/src/ty/infer/path.rs
@@ -143,24 +143,27 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> {
143 id: ExprOrPatId, 143 id: ExprOrPatId,
144 ) -> Option<(ValueNs, Option<Substs>)> { 144 ) -> Option<(ValueNs, Option<Substs>)> {
145 let trait_ = trait_ref.trait_; 145 let trait_ = trait_ref.trait_;
146 let item = trait_.items(self.db).iter().copied().find_map(|item| match item { 146 let item =
147 AssocItem::Function(func) => { 147 self.db.trait_data(trait_).items.iter().map(|(_name, id)| (*id).into()).find_map(
148 if segment.name == func.name(self.db) { 148 |item| match item {
149 Some(AssocItem::Function(func)) 149 AssocItem::Function(func) => {
150 } else { 150 if segment.name == func.name(self.db) {
151 None 151 Some(AssocItem::Function(func))
152 } 152 } else {
153 } 153 None
154 }
155 }
154 156
155 AssocItem::Const(konst) => { 157 AssocItem::Const(konst) => {
156 if konst.name(self.db).map_or(false, |n| n == segment.name) { 158 if konst.name(self.db).map_or(false, |n| n == segment.name) {
157 Some(AssocItem::Const(konst)) 159 Some(AssocItem::Const(konst))
158 } else { 160 } else {
159 None 161 None
160 } 162 }
161 } 163 }
162 AssocItem::TypeAlias(_) => None, 164 AssocItem::TypeAlias(_) => None,
163 })?; 165 },
166 )?;
164 let def = match item { 167 let def = match item {
165 AssocItem::Function(f) => ValueNs::FunctionId(f.id), 168 AssocItem::Function(f) => ValueNs::FunctionId(f.id),
166 AssocItem::Const(c) => ValueNs::ConstId(c.id), 169 AssocItem::Const(c) => ValueNs::ConstId(c.id),
@@ -212,7 +215,7 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> {
212 .fill_with_params() 215 .fill_with_params()
213 .build(); 216 .build();
214 self.obligations.push(super::Obligation::Trait(TraitRef { 217 self.obligations.push(super::Obligation::Trait(TraitRef {
215 trait_: t, 218 trait_: t.id,
216 substs: trait_substs, 219 substs: trait_substs,
217 })); 220 }));
218 Some(substs) 221 Some(substs)
diff --git a/crates/ra_hir/src/ty/lower.rs b/crates/ra_hir/src/ty/lower.rs
index 805a73ff5..a7149614d 100644
--- a/crates/ra_hir/src/ty/lower.rs
+++ b/crates/ra_hir/src/ty/lower.rs
@@ -15,7 +15,7 @@ use hir_def::{
15 resolver::{HasResolver, Resolver, TypeNs}, 15 resolver::{HasResolver, Resolver, TypeNs},
16 type_ref::{TypeBound, TypeRef}, 16 type_ref::{TypeBound, TypeRef},
17 AdtId, AstItemDef, EnumVariantId, FunctionId, GenericDefId, HasModule, LocalStructFieldId, 17 AdtId, AstItemDef, EnumVariantId, FunctionId, GenericDefId, HasModule, LocalStructFieldId,
18 Lookup, StructId, VariantId, 18 Lookup, StructId, TraitId, VariantId,
19}; 19};
20use ra_arena::map::ArenaMap; 20use ra_arena::map::ArenaMap;
21use ra_db::CrateId; 21use ra_db::CrateId;
@@ -172,7 +172,7 @@ impl Ty {
172 let segment = &remaining_segments[0]; 172 let segment = &remaining_segments[0];
173 let associated_ty = associated_type_by_name_including_super_traits( 173 let associated_ty = associated_type_by_name_including_super_traits(
174 db, 174 db,
175 trait_ref.trait_.id, 175 trait_ref.trait_,
176 &segment.name, 176 &segment.name,
177 ); 177 );
178 match associated_ty { 178 match associated_ty {
@@ -263,7 +263,7 @@ impl Ty {
263 GenericPredicate::Implemented(tr) if tr.self_ty() == &self_ty => Some(tr.trait_), 263 GenericPredicate::Implemented(tr) if tr.self_ty() == &self_ty => Some(tr.trait_),
264 _ => None, 264 _ => None,
265 }); 265 });
266 let traits = traits_from_env.flat_map(|t| all_super_traits(db, t.id)).map(Trait::from); 266 let traits = traits_from_env.flat_map(|t| all_super_traits(db, t)).map(Trait::from);
267 for t in traits { 267 for t in traits {
268 if let Some(associated_ty) = db.trait_data(t.id).associated_type_by_name(&segment.name) 268 if let Some(associated_ty) = db.trait_data(t.id).associated_type_by_name(&segment.name)
269 { 269 {
@@ -423,7 +423,7 @@ impl TraitRef {
423 if let Some(self_ty) = explicit_self_ty { 423 if let Some(self_ty) = explicit_self_ty {
424 make_mut_slice(&mut substs.0)[0] = self_ty; 424 make_mut_slice(&mut substs.0)[0] = self_ty;
425 } 425 }
426 TraitRef { trait_: resolved, substs } 426 TraitRef { trait_: resolved.id, substs }
427 } 427 }
428 428
429 pub(crate) fn from_hir( 429 pub(crate) fn from_hir(
@@ -450,8 +450,8 @@ impl TraitRef {
450 substs_from_path_segment(db, resolver, segment, Some(resolved.id.into()), !has_self_param) 450 substs_from_path_segment(db, resolver, segment, Some(resolved.id.into()), !has_self_param)
451 } 451 }
452 452
453 pub(crate) fn for_trait(db: &impl HirDatabase, trait_: Trait) -> TraitRef { 453 pub(crate) fn for_trait(db: &impl HirDatabase, trait_: TraitId) -> TraitRef {
454 let substs = Substs::identity(&db.generic_params(trait_.id.into())); 454 let substs = Substs::identity(&db.generic_params(trait_.into()));
455 TraitRef { trait_, substs } 455 TraitRef { trait_, substs }
456 } 456 }
457 457
@@ -510,7 +510,7 @@ fn assoc_type_bindings_from_type_bound<'a>(
510 .flat_map(|args_and_bindings| args_and_bindings.bindings.iter()) 510 .flat_map(|args_and_bindings| args_and_bindings.bindings.iter())
511 .map(move |(name, type_ref)| { 511 .map(move |(name, type_ref)| {
512 let associated_ty = 512 let associated_ty =
513 associated_type_by_name_including_super_traits(db, trait_ref.trait_.id, &name); 513 associated_type_by_name_including_super_traits(db, trait_ref.trait_, &name);
514 let associated_ty = match associated_ty { 514 let associated_ty = match associated_ty {
515 None => return GenericPredicate::Error, 515 None => return GenericPredicate::Error,
516 Some(t) => t, 516 Some(t) => t,
diff --git a/crates/ra_hir/src/ty/method_resolution.rs b/crates/ra_hir/src/ty/method_resolution.rs
index 9988570e8..f1bc638ee 100644
--- a/crates/ra_hir/src/ty/method_resolution.rs
+++ b/crates/ra_hir/src/ty/method_resolution.rs
@@ -68,7 +68,7 @@ impl CrateImplBlocks {
68 if let Some(tr) = 68 if let Some(tr) =
69 TraitRef::from_hir(db, &resolver, &trait_ref, Some(target_ty)) 69 TraitRef::from_hir(db, &resolver, &trait_ref, Some(target_ty))
70 { 70 {
71 res.impls_by_trait.entry(tr.trait_.id).or_default().push(impl_id); 71 res.impls_by_trait.entry(tr.trait_).or_default().push(impl_id);
72 } 72 }
73 } 73 }
74 None => { 74 None => {
@@ -249,13 +249,11 @@ fn iterate_trait_method_candidates<T>(
249 let traits_from_env = env 249 let traits_from_env = env
250 .trait_predicates_for_self_ty(&ty.value) 250 .trait_predicates_for_self_ty(&ty.value)
251 .map(|tr| tr.trait_) 251 .map(|tr| tr.trait_)
252 .flat_map(|t| all_super_traits(db, t.id)) 252 .flat_map(|t| all_super_traits(db, t));
253 .map(Trait::from); 253 let traits =
254 let traits = inherent_trait 254 inherent_trait.chain(traits_from_env).chain(resolver.traits_in_scope(db).into_iter());
255 .chain(traits_from_env)
256 .chain(resolver.traits_in_scope(db).into_iter().map(Trait::from));
257 'traits: for t in traits { 255 'traits: for t in traits {
258 let data = db.trait_data(t.id); 256 let data = db.trait_data(t);
259 257
260 // we'll be lazy about checking whether the type implements the 258 // we'll be lazy about checking whether the type implements the
261 // trait, but if we find out it doesn't, we'll skip the rest of the 259 // trait, but if we find out it doesn't, we'll skip the rest of the
@@ -330,7 +328,7 @@ pub(crate) fn implements_trait(
330 db: &impl HirDatabase, 328 db: &impl HirDatabase,
331 resolver: &Resolver, 329 resolver: &Resolver,
332 krate: Crate, 330 krate: Crate,
333 trait_: Trait, 331 trait_: TraitId,
334) -> bool { 332) -> bool {
335 if ty.value.inherent_trait() == Some(trait_) { 333 if ty.value.inherent_trait() == Some(trait_) {
336 // FIXME this is a bit of a hack, since Chalk should say the same thing 334 // FIXME this is a bit of a hack, since Chalk should say the same thing
@@ -373,11 +371,11 @@ impl Ty {
373fn generic_implements_goal( 371fn generic_implements_goal(
374 db: &impl HirDatabase, 372 db: &impl HirDatabase,
375 env: Arc<TraitEnvironment>, 373 env: Arc<TraitEnvironment>,
376 trait_: Trait, 374 trait_: TraitId,
377 self_ty: Canonical<Ty>, 375 self_ty: Canonical<Ty>,
378) -> Canonical<InEnvironment<super::Obligation>> { 376) -> Canonical<InEnvironment<super::Obligation>> {
379 let num_vars = self_ty.num_vars; 377 let num_vars = self_ty.num_vars;
380 let substs = super::Substs::build_for_def(db, trait_.id) 378 let substs = super::Substs::build_for_def(db, trait_)
381 .push(self_ty.value) 379 .push(self_ty.value)
382 .fill_with_bound_vars(num_vars as u32) 380 .fill_with_bound_vars(num_vars as u32)
383 .build(); 381 .build();
diff --git a/crates/ra_hir/src/ty/traits/chalk.rs b/crates/ra_hir/src/ty/traits/chalk.rs
index 78f4b3e27..02d37dead 100644
--- a/crates/ra_hir/src/ty/traits/chalk.rs
+++ b/crates/ra_hir/src/ty/traits/chalk.rs
@@ -9,7 +9,9 @@ use chalk_ir::{
9}; 9};
10use chalk_rust_ir::{AssociatedTyDatum, AssociatedTyValue, ImplDatum, StructDatum, TraitDatum}; 10use chalk_rust_ir::{AssociatedTyDatum, AssociatedTyValue, ImplDatum, StructDatum, TraitDatum};
11 11
12use hir_def::{lang_item::LangItemTarget, ContainerId, GenericDefId, Lookup, TraitId, TypeAliasId}; 12use hir_def::{
13 lang_item::LangItemTarget, AstItemDef, ContainerId, GenericDefId, Lookup, TraitId, TypeAliasId,
14};
13use hir_expand::name; 15use hir_expand::name;
14 16
15use ra_db::salsa::{InternId, InternKey}; 17use ra_db::salsa::{InternId, InternKey};
@@ -19,7 +21,7 @@ use crate::{
19 db::HirDatabase, 21 db::HirDatabase,
20 ty::display::HirDisplay, 22 ty::display::HirDisplay,
21 ty::{ApplicationTy, GenericPredicate, ProjectionTy, Substs, TraitRef, Ty, TypeCtor, TypeWalk}, 23 ty::{ApplicationTy, GenericPredicate, ProjectionTy, Substs, TraitRef, Ty, TypeCtor, TypeWalk},
22 Crate, ImplBlock, Trait, TypeAlias, 24 Crate, ImplBlock, TypeAlias,
23}; 25};
24 26
25/// This represents a trait whose name we could not resolve. 27/// This represents a trait whose name we could not resolve.
@@ -167,15 +169,15 @@ impl ToChalk for TraitRef {
167 } 169 }
168} 170}
169 171
170impl ToChalk for Trait { 172impl ToChalk for TraitId {
171 type Chalk = chalk_ir::TraitId; 173 type Chalk = chalk_ir::TraitId;
172 174
173 fn to_chalk(self, _db: &impl HirDatabase) -> chalk_ir::TraitId { 175 fn to_chalk(self, _db: &impl HirDatabase) -> chalk_ir::TraitId {
174 chalk_ir::TraitId(id_to_chalk(self.id)) 176 chalk_ir::TraitId(id_to_chalk(self))
175 } 177 }
176 178
177 fn from_chalk(_db: &impl HirDatabase, trait_id: chalk_ir::TraitId) -> Trait { 179 fn from_chalk(_db: &impl HirDatabase, trait_id: chalk_ir::TraitId) -> TraitId {
178 Trait { id: id_from_chalk(trait_id.0) } 180 id_from_chalk(trait_id.0)
179 } 181 }
180} 182}
181 183
@@ -443,10 +445,10 @@ where
443 if trait_id == UNKNOWN_TRAIT { 445 if trait_id == UNKNOWN_TRAIT {
444 return Vec::new(); 446 return Vec::new();
445 } 447 }
446 let trait_: Trait = from_chalk(self.db, trait_id); 448 let trait_: TraitId = from_chalk(self.db, trait_id);
447 let mut result: Vec<_> = self 449 let mut result: Vec<_> = self
448 .db 450 .db
449 .impls_for_trait(self.krate, trait_) 451 .impls_for_trait(self.krate, trait_.into())
450 .iter() 452 .iter()
451 .copied() 453 .copied()
452 .map(Impl::ImplBlock) 454 .map(Impl::ImplBlock)
@@ -459,7 +461,7 @@ where
459 [super::FnTrait::FnOnce, super::FnTrait::FnMut, super::FnTrait::Fn].iter() 461 [super::FnTrait::FnOnce, super::FnTrait::FnMut, super::FnTrait::Fn].iter()
460 { 462 {
461 if let Some(actual_trait) = get_fn_trait(self.db, self.krate, fn_trait) { 463 if let Some(actual_trait) = get_fn_trait(self.db, self.krate, fn_trait) {
462 if trait_.id == actual_trait { 464 if trait_ == actual_trait {
463 let impl_ = super::ClosureFnTraitImplData { def, expr, fn_trait }; 465 let impl_ = super::ClosureFnTraitImplData { def, expr, fn_trait };
464 result.push(Impl::ClosureFnTraitImpl(impl_).to_chalk(self.db)); 466 result.push(Impl::ClosureFnTraitImpl(impl_).to_chalk(self.db));
465 } 467 }
@@ -516,7 +518,7 @@ pub(crate) fn associated_ty_data_query(
516 where_clauses: vec![], 518 where_clauses: vec![],
517 }; 519 };
518 let datum = AssociatedTyDatum { 520 let datum = AssociatedTyDatum {
519 trait_id: Trait::from(trait_).to_chalk(db), 521 trait_id: trait_.to_chalk(db),
520 id, 522 id,
521 name: lalrpop_intern::intern(&db.type_alias_data(type_alias).name.to_string()), 523 name: lalrpop_intern::intern(&db.type_alias_data(type_alias).name.to_string()),
522 binders: make_binders(bound_data, generic_params.count_params_including_parent()), 524 binders: make_binders(bound_data, generic_params.count_params_including_parent()),
@@ -548,29 +550,23 @@ pub(crate) fn trait_datum_query(
548 associated_ty_ids: vec![], 550 associated_ty_ids: vec![],
549 }); 551 });
550 } 552 }
551 let trait_: Trait = from_chalk(db, trait_id); 553 let trait_: TraitId = from_chalk(db, trait_id);
552 debug!("trait {:?} = {:?}", trait_id, trait_.name(db)); 554 let trait_data = db.trait_data(trait_);
553 let generic_params = db.generic_params(trait_.id.into()); 555 debug!("trait {:?} = {:?}", trait_id, trait_data.name);
556 let generic_params = db.generic_params(trait_.into());
554 let bound_vars = Substs::bound_vars(&generic_params); 557 let bound_vars = Substs::bound_vars(&generic_params);
555 let flags = chalk_rust_ir::TraitFlags { 558 let flags = chalk_rust_ir::TraitFlags {
556 auto: trait_.is_auto(db), 559 auto: trait_data.auto,
557 upstream: trait_.module(db).krate() != krate, 560 upstream: trait_.module(db).krate != krate.crate_id,
558 non_enumerable: true, 561 non_enumerable: true,
559 coinductive: false, // only relevant for Chalk testing 562 coinductive: false, // only relevant for Chalk testing
560 // FIXME set these flags correctly 563 // FIXME set these flags correctly
561 marker: false, 564 marker: false,
562 fundamental: false, 565 fundamental: false,
563 }; 566 };
564 let where_clauses = convert_where_clauses(db, trait_.id.into(), &bound_vars); 567 let where_clauses = convert_where_clauses(db, trait_.into(), &bound_vars);
565 let associated_ty_ids = trait_ 568 let associated_ty_ids =
566 .items(db) 569 trait_data.associated_types().map(|type_alias| type_alias.to_chalk(db)).collect();
567 .into_iter()
568 .filter_map(|trait_item| match trait_item {
569 crate::AssocItem::TypeAlias(type_alias) => Some(type_alias.id),
570 _ => None,
571 })
572 .map(|type_alias| type_alias.to_chalk(db))
573 .collect();
574 let trait_datum_bound = chalk_rust_ir::TraitDatumBound { where_clauses }; 570 let trait_datum_bound = chalk_rust_ir::TraitDatumBound { where_clauses };
575 let trait_datum = TraitDatum { 571 let trait_datum = TraitDatum {
576 id: trait_id, 572 id: trait_id,
@@ -661,7 +657,7 @@ fn impl_block_datum(
661 }; 657 };
662 658
663 let impl_datum_bound = chalk_rust_ir::ImplDatumBound { trait_ref, where_clauses }; 659 let impl_datum_bound = chalk_rust_ir::ImplDatumBound { trait_ref, where_clauses };
664 let trait_data = db.trait_data(trait_.id); 660 let trait_data = db.trait_data(trait_);
665 let associated_ty_value_ids = impl_block 661 let associated_ty_value_ids = impl_block
666 .items(db) 662 .items(db)
667 .into_iter() 663 .into_iter()
@@ -785,7 +781,7 @@ fn type_alias_associated_ty_value(
785 .expect("assoc ty value should not exist") // we don't return any assoc ty values if the impl'd trait can't be resolved 781 .expect("assoc ty value should not exist") // we don't return any assoc ty values if the impl'd trait can't be resolved
786 .trait_; 782 .trait_;
787 let assoc_ty = db 783 let assoc_ty = db
788 .trait_data(trait_.id) 784 .trait_data(trait_)
789 .associated_type_by_name(&type_alias.name(db)) 785 .associated_type_by_name(&type_alias.name(db))
790 .expect("assoc ty value should not exist"); // validated when building the impl data as well 786 .expect("assoc ty value should not exist"); // validated when building the impl data as well
791 let generic_params = db.generic_params(impl_block.id.into()); 787 let generic_params = db.generic_params(impl_block.id.into());