diff options
author | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2019-09-17 22:16:28 +0100 |
---|---|---|
committer | GitHub <[email protected]> | 2019-09-17 22:16:28 +0100 |
commit | 54379ec6f8f82a470a275771e70825634d3d553b (patch) | |
tree | 498719aafe633f9eb9cb65ba65932076981e4632 /crates/ra_hir/src/ty/tests.rs | |
parent | d505ee968b2a99eed65dfe7be27940ad9b2647c1 (diff) | |
parent | c2f9558e1af8dbf73ff86eeffcb9ea6940947dd6 (diff) |
Merge #1862
1862: Assoc item resolution refactoring (again) r=flodiebold a=flodiebold
This is #1849, with the associated type selection code removed for now. Handling cycles there will need some more thought.
Co-authored-by: Florian Diebold <[email protected]>
Diffstat (limited to 'crates/ra_hir/src/ty/tests.rs')
-rw-r--r-- | crates/ra_hir/src/ty/tests.rs | 98 |
1 files changed, 76 insertions, 22 deletions
diff --git a/crates/ra_hir/src/ty/tests.rs b/crates/ra_hir/src/ty/tests.rs index 1bd677cab..09c17fdf4 100644 --- a/crates/ra_hir/src/ty/tests.rs +++ b/crates/ra_hir/src/ty/tests.rs | |||
@@ -2613,18 +2613,18 @@ fn infer_call_trait_method_on_generic_param_1() { | |||
2613 | assert_snapshot!( | 2613 | assert_snapshot!( |
2614 | infer(r#" | 2614 | infer(r#" |
2615 | trait Trait { | 2615 | trait Trait { |
2616 | fn method() -> u32; | 2616 | fn method(&self) -> u32; |
2617 | } | 2617 | } |
2618 | fn test<T: Trait>(t: T) { | 2618 | fn test<T: Trait>(t: T) { |
2619 | t.method(); | 2619 | t.method(); |
2620 | } | 2620 | } |
2621 | "#), | 2621 | "#), |
2622 | @r###" | 2622 | @r###" |
2623 | 2623 | [30; 34) 'self': &Self | |
2624 | [59; 60) 't': T | 2624 | [64; 65) 't': T |
2625 | [65; 84) '{ ...d(); }': () | 2625 | [70; 89) '{ ...d(); }': () |
2626 | [71; 72) 't': T | 2626 | [76; 77) 't': T |
2627 | [71; 81) 't.method()': {unknown} | 2627 | [76; 86) 't.method()': u32 |
2628 | "### | 2628 | "### |
2629 | ); | 2629 | ); |
2630 | } | 2630 | } |
@@ -2634,18 +2634,18 @@ fn infer_call_trait_method_on_generic_param_2() { | |||
2634 | assert_snapshot!( | 2634 | assert_snapshot!( |
2635 | infer(r#" | 2635 | infer(r#" |
2636 | trait Trait<T> { | 2636 | trait Trait<T> { |
2637 | fn method() -> T; | 2637 | fn method(&self) -> T; |
2638 | } | 2638 | } |
2639 | fn test<U, T: Trait<U>>(t: T) { | 2639 | fn test<U, T: Trait<U>>(t: T) { |
2640 | t.method(); | 2640 | t.method(); |
2641 | } | 2641 | } |
2642 | "#), | 2642 | "#), |
2643 | @r###" | 2643 | @r###" |
2644 | 2644 | [33; 37) 'self': &Self | |
2645 | [66; 67) 't': T | 2645 | [71; 72) 't': T |
2646 | [72; 91) '{ ...d(); }': () | 2646 | [77; 96) '{ ...d(); }': () |
2647 | [78; 79) 't': T | 2647 | [83; 84) 't': T |
2648 | [78; 88) 't.method()': {unknown} | 2648 | [83; 93) 't.method()': [missing name] |
2649 | "### | 2649 | "### |
2650 | ); | 2650 | ); |
2651 | } | 2651 | } |
@@ -2685,6 +2685,7 @@ fn test() { | |||
2685 | 2685 | ||
2686 | #[test] | 2686 | #[test] |
2687 | fn infer_project_associated_type() { | 2687 | fn infer_project_associated_type() { |
2688 | // y, z, a don't yet work because of https://github.com/rust-lang/chalk/issues/234 | ||
2688 | assert_snapshot!( | 2689 | assert_snapshot!( |
2689 | infer(r#" | 2690 | infer(r#" |
2690 | trait Iterable { | 2691 | trait Iterable { |
@@ -2696,16 +2697,19 @@ fn test<T: Iterable>() { | |||
2696 | let x: <S as Iterable>::Item = 1; | 2697 | let x: <S as Iterable>::Item = 1; |
2697 | let y: <T as Iterable>::Item = no_matter; | 2698 | let y: <T as Iterable>::Item = no_matter; |
2698 | let z: T::Item = no_matter; | 2699 | let z: T::Item = no_matter; |
2700 | let a: <T>::Item = no_matter; | ||
2699 | } | 2701 | } |
2700 | "#), | 2702 | "#), |
2701 | @r###" | 2703 | @r###" |
2702 | [108; 227) '{ ...ter; }': () | 2704 | [108; 261) '{ ...ter; }': () |
2703 | [118; 119) 'x': u32 | 2705 | [118; 119) 'x': u32 |
2704 | [145; 146) '1': u32 | 2706 | [145; 146) '1': u32 |
2705 | [156; 157) 'y': {unknown} | 2707 | [156; 157) 'y': {unknown} |
2706 | [183; 192) 'no_matter': {unknown} | 2708 | [183; 192) 'no_matter': {unknown} |
2707 | [202; 203) 'z': {unknown} | 2709 | [202; 203) 'z': {unknown} |
2708 | [215; 224) 'no_matter': {unknown} | 2710 | [215; 224) 'no_matter': {unknown} |
2711 | [234; 235) 'a': {unknown} | ||
2712 | [249; 258) 'no_matter': {unknown} | ||
2709 | "### | 2713 | "### |
2710 | ); | 2714 | ); |
2711 | } | 2715 | } |
@@ -2721,9 +2725,11 @@ struct S; | |||
2721 | impl Iterable for S { type Item = u32; } | 2725 | impl Iterable for S { type Item = u32; } |
2722 | fn foo1<T: Iterable>(t: T) -> T::Item {} | 2726 | fn foo1<T: Iterable>(t: T) -> T::Item {} |
2723 | fn foo2<T: Iterable>(t: T) -> <T as Iterable>::Item {} | 2727 | fn foo2<T: Iterable>(t: T) -> <T as Iterable>::Item {} |
2728 | fn foo3<T: Iterable>(t: T) -> <T>::Item {} | ||
2724 | fn test() { | 2729 | fn test() { |
2725 | let x = foo1(S); | 2730 | let x = foo1(S); |
2726 | let y = foo2(S); | 2731 | let y = foo2(S); |
2732 | let z = foo3(S); | ||
2727 | } | 2733 | } |
2728 | "#), | 2734 | "#), |
2729 | @r###" | 2735 | @r###" |
@@ -2731,15 +2737,21 @@ fn test() { | |||
2731 | [123; 125) '{}': () | 2737 | [123; 125) '{}': () |
2732 | [147; 148) 't': T | 2738 | [147; 148) 't': T |
2733 | [178; 180) '{}': () | 2739 | [178; 180) '{}': () |
2734 | [191; 236) '{ ...(S); }': () | 2740 | [202; 203) 't': T |
2735 | [201; 202) 'x': {unknown} | 2741 | [221; 223) '{}': () |
2736 | [205; 209) 'foo1': fn foo1<S>(T) -> {unknown} | 2742 | [234; 300) '{ ...(S); }': () |
2737 | [205; 212) 'foo1(S)': {unknown} | 2743 | [244; 245) 'x': {unknown} |
2738 | [210; 211) 'S': S | 2744 | [248; 252) 'foo1': fn foo1<S>(T) -> {unknown} |
2739 | [222; 223) 'y': u32 | 2745 | [248; 255) 'foo1(S)': {unknown} |
2740 | [226; 230) 'foo2': fn foo2<S>(T) -> <T as Iterable>::Item | 2746 | [253; 254) 'S': S |
2741 | [226; 233) 'foo2(S)': u32 | 2747 | [265; 266) 'y': u32 |
2742 | [231; 232) 'S': S | 2748 | [269; 273) 'foo2': fn foo2<S>(T) -> <T as Iterable>::Item |
2749 | [269; 276) 'foo2(S)': u32 | ||
2750 | [274; 275) 'S': S | ||
2751 | [286; 287) 'z': {unknown} | ||
2752 | [290; 294) 'foo3': fn foo3<S>(T) -> {unknown} | ||
2753 | [290; 297) 'foo3(S)': {unknown} | ||
2754 | [295; 296) 'S': S | ||
2743 | "### | 2755 | "### |
2744 | ); | 2756 | ); |
2745 | } | 2757 | } |
@@ -4050,6 +4062,48 @@ fn test<F: FnOnce(u32) -> u64>(f: F) { | |||
4050 | ); | 4062 | ); |
4051 | } | 4063 | } |
4052 | 4064 | ||
4065 | #[test] | ||
4066 | fn unselected_projection_in_trait_env() { | ||
4067 | let t = type_at( | ||
4068 | r#" | ||
4069 | //- /main.rs | ||
4070 | trait Trait { | ||
4071 | type Item; | ||
4072 | } | ||
4073 | |||
4074 | trait Trait2 { | ||
4075 | fn foo(&self) -> u32; | ||
4076 | } | ||
4077 | |||
4078 | fn test<T: Trait>() where T::Item: Trait2 { | ||
4079 | let x: T::Item = no_matter; | ||
4080 | x.foo()<|>; | ||
4081 | } | ||
4082 | "#, | ||
4083 | ); | ||
4084 | assert_eq!(t, "u32"); | ||
4085 | } | ||
4086 | |||
4087 | #[test] | ||
4088 | fn unselected_projection_in_trait_env_cycle() { | ||
4089 | let t = type_at( | ||
4090 | r#" | ||
4091 | //- /main.rs | ||
4092 | trait Trait { | ||
4093 | type Item; | ||
4094 | } | ||
4095 | |||
4096 | trait Trait2<T> {} | ||
4097 | |||
4098 | fn test<T: Trait>() where T: Trait2<T::Item> { | ||
4099 | let x: T::Item = no_matter<|>; | ||
4100 | } | ||
4101 | "#, | ||
4102 | ); | ||
4103 | // this is a legitimate cycle | ||
4104 | assert_eq!(t, "{unknown}"); | ||
4105 | } | ||
4106 | |||
4053 | fn type_at_pos(db: &MockDatabase, pos: FilePosition) -> String { | 4107 | fn type_at_pos(db: &MockDatabase, pos: FilePosition) -> String { |
4054 | let file = db.parse(pos.file_id).ok().unwrap(); | 4108 | let file = db.parse(pos.file_id).ok().unwrap(); |
4055 | let expr = algo::find_node_at_offset::<ast::Expr>(file.syntax(), pos.offset).unwrap(); | 4109 | let expr = algo::find_node_at_offset::<ast::Expr>(file.syntax(), pos.offset).unwrap(); |