From 065d3987012b138b123f0544de193f8bb560b1b5 Mon Sep 17 00:00:00 2001 From: Florian Diebold Date: Sat, 6 Jul 2019 16:41:04 +0200 Subject: Add trait obligations for where clauses when calling functions/methods E.g. if we call `foo>(x)`, that adds an obligation that `x: Into`, etc. --- crates/ra_hir/src/ty/tests.rs | 134 +++++++++++++++++++++++++++++++++++------- 1 file changed, 113 insertions(+), 21 deletions(-) (limited to 'crates/ra_hir/src/ty/tests.rs') 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() { } "#), @r###" -[86; 87) 't': T -[92; 94) '{}': () -[105; 144) '{ ...(s); }': () -[115; 116) 's': S<{unknown}> -[119; 120) 'S': S<{unknown}>(T) -> S -[119; 129) 'S(unknown)': S<{unknown}> -[121; 128) 'unknown': {unknown} -[135; 138) 'foo': fn foo>(T) -> () -[135; 141) 'foo(s)': () -[139; 140) 's': S<{unknown}>"### + ⋮ + ⋮[86; 87) 't': T + ⋮[92; 94) '{}': () + ⋮[105; 144) '{ ...(s); }': () + ⋮[115; 116) 's': S + ⋮[119; 120) 'S': S(T) -> S + ⋮[119; 129) 'S(unknown)': S + ⋮[121; 128) 'unknown': u32 + ⋮[135; 138) 'foo': fn foo>(T) -> () + ⋮[135; 141) 'foo(s)': () + ⋮[139; 140) 's': S + "### ); } @@ -2259,17 +2261,19 @@ fn test() { } "#), @r###" -[87; 88) 't': T -[98; 100) '{}': () -[111; 163) '{ ...(s); }': () -[121; 122) 's': S<{unknown}> -[125; 126) 'S': S<{unknown}>(T) -> S -[125; 135) 'S(unknown)': S<{unknown}> -[127; 134) 'unknown': {unknown} -[145; 146) 'x': u32 -[154; 157) 'foo': fn foo>(T) -> U -[154; 160) 'foo(s)': u32 -[158; 159) 's': S<{unknown}>"### + ⋮ + ⋮[87; 88) 't': T + ⋮[98; 100) '{}': () + ⋮[111; 163) '{ ...(s); }': () + ⋮[121; 122) 's': S + ⋮[125; 126) 'S': S(T) -> S + ⋮[125; 135) 'S(unknown)': S + ⋮[127; 134) 'unknown': u32 + ⋮[145; 146) 'x': u32 + ⋮[154; 157) 'foo': fn foo>(T) -> U + ⋮[154; 160) 'foo(s)': u32 + ⋮[158; 159) 's': S + "### ); } @@ -2822,6 +2826,94 @@ fn test(s: S) { assert_eq!(t, "{unknown}"); } +#[test] +fn obligation_from_function_clause() { + let t = type_at( + r#" +//- /main.rs +struct S; + +trait Trait {} +impl Trait for S {} + +fn foo, U>(t: T) -> U {} + +fn test(s: S) { + foo(s)<|>; +} +"#, + ); + assert_eq!(t, "u32"); +} + +#[test] +fn obligation_from_method_clause() { + let t = type_at( + r#" +//- /main.rs +struct S; + +trait Trait {} +impl Trait for S {} + +struct O; +impl O { + fn foo, U>(&self, t: T) -> U {} +} + +fn test() { + O.foo(S)<|>; +} +"#, + ); + assert_eq!(t, "isize"); +} + +#[test] +fn obligation_from_self_method_clause() { + let t = type_at( + r#" +//- /main.rs +struct S; + +trait Trait {} +impl Trait for S {} + +impl S { + fn foo(&self) -> U where Self: Trait {} +} + +fn test() { + S.foo()<|>; +} +"#, + ); + assert_eq!(t, "i64"); +} + +#[test] +fn obligation_from_impl_clause() { + let t = type_at( + r#" +//- /main.rs +struct S; + +trait Trait {} +impl Trait<&str> for S {} + +struct O; +impl> O { + fn foo(&self) -> U {} +} + +fn test(o: O) { + o.foo()<|>; +} +"#, + ); + assert_eq!(t, "&str"); +} + fn type_at_pos(db: &MockDatabase, pos: FilePosition) -> String { let file = db.parse(pos.file_id).ok().unwrap(); let expr = algo::find_node_at_offset::(file.syntax(), pos.offset).unwrap(); -- cgit v1.2.3