aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir/src/ty/tests.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_hir/src/ty/tests.rs')
-rw-r--r--crates/ra_hir/src/ty/tests.rs98
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#"
2615trait Trait { 2615trait Trait {
2616 fn method() -> u32; 2616 fn method(&self) -> u32;
2617} 2617}
2618fn test<T: Trait>(t: T) { 2618fn 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#"
2636trait Trait<T> { 2636trait Trait<T> {
2637 fn method() -> T; 2637 fn method(&self) -> T;
2638} 2638}
2639fn test<U, T: Trait<U>>(t: T) { 2639fn 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]
2687fn infer_project_associated_type() { 2687fn 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#"
2690trait Iterable { 2691trait 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;
2721impl Iterable for S { type Item = u32; } 2725impl Iterable for S { type Item = u32; }
2722fn foo1<T: Iterable>(t: T) -> T::Item {} 2726fn foo1<T: Iterable>(t: T) -> T::Item {}
2723fn foo2<T: Iterable>(t: T) -> <T as Iterable>::Item {} 2727fn foo2<T: Iterable>(t: T) -> <T as Iterable>::Item {}
2728fn foo3<T: Iterable>(t: T) -> <T>::Item {}
2724fn test() { 2729fn 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]
4066fn unselected_projection_in_trait_env() {
4067 let t = type_at(
4068 r#"
4069//- /main.rs
4070trait Trait {
4071 type Item;
4072}
4073
4074trait Trait2 {
4075 fn foo(&self) -> u32;
4076}
4077
4078fn 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]
4088fn unselected_projection_in_trait_env_cycle() {
4089 let t = type_at(
4090 r#"
4091//- /main.rs
4092trait Trait {
4093 type Item;
4094}
4095
4096trait Trait2<T> {}
4097
4098fn 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
4053fn type_at_pos(db: &MockDatabase, pos: FilePosition) -> String { 4107fn 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();