@@ -2232,16 +2232,18 @@ fn test() {
22322232}
22332233"# ) ,
22342234 @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+ "###
22452247 ) ;
22462248}
22472249
@@ -2259,17 +2261,19 @@ fn test() {
22592261}
22602262"# ) ,
22612263 @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+ "###
22732277 ) ;
22742278}
22752279
@@ -2822,6 +2826,94 @@ fn test(s: S) {
28222826 assert_eq ! ( t, "{unknown}" ) ;
28232827}
28242828
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+
28252917fn type_at_pos ( db : & MockDatabase , pos : FilePosition ) -> String {
28262918 let file = db. parse ( pos. file_id ) . ok ( ) . unwrap ( ) ;
28272919 let expr = algo:: find_node_at_offset :: < ast:: Expr > ( file. syntax ( ) , pos. offset ) . unwrap ( ) ;
0 commit comments