@@ -4,131 +4,181 @@ defmodule ElixirLS.LanguageServer.Providers.CodeLens.TypeSpec.ContractTranslator
4
4
5
5
test "translate struct when struct.t type exists" do
6
6
contract = '() -> \# {\' __struct__\' :=\' Elixir.DateTime\' }'
7
- assert "foo :: DateTime.t()" == ContractTranslator . translate_contract ( :foo , contract , false )
7
+
8
+ assert "foo :: DateTime.t()" ==
9
+ ContractTranslator . translate_contract ( :foo , contract , false , Atom )
8
10
end
9
11
10
12
test "don't translate struct when struct.t type does not exist" do
11
13
contract = '() -> \# {\' __struct__\' :=\' Elixir.SomeOtherStruct\' }'
12
14
13
15
assert "foo :: %SomeOtherStruct{}" ==
14
- ContractTranslator . translate_contract ( :foo , contract , false )
16
+ ContractTranslator . translate_contract ( :foo , contract , false , Atom )
15
17
end
16
18
17
19
test "struct" do
18
20
contract = '() -> \# {\' __struct__\' :=atom(), atom()=>any()}'
19
- assert "foo :: struct" == ContractTranslator . translate_contract ( :foo , contract , false )
21
+ assert "foo :: struct" == ContractTranslator . translate_contract ( :foo , contract , false , Atom )
20
22
end
21
23
22
24
test "drop macro env argument" do
23
25
contract = '(any(), integer()) -> integer()'
24
26
25
27
assert "foo(any, integer) :: integer" ==
26
- ContractTranslator . translate_contract ( :foo , contract , false )
28
+ ContractTranslator . translate_contract ( :foo , contract , false , Atom )
27
29
28
30
assert "foo(integer) :: integer" ==
29
- ContractTranslator . translate_contract ( :foo , contract , true )
31
+ ContractTranslator . translate_contract ( :foo , contract , true , Atom )
30
32
end
31
33
32
34
test "atom :ok" do
33
35
contract = '(any()) -> ok'
34
- assert "foo(any) :: :ok" == ContractTranslator . translate_contract ( :foo , contract , false )
36
+ assert "foo(any) :: :ok" == ContractTranslator . translate_contract ( :foo , contract , false , Atom )
35
37
end
36
38
37
39
test "atom true" do
38
40
contract = '(any()) -> true'
39
- assert "foo(any) :: true" == ContractTranslator . translate_contract ( :foo , contract , false )
41
+
42
+ assert "foo(any) :: true" ==
43
+ ContractTranslator . translate_contract ( :foo , contract , false , Atom )
40
44
end
41
45
42
46
test "atom _ substitution" do
43
47
contract = '(_) -> false'
44
- assert "foo(any) :: false" == ContractTranslator . translate_contract ( :foo , contract , false )
48
+
49
+ assert "foo(any) :: false" ==
50
+ ContractTranslator . translate_contract ( :foo , contract , false , Atom )
45
51
end
46
52
47
53
test "do not drop when substitutions" do
48
54
contract = '(X) -> atom() when X :: any()'
49
55
50
56
assert "foo(x) :: atom when x: any" ==
51
- ContractTranslator . translate_contract ( :foo , contract , false )
57
+ ContractTranslator . translate_contract ( :foo , contract , false , Atom )
52
58
end
53
59
54
60
test "keyword" do
55
61
contract = '(any()) -> list({atom(), any()})'
56
- assert "foo(any) :: keyword" == ContractTranslator . translate_contract ( :foo , contract , false )
62
+
63
+ assert "foo(any) :: keyword" ==
64
+ ContractTranslator . translate_contract ( :foo , contract , false , Atom )
57
65
58
66
contract = '(any()) -> list({atom(), _})'
59
- assert "foo(any) :: keyword" == ContractTranslator . translate_contract ( :foo , contract , false )
67
+
68
+ assert "foo(any) :: keyword" ==
69
+ ContractTranslator . translate_contract ( :foo , contract , false , Atom )
60
70
end
61
71
62
72
test "keyword(t)" do
63
73
contract = '(any()) -> list({atom(), integer()})'
64
74
65
75
assert "foo(any) :: keyword(integer)" ==
66
- ContractTranslator . translate_contract ( :foo , contract , false )
76
+ ContractTranslator . translate_contract ( :foo , contract , false , Atom )
67
77
end
68
78
69
79
test "[type]" do
70
80
contract = '(any()) -> list(atom())'
71
- assert "foo(any) :: [atom]" == ContractTranslator . translate_contract ( :foo , contract , false )
81
+
82
+ assert "foo(any) :: [atom]" ==
83
+ ContractTranslator . translate_contract ( :foo , contract , false , Atom )
72
84
end
73
85
74
86
test "list" do
75
87
contract = '(any()) -> list(any())'
76
- assert "foo(any) :: list" == ContractTranslator . translate_contract ( :foo , contract , false )
88
+
89
+ assert "foo(any) :: list" ==
90
+ ContractTranslator . translate_contract ( :foo , contract , false , Atom )
77
91
end
78
92
79
93
test "empty list" do
80
94
contract = '(any()) -> []'
81
- assert "foo(any) :: []" == ContractTranslator . translate_contract ( :foo , contract , false )
95
+ assert "foo(any) :: []" == ContractTranslator . translate_contract ( :foo , contract , false , Atom )
82
96
end
83
97
84
98
test "[...]" do
85
99
contract = '(any()) -> nonempty_list(any())'
86
- assert "foo(any) :: [...]" == ContractTranslator . translate_contract ( :foo , contract , false )
100
+
101
+ assert "foo(any) :: [...]" ==
102
+ ContractTranslator . translate_contract ( :foo , contract , false , Atom )
87
103
88
104
contract = '(any()) -> nonempty_list(_)'
89
- assert "foo(any) :: [...]" == ContractTranslator . translate_contract ( :foo , contract , false )
105
+
106
+ assert "foo(any) :: [...]" ==
107
+ ContractTranslator . translate_contract ( :foo , contract , false , Atom )
90
108
end
91
109
92
110
test "[type, ...]" do
93
111
contract = '(any()) -> nonempty_list(atom())'
94
112
95
113
assert "foo(any) :: [atom, ...]" ==
96
- ContractTranslator . translate_contract ( :foo , contract , false )
114
+ ContractTranslator . translate_contract ( :foo , contract , false , Atom )
97
115
end
98
116
99
117
test "undoes conversion of :_ to any inside bitstring" do
100
118
contract = '(any()) -> <<_:2, _:_*3>>'
101
119
102
120
assert "foo(any) :: <<_::2, _::_*3>>" ==
103
- ContractTranslator . translate_contract ( :foo , contract , false )
121
+ ContractTranslator . translate_contract ( :foo , contract , false , Atom )
104
122
end
105
123
106
124
test "function" do
107
125
contract = '(any()) -> fun((...) -> ok)'
108
126
109
127
assert "foo(any) :: (... -> :ok)" ==
110
- ContractTranslator . translate_contract ( :foo , contract , false )
128
+ ContractTranslator . translate_contract ( :foo , contract , false , Atom )
111
129
end
112
130
113
131
test "fun" do
114
132
contract = '(any()) -> fun((...) -> any())'
115
- assert "foo(any) :: fun" == ContractTranslator . translate_contract ( :foo , contract , false )
133
+ assert "foo(any) :: fun" == ContractTranslator . translate_contract ( :foo , contract , false , Atom )
116
134
end
117
135
118
136
test "empty map" do
119
137
contract = '(any()) -> \# {}'
120
- assert "foo(any) :: %{}" == ContractTranslator . translate_contract ( :foo , contract , false )
138
+ assert "foo(any) :: %{}" == ContractTranslator . translate_contract ( :foo , contract , false , Atom )
121
139
end
122
140
123
141
test "map" do
124
142
contract = '(any()) -> \# {any()=>any()}'
125
- assert "foo(any) :: map" == ContractTranslator . translate_contract ( :foo , contract , false )
143
+ assert "foo(any) :: map" == ContractTranslator . translate_contract ( :foo , contract , false , Atom )
126
144
end
127
145
128
146
test "map with fields" do
129
147
contract = '(any()) -> \# {integer()=>any(), 1:=atom(), abc:=4}'
130
148
131
149
assert "foo(any) :: %{optional(integer) => any, 1 => atom, :abc => 4}" ==
132
- ContractTranslator . translate_contract ( :foo , contract , false )
150
+ ContractTranslator . translate_contract ( :foo , contract , false , Atom )
151
+ end
152
+
153
+ test "defprotocol type t" do
154
+ contract = '(any()) -> any()'
155
+
156
+ assert "foo(t) :: any" ==
157
+ ContractTranslator . translate_contract ( :foo , contract , false , Enumerable )
158
+
159
+ contract = '(any(), any()) -> any()'
160
+
161
+ assert "foo(t, any) :: any" ==
162
+ ContractTranslator . translate_contract ( :foo , contract , false , Enumerable )
163
+
164
+ contract = '(any()) -> any()'
165
+ assert "foo(any) :: any" == ContractTranslator . translate_contract ( :foo , contract , false , Atom )
166
+
167
+ contract = '(any(), any()) -> any()'
168
+
169
+ assert "foo(any, any) :: any" ==
170
+ ContractTranslator . translate_contract ( :foo , contract , false , Atom )
171
+ end
172
+
173
+ test "defimpl first arg" do
174
+ contract = '(any()) -> any()'
175
+
176
+ assert "count(list) :: any" ==
177
+ ContractTranslator . translate_contract ( :count , contract , false , Enumerable.List )
178
+
179
+ contract = '(any()) -> any()'
180
+
181
+ assert "count(Date.Range.t()) :: any" ==
182
+ ContractTranslator . translate_contract ( :count , contract , false , Enumerable.Date.Range )
133
183
end
134
184
end
0 commit comments