diff options
Diffstat (limited to 'crates/ra_hir/src/ty/tests.rs')
-rw-r--r-- | crates/ra_hir/src/ty/tests.rs | 134 |
1 files changed, 113 insertions, 21 deletions
diff --git a/crates/ra_hir/src/ty/tests.rs b/crates/ra_hir/src/ty/tests.rs index 20fa74fb4..aacd94a26 100644 --- a/crates/ra_hir/src/ty/tests.rs +++ b/crates/ra_hir/src/ty/tests.rs | |||
@@ -2232,16 +2232,18 @@ fn test() { | |||
2232 | } | 2232 | } |
2233 | "#), | 2233 | "#), |
2234 | @r###" | 2234 | @r###" |
2235 | [86; 87) 't': T | 2235 | ⋮ |
2236 | [92; 94) '{}': () | 2236 | ⋮[86; 87) 't': T |
2237 | [105; 144) '{ ...(s); }': () | 2237 | ⋮[92; 94) '{}': () |
2238 | [115; 116) 's': S<{unknown}> | 2238 | ⋮[105; 144) '{ ...(s); }': () |
2239 | [119; 120) 'S': S<{unknown}>(T) -> S<T> | 2239 | ⋮[115; 116) 's': S<u32> |
2240 | [119; 129) 'S(unknown)': S<{unknown}> | 2240 | ⋮[119; 120) 'S': S<u32>(T) -> S<T> |
2241 | [121; 128) 'unknown': {unknown} | 2241 | ⋮[119; 129) 'S(unknown)': S<u32> |
2242 | [135; 138) 'foo': fn foo<S<{unknown}>>(T) -> () | 2242 | ⋮[121; 128) 'unknown': u32 |
2243 | [135; 141) 'foo(s)': () | 2243 | ⋮[135; 138) 'foo': fn foo<S<u32>>(T) -> () |
2244 | [139; 140) 's': S<{unknown}>"### | 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 | @r###" | 2263 | @r###" |
2262 | [87; 88) 't': T | 2264 | ⋮ |
2263 | [98; 100) '{}': () | 2265 | ⋮[87; 88) 't': T |
2264 | [111; 163) '{ ...(s); }': () | 2266 | ⋮[98; 100) '{}': () |
2265 | [121; 122) 's': S<{unknown}> | 2267 | ⋮[111; 163) '{ ...(s); }': () |
2266 | [125; 126) 'S': S<{unknown}>(T) -> S<T> | 2268 | ⋮[121; 122) 's': S<u32> |
2267 | [125; 135) 'S(unknown)': S<{unknown}> | 2269 | ⋮[125; 126) 'S': S<u32>(T) -> S<T> |
2268 | [127; 134) 'unknown': {unknown} | 2270 | ⋮[125; 135) 'S(unknown)': S<u32> |
2269 | [145; 146) 'x': u32 | 2271 | ⋮[127; 134) 'unknown': u32 |
2270 | [154; 157) 'foo': fn foo<u32, S<{unknown}>>(T) -> U | 2272 | ⋮[145; 146) 'x': u32 |
2271 | [154; 160) 'foo(s)': u32 | 2273 | ⋮[154; 157) 'foo': fn foo<u32, S<u32>>(T) -> U |
2272 | [158; 159) 's': S<{unknown}>"### | 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 | assert_eq!(t, "{unknown}"); | 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 | fn type_at_pos(db: &MockDatabase, pos: FilePosition) -> String { | 2917 | fn type_at_pos(db: &MockDatabase, pos: FilePosition) -> String { |
2826 | let file = db.parse(pos.file_id).ok().unwrap(); | 2918 | let file = db.parse(pos.file_id).ok().unwrap(); |
2827 | let expr = algo::find_node_at_offset::<ast::Expr>(file.syntax(), pos.offset).unwrap(); | 2919 | let expr = algo::find_node_at_offset::<ast::Expr>(file.syntax(), pos.offset).unwrap(); |