@@ -2232,16 +2232,18 @@ fn test() {
2232
2232
}
2233
2233
"# ) ,
2234
2234
@r###"
2235
- [86; 87) 't': T
2236
- [92; 94) '{}': ()
2237
- [105; 144) '{ ...(s); }': ()
2238
- [115; 116) 's': S<{unknown}>
2239
- [119; 120) 'S': S<{unknown}>(T) -> S<T>
2240
- [119; 129) 'S(unknown)': S<{unknown}>
2241
- [121; 128) 'unknown': {unknown}
2242
- [135; 138) 'foo': fn foo<S<{unknown}>>(T) -> ()
2243
- [135; 141) 'foo(s)': ()
2244
- [139; 140) 's': S<{unknown}>"###
2235
+ ⋮
2236
+ ⋮[86; 87) 't': T
2237
+ ⋮[92; 94) '{}': ()
2238
+ ⋮[105; 144) '{ ...(s); }': ()
2239
+ ⋮[115; 116) 's': S<u32>
2240
+ ⋮[119; 120) 'S': S<u32>(T) -> S<T>
2241
+ ⋮[119; 129) 'S(unknown)': S<u32>
2242
+ ⋮[121; 128) 'unknown': u32
2243
+ ⋮[135; 138) 'foo': fn foo<S<u32>>(T) -> ()
2244
+ ⋮[135; 141) 'foo(s)': ()
2245
+ ⋮[139; 140) 's': S<u32>
2246
+ "###
2245
2247
) ;
2246
2248
}
2247
2249
@@ -2259,17 +2261,19 @@ fn test() {
2259
2261
}
2260
2262
"# ) ,
2261
2263
@r###"
2262
- [87; 88) 't': T
2263
- [98; 100) '{}': ()
2264
- [111; 163) '{ ...(s); }': ()
2265
- [121; 122) 's': S<{unknown}>
2266
- [125; 126) 'S': S<{unknown}>(T) -> S<T>
2267
- [125; 135) 'S(unknown)': S<{unknown}>
2268
- [127; 134) 'unknown': {unknown}
2269
- [145; 146) 'x': u32
2270
- [154; 157) 'foo': fn foo<u32, S<{unknown}>>(T) -> U
2271
- [154; 160) 'foo(s)': u32
2272
- [158; 159) 's': S<{unknown}>"###
2264
+ ⋮
2265
+ ⋮[87; 88) 't': T
2266
+ ⋮[98; 100) '{}': ()
2267
+ ⋮[111; 163) '{ ...(s); }': ()
2268
+ ⋮[121; 122) 's': S<u32>
2269
+ ⋮[125; 126) 'S': S<u32>(T) -> S<T>
2270
+ ⋮[125; 135) 'S(unknown)': S<u32>
2271
+ ⋮[127; 134) 'unknown': u32
2272
+ ⋮[145; 146) 'x': u32
2273
+ ⋮[154; 157) 'foo': fn foo<u32, S<u32>>(T) -> U
2274
+ ⋮[154; 160) 'foo(s)': u32
2275
+ ⋮[158; 159) 's': S<u32>
2276
+ "###
2273
2277
) ;
2274
2278
}
2275
2279
@@ -2822,6 +2826,94 @@ fn test(s: S) {
2822
2826
assert_eq ! ( t, "{unknown}" ) ;
2823
2827
}
2824
2828
2829
+ #[ test]
2830
+ fn obligation_from_function_clause ( ) {
2831
+ let t = type_at (
2832
+ r#"
2833
+ //- /main.rs
2834
+ struct S;
2835
+
2836
+ trait Trait<T> {}
2837
+ impl Trait<u32> for S {}
2838
+
2839
+ fn foo<T: Trait<U>, U>(t: T) -> U {}
2840
+
2841
+ fn test(s: S) {
2842
+ foo(s)<|>;
2843
+ }
2844
+ "# ,
2845
+ ) ;
2846
+ assert_eq ! ( t, "u32" ) ;
2847
+ }
2848
+
2849
+ #[ test]
2850
+ fn obligation_from_method_clause ( ) {
2851
+ let t = type_at (
2852
+ r#"
2853
+ //- /main.rs
2854
+ struct S;
2855
+
2856
+ trait Trait<T> {}
2857
+ impl Trait<isize> for S {}
2858
+
2859
+ struct O;
2860
+ impl O {
2861
+ fn foo<T: Trait<U>, U>(&self, t: T) -> U {}
2862
+ }
2863
+
2864
+ fn test() {
2865
+ O.foo(S)<|>;
2866
+ }
2867
+ "# ,
2868
+ ) ;
2869
+ assert_eq ! ( t, "isize" ) ;
2870
+ }
2871
+
2872
+ #[ test]
2873
+ fn obligation_from_self_method_clause ( ) {
2874
+ let t = type_at (
2875
+ r#"
2876
+ //- /main.rs
2877
+ struct S;
2878
+
2879
+ trait Trait<T> {}
2880
+ impl Trait<i64> for S {}
2881
+
2882
+ impl S {
2883
+ fn foo<U>(&self) -> U where Self: Trait<U> {}
2884
+ }
2885
+
2886
+ fn test() {
2887
+ S.foo()<|>;
2888
+ }
2889
+ "# ,
2890
+ ) ;
2891
+ assert_eq ! ( t, "i64" ) ;
2892
+ }
2893
+
2894
+ #[ test]
2895
+ fn obligation_from_impl_clause ( ) {
2896
+ let t = type_at (
2897
+ r#"
2898
+ //- /main.rs
2899
+ struct S;
2900
+
2901
+ trait Trait<T> {}
2902
+ impl Trait<&str> for S {}
2903
+
2904
+ struct O<T>;
2905
+ impl<U, T: Trait<U>> O<T> {
2906
+ fn foo(&self) -> U {}
2907
+ }
2908
+
2909
+ fn test(o: O<S>) {
2910
+ o.foo()<|>;
2911
+ }
2912
+ "# ,
2913
+ ) ;
2914
+ assert_eq ! ( t, "&str" ) ;
2915
+ }
2916
+
2825
2917
fn type_at_pos ( db : & MockDatabase , pos : FilePosition ) -> String {
2826
2918
let file = db. parse ( pos. file_id ) . ok ( ) . unwrap ( ) ;
2827
2919
let expr = algo:: find_node_at_offset :: < ast:: Expr > ( file. syntax ( ) , pos. offset ) . unwrap ( ) ;
0 commit comments