Skip to content

Commit 87bcf12

Browse files
committed
Add refinement tests
1 parent a060e60 commit 87bcf12

File tree

5 files changed

+250
-26
lines changed

5 files changed

+250
-26
lines changed

crates/uitest/fixtures/ty_check/functor.fe renamed to crates/hir-analysis/test_files/ty_check/refinement.fe

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ impl Fn<i32, bool> for MyFn {
2424
}
2525
}
2626

27-
impl Functor for Result<()> {
27+
impl<E> Functor for Result<E> {
2828
fn map<T, U, F: Fn<T, U>>(self: Self<T>, _ f: F) -> Self<U> {
2929
match self {
3030
Result::Ok(t) => Result::Ok(f.call(t))
@@ -35,5 +35,20 @@ impl Functor for Result<()> {
3535

3636
fn f() {
3737
let r1 = Result<(), i32>::Ok(10)
38-
let r2 = r1.map(MyFn{}) // TODO: type of r2 should be inferred
38+
let r2 = r1.map(MyFn{})
39+
}
40+
41+
42+
trait MyTrait {}
43+
impl MyTrait for i32 {}
44+
45+
fn g<T>() -> T
46+
where T: MyTrait
47+
{
48+
todo()
49+
50+
}
51+
52+
fn h() {
53+
let _ = g()
3954
}
Lines changed: 224 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,224 @@
1+
---
2+
source: crates/hir-analysis/tests/ty_check.rs
3+
expression: res
4+
input_file: crates/hir-analysis/test_files/ty_check/refinement.fe
5+
---
6+
note:
7+
┌─ refinement.fe:22:37
8+
9+
22fn call(self, _ t: i32) -> bool {
10+
│ ╭─────────────────────────────────────^
11+
23 │ │ return true
12+
24 │ │ }
13+
│ ╰─────^ bool
14+
15+
note:
16+
┌─ refinement.fe:23:16
17+
18+
23return true
19+
^^^^ bool
20+
21+
note:
22+
┌─ refinement.fe:28:65
23+
24+
28fn map<T, U, F: Fn<T, U>>(self: Self<T>, _ f: F) -> Self<U> {
25+
│ ╭─────────────────────────────────────────────────────────────────^
26+
29 │ │ match self {
27+
30 │ │ Result::Ok(t) => Result::Ok(f.call(t))
28+
31 │ │ Result::Err(e) => Result::Err(e)
29+
32 │ │ }
30+
33 │ │ }
31+
│ ╰─────^ Result<E, U>
32+
33+
note:
34+
┌─ refinement.fe:29:9
35+
36+
29 │ ╭ match self {
37+
30 │ │ Result::Ok(t) => Result::Ok(f.call(t))
38+
31 │ │ Result::Err(e) => Result::Err(e)
39+
32 │ │ }
40+
│ ╰─────────^ Result<E, U>
41+
42+
note:
43+
┌─ refinement.fe:29:15
44+
45+
29 │ match self {
46+
^^^^ Result<E, T>
47+
48+
note:
49+
┌─ refinement.fe:30:13
50+
51+
30Result::Ok(t) => Result::Ok(f.call(t))
52+
^^^^^^^^^^^^^ Result<E, T>
53+
54+
note:
55+
┌─ refinement.fe:30:24
56+
57+
30Result::Ok(t) => Result::Ok(f.call(t))
58+
^ T
59+
60+
note:
61+
┌─ refinement.fe:30:30
62+
63+
30Result::Ok(t) => Result::Ok(f.call(t))
64+
^^^^^^^^^^ fn Ok<E, U>
65+
66+
note:
67+
┌─ refinement.fe:30:30
68+
69+
30Result::Ok(t) => Result::Ok(f.call(t))
70+
^^^^^^^^^^^^^^^^^^^^^ Result<E, U>
71+
72+
note:
73+
┌─ refinement.fe:30:41
74+
75+
30Result::Ok(t) => Result::Ok(f.call(t))
76+
^ F
77+
78+
note:
79+
┌─ refinement.fe:30:41
80+
81+
30Result::Ok(t) => Result::Ok(f.call(t))
82+
^^^^^^^^^ U
83+
84+
note:
85+
┌─ refinement.fe:30:48
86+
87+
30Result::Ok(t) => Result::Ok(f.call(t))
88+
^ T
89+
90+
note:
91+
┌─ refinement.fe:31:13
92+
93+
31Result::Err(e) => Result::Err(e)
94+
^^^^^^^^^^^^^^ Result<E, T>
95+
96+
note:
97+
┌─ refinement.fe:31:25
98+
99+
31Result::Err(e) => Result::Err(e)
100+
^ E
101+
102+
note:
103+
┌─ refinement.fe:31:31
104+
105+
31Result::Err(e) => Result::Err(e)
106+
^^^^^^^^^^^ fn Err<E, U>
107+
108+
note:
109+
┌─ refinement.fe:31:31
110+
111+
31Result::Err(e) => Result::Err(e)
112+
^^^^^^^^^^^^^^ Result<E, U>
113+
114+
note:
115+
┌─ refinement.fe:31:43
116+
117+
31Result::Err(e) => Result::Err(e)
118+
^ E
119+
120+
note:
121+
┌─ refinement.fe:36:8
122+
123+
36fn f() {
124+
│ ╭────────^
125+
37 │ │ let r1 = Result<(), i32>::Ok(10)
126+
38 │ │ let r2 = r1.map(MyFn{})
127+
39 │ │ }
128+
│ ╰─^ ()
129+
130+
note:
131+
┌─ refinement.fe:37:9
132+
133+
37let r1 = Result<(), i32>::Ok(10)
134+
^^ Result<(), i32>
135+
136+
note:
137+
┌─ refinement.fe:37:14
138+
139+
37let r1 = Result<(), i32>::Ok(10)
140+
^^^^^^^^^^^^^^^^^^^ fn Ok<(), i32>
141+
142+
note:
143+
┌─ refinement.fe:37:14
144+
145+
37let r1 = Result<(), i32>::Ok(10)
146+
^^^^^^^^^^^^^^^^^^^^^^^ Result<(), i32>
147+
148+
note:
149+
┌─ refinement.fe:37:34
150+
151+
37let r1 = Result<(), i32>::Ok(10)
152+
^^ i32
153+
154+
note:
155+
┌─ refinement.fe:38:9
156+
157+
38let r2 = r1.map(MyFn{})
158+
^^ Result<(), bool>
159+
160+
note:
161+
┌─ refinement.fe:38:14
162+
163+
38let r2 = r1.map(MyFn{})
164+
^^ Result<(), i32>
165+
166+
note:
167+
┌─ refinement.fe:38:14
168+
169+
38let r2 = r1.map(MyFn{})
170+
^^^^^^^^^^^^^^ Result<(), bool>
171+
172+
note:
173+
┌─ refinement.fe:38:21
174+
175+
38let r2 = r1.map(MyFn{})
176+
^^^^^^ MyFn
177+
178+
note:
179+
┌─ refinement.fe:47:1
180+
181+
47 │ ╭ {
182+
48 │ │ todo()
183+
49 │ │
184+
50 │ │ }
185+
│ ╰─^ T
186+
187+
note:
188+
┌─ refinement.fe:48:5
189+
190+
48todo()
191+
^^^^ fn todo
192+
193+
note:
194+
┌─ refinement.fe:48:5
195+
196+
48todo()
197+
^^^^^^ T
198+
199+
note:
200+
┌─ refinement.fe:52:8
201+
202+
52fn h() {
203+
│ ╭────────^
204+
53 │ │ let _ = g()
205+
54 │ │ }
206+
│ ╰─^ ()
207+
208+
note:
209+
┌─ refinement.fe:53:9
210+
211+
53let _ = g()
212+
^ i32
213+
214+
note:
215+
┌─ refinement.fe:53:13
216+
217+
53let _ = g()
218+
^ fn g<i32>
219+
220+
note:
221+
┌─ refinement.fe:53:13
222+
223+
53 │ let _ = g()
224+
│ ^^^ i32

crates/uitest/fixtures/ty_check/functor.snap

Lines changed: 0 additions & 13 deletions
This file was deleted.

crates/uitest/fixtures/ty_check/method_bound/arg_bound.fe

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,10 +51,16 @@ impl Clone for bool {
5151
}
5252
}
5353

54+
impl Clone for i32 {
55+
fn clone(self) -> i32 {
56+
self
57+
}
58+
}
59+
5460
fn foo() -> i32 {
5561
let s = S::new(false)
5662
extract(s)
5763

5864
let opt = Some(1)
5965
extract(opt)
60-
}
66+
}

crates/uitest/fixtures/ty_check/method_bound/arg_bound.snap

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,7 @@ expression: diags
44
input_file: crates/uitest/fixtures/ty_check/method_bound/arg_bound.fe
55
---
66
error[6-0003]: trait bound is not satisfied
7-
┌─ arg_bound.fe:56:5
7+
┌─ arg_bound.fe:62:5
88
9-
56extract(s)
9+
62extract(s)
1010
^^^^^^^ `S` doesn't implement `Extract`
11-
12-
error[6-0003]: trait bound is not satisfied
13-
┌─ arg_bound.fe:59:5
14-
15-
59extract(opt)
16-
^^^^^^^ `i32` doesn't implement `Clone`
17-
18-

0 commit comments

Comments
 (0)