diff options
author | Florian Diebold <[email protected]> | 2019-02-16 21:06:23 +0000 |
---|---|---|
committer | Florian Diebold <[email protected]> | 2019-02-16 22:06:41 +0000 |
commit | 65bd9bc3a800e09f52a315cf98e86c120c366c2c (patch) | |
tree | 954a439a7c83898c36a0f2516e4a91c37c03c7dc /crates/ra_hir/src/ty.rs | |
parent | 2af067b391bf37950cf1d3f1af863d931b385af5 (diff) |
Handle impl generics in method calls
Diffstat (limited to 'crates/ra_hir/src/ty.rs')
-rw-r--r-- | crates/ra_hir/src/ty.rs | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/crates/ra_hir/src/ty.rs b/crates/ra_hir/src/ty.rs index f28a7e731..db0a20514 100644 --- a/crates/ra_hir/src/ty.rs +++ b/crates/ra_hir/src/ty.rs | |||
@@ -421,7 +421,8 @@ impl Ty { | |||
421 | (var.parent_enum(db).generic_params(db), segment) | 421 | (var.parent_enum(db).generic_params(db), segment) |
422 | } | 422 | } |
423 | }; | 423 | }; |
424 | // substs_from_path | 424 | let parent_param_count = def_generics.count_parent_params(); |
425 | substs.extend((0..parent_param_count).map(|_| Ty::Unknown)); | ||
425 | if let Some(generic_args) = &segment.args_and_bindings { | 426 | if let Some(generic_args) = &segment.args_and_bindings { |
426 | // if args are provided, it should be all of them, but we can't rely on that | 427 | // if args are provided, it should be all of them, but we can't rely on that |
427 | let param_count = def_generics.params.len(); | 428 | let param_count = def_generics.params.len(); |
@@ -436,9 +437,8 @@ impl Ty { | |||
436 | } | 437 | } |
437 | // add placeholders for args that were not provided | 438 | // add placeholders for args that were not provided |
438 | // TODO: handle defaults | 439 | // TODO: handle defaults |
439 | let supplied_params = | 440 | let supplied_params = substs.len(); |
440 | segment.args_and_bindings.as_ref().map(|ga| ga.args.len()).unwrap_or(0); | 441 | for _ in supplied_params..def_generics.count_params_including_parent() { |
441 | for _ in supplied_params..def_generics.params.len() { | ||
442 | substs.push(Ty::Unknown); | 442 | substs.push(Ty::Unknown); |
443 | } | 443 | } |
444 | assert_eq!(substs.len(), def_generics.params.len()); | 444 | assert_eq!(substs.len(), def_generics.params.len()); |
@@ -666,7 +666,12 @@ fn type_for_fn(db: &impl HirDatabase, def: Function) -> Ty { | |||
666 | } | 666 | } |
667 | 667 | ||
668 | fn make_substs(generics: &GenericParams) -> Substs { | 668 | fn make_substs(generics: &GenericParams) -> Substs { |
669 | Substs(generics.params.iter().map(|_p| Ty::Unknown).collect::<Vec<_>>().into()) | 669 | Substs( |
670 | (0..generics.count_params_including_parent()) | ||
671 | .map(|_p| Ty::Unknown) | ||
672 | .collect::<Vec<_>>() | ||
673 | .into(), | ||
674 | ) | ||
670 | } | 675 | } |
671 | 676 | ||
672 | fn type_for_struct(db: &impl HirDatabase, s: Struct) -> Ty { | 677 | fn type_for_struct(db: &impl HirDatabase, s: Struct) -> Ty { |