diff options
author | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2019-11-25 12:57:53 +0000 |
---|---|---|
committer | GitHub <[email protected]> | 2019-11-25 12:57:53 +0000 |
commit | 1a9717b07241eb8f7610f1ff600b55cf5eaaf75f (patch) | |
tree | 6dd5653f77a3eabb015c5a9172e32e83eb0e6039 /crates/ra_hir/src/ty/lower.rs | |
parent | c46cea2ad8239315d51952bfb1dad65c200dae7c (diff) | |
parent | 5f39c5794ec2521e9bb4c108771a1644269859ab (diff) |
Merge #2400
2400: Use GenericDefIdMore r=matklad a=matklad
Co-authored-by: Aleksey Kladov <[email protected]>
Diffstat (limited to 'crates/ra_hir/src/ty/lower.rs')
-rw-r--r-- | crates/ra_hir/src/ty/lower.rs | 32 |
1 files changed, 17 insertions, 15 deletions
diff --git a/crates/ra_hir/src/ty/lower.rs b/crates/ra_hir/src/ty/lower.rs index da3c8e94a..1ceafd9b1 100644 --- a/crates/ra_hir/src/ty/lower.rs +++ b/crates/ra_hir/src/ty/lower.rs | |||
@@ -29,8 +29,8 @@ use crate::{ | |||
29 | Adt, | 29 | Adt, |
30 | }, | 30 | }, |
31 | util::make_mut_slice, | 31 | util::make_mut_slice, |
32 | Const, Enum, EnumVariant, Function, GenericDef, ImplBlock, ModuleDef, Path, Static, Struct, | 32 | Const, Enum, EnumVariant, Function, ImplBlock, ModuleDef, Path, Static, Struct, Trait, |
33 | Trait, TypeAlias, Union, | 33 | TypeAlias, Union, |
34 | }; | 34 | }; |
35 | 35 | ||
36 | // FIXME: this is only really used in `type_for_def`, which contains a bunch of | 36 | // FIXME: this is only really used in `type_for_def`, which contains a bunch of |
@@ -261,8 +261,10 @@ impl Ty { | |||
261 | let traits = traits_from_env.flat_map(|t| t.all_super_traits(db)); | 261 | let traits = traits_from_env.flat_map(|t| t.all_super_traits(db)); |
262 | for t in traits { | 262 | for t in traits { |
263 | if let Some(associated_ty) = t.associated_type_by_name(db, &segment.name) { | 263 | if let Some(associated_ty) = t.associated_type_by_name(db, &segment.name) { |
264 | let substs = | 264 | let substs = Substs::build_for_def(db, t.id) |
265 | Substs::build_for_def(db, t).push(self_ty.clone()).fill_with_unknown().build(); | 265 | .push(self_ty.clone()) |
266 | .fill_with_unknown() | ||
267 | .build(); | ||
266 | // FIXME handle type parameters on the segment | 268 | // FIXME handle type parameters on the segment |
267 | return Ty::Projection(ProjectionTy { associated_ty, parameters: substs }); | 269 | return Ty::Projection(ProjectionTy { associated_ty, parameters: substs }); |
268 | } | 270 | } |
@@ -287,11 +289,11 @@ impl Ty { | |||
287 | segment: &PathSegment, | 289 | segment: &PathSegment, |
288 | resolved: TypableDef, | 290 | resolved: TypableDef, |
289 | ) -> Substs { | 291 | ) -> Substs { |
290 | let def_generic: Option<GenericDef> = match resolved { | 292 | let def_generic: Option<GenericDefId> = match resolved { |
291 | TypableDef::Function(func) => Some(func.into()), | 293 | TypableDef::Function(func) => Some(func.id.into()), |
292 | TypableDef::Adt(adt) => Some(adt.into()), | 294 | TypableDef::Adt(adt) => Some(adt.into()), |
293 | TypableDef::EnumVariant(var) => Some(var.parent_enum(db).into()), | 295 | TypableDef::EnumVariant(var) => Some(var.parent_enum(db).id.into()), |
294 | TypableDef::TypeAlias(t) => Some(t.into()), | 296 | TypableDef::TypeAlias(t) => Some(t.id.into()), |
295 | TypableDef::Const(_) | TypableDef::Static(_) | TypableDef::BuiltinType(_) => None, | 297 | TypableDef::Const(_) | TypableDef::Static(_) | TypableDef::BuiltinType(_) => None, |
296 | }; | 298 | }; |
297 | substs_from_path_segment(db, resolver, segment, def_generic, false) | 299 | substs_from_path_segment(db, resolver, segment, def_generic, false) |
@@ -338,7 +340,7 @@ pub(super) fn substs_from_path_segment( | |||
338 | db: &impl HirDatabase, | 340 | db: &impl HirDatabase, |
339 | resolver: &Resolver, | 341 | resolver: &Resolver, |
340 | segment: &PathSegment, | 342 | segment: &PathSegment, |
341 | def_generic: Option<GenericDef>, | 343 | def_generic: Option<GenericDefId>, |
342 | add_self_param: bool, | 344 | add_self_param: bool, |
343 | ) -> Substs { | 345 | ) -> Substs { |
344 | let mut substs = Vec::new(); | 346 | let mut substs = Vec::new(); |
@@ -376,7 +378,7 @@ pub(super) fn substs_from_path_segment( | |||
376 | 378 | ||
377 | // handle defaults | 379 | // handle defaults |
378 | if let Some(def_generic) = def_generic { | 380 | if let Some(def_generic) = def_generic { |
379 | let default_substs = db.generic_defaults(def_generic); | 381 | let default_substs = db.generic_defaults(def_generic.into()); |
380 | assert_eq!(substs.len(), default_substs.len()); | 382 | assert_eq!(substs.len(), default_substs.len()); |
381 | 383 | ||
382 | for (i, default_ty) in default_substs.iter().enumerate() { | 384 | for (i, default_ty) in default_substs.iter().enumerate() { |
@@ -439,7 +441,7 @@ impl TraitRef { | |||
439 | ) -> Substs { | 441 | ) -> Substs { |
440 | let has_self_param = | 442 | let has_self_param = |
441 | segment.args_and_bindings.as_ref().map(|a| a.has_self_type).unwrap_or(false); | 443 | segment.args_and_bindings.as_ref().map(|a| a.has_self_type).unwrap_or(false); |
442 | substs_from_path_segment(db, resolver, segment, Some(resolved.into()), !has_self_param) | 444 | substs_from_path_segment(db, resolver, segment, Some(resolved.id.into()), !has_self_param) |
443 | } | 445 | } |
444 | 446 | ||
445 | pub(crate) fn for_trait(db: &impl HirDatabase, trait_: Trait) -> TraitRef { | 447 | pub(crate) fn for_trait(db: &impl HirDatabase, trait_: Trait) -> TraitRef { |
@@ -579,10 +581,10 @@ pub(crate) fn field_types_query( | |||
579 | /// these are fine: `T: Foo<U::Item>, U: Foo<()>`. | 581 | /// these are fine: `T: Foo<U::Item>, U: Foo<()>`. |
580 | pub(crate) fn generic_predicates_for_param_query( | 582 | pub(crate) fn generic_predicates_for_param_query( |
581 | db: &impl HirDatabase, | 583 | db: &impl HirDatabase, |
582 | def: GenericDef, | 584 | def: GenericDefId, |
583 | param_idx: u32, | 585 | param_idx: u32, |
584 | ) -> Arc<[GenericPredicate]> { | 586 | ) -> Arc<[GenericPredicate]> { |
585 | let resolver = GenericDefId::from(def).resolver(db); | 587 | let resolver = def.resolver(db); |
586 | resolver | 588 | resolver |
587 | .where_predicates_in_scope() | 589 | .where_predicates_in_scope() |
588 | // we have to filter out all other predicates *first*, before attempting to lower them | 590 | // we have to filter out all other predicates *first*, before attempting to lower them |
@@ -615,8 +617,8 @@ pub(crate) fn generic_predicates_query( | |||
615 | } | 617 | } |
616 | 618 | ||
617 | /// Resolve the default type params from generics | 619 | /// Resolve the default type params from generics |
618 | pub(crate) fn generic_defaults_query(db: &impl HirDatabase, def: GenericDef) -> Substs { | 620 | pub(crate) fn generic_defaults_query(db: &impl HirDatabase, def: GenericDefId) -> Substs { |
619 | let resolver = GenericDefId::from(def).resolver(db); | 621 | let resolver = def.resolver(db); |
620 | let generic_params = db.generic_params(def.into()); | 622 | let generic_params = db.generic_params(def.into()); |
621 | 623 | ||
622 | let defaults = generic_params | 624 | let defaults = generic_params |