v2 / vlib / v / ast / comptime_const_values.v
340 lines · 317 sloc · 5.04 KB · 8e35f4d9848f7ad35d857a187dddbfd2eca5e19d
Raw
1module ast
2
3pub type ComptTimeConstValue = EmptyExpr
4 | f32
5 | f64
6 | i16
7 | i32
8 | i64
9 | i8
10 | rune
11 | string
12 | u16
13 | u32
14 | u64
15 | u8
16 | voidptr
17
18//| int
19
20// i8 tries to return a `ComptTimeConstValue` as `i8` type.
21pub fn (val ComptTimeConstValue) i8() ?i8 {
22 x := val.i64()?
23 if x > -129 && x < 128 {
24 return i8(x)
25 }
26 return none
27}
28
29// i16 tries to return a `ComptTimeConstValue` as `i16` type.
30pub fn (val ComptTimeConstValue) i16() ?i16 {
31 x := val.i64()?
32 if x > -32769 && x < 32768 {
33 return i16(x)
34 }
35 return none
36}
37
38// int tries to return a `ComptTimeConstValue` as `int` type.
39pub fn (val ComptTimeConstValue) int() ?int {
40 x := val.i64()?
41 if x > -2147483649 && x < 2147483648 {
42 return int(x)
43 }
44 return none
45}
46
47// i32 tries to return a `ComptTimeConstValue` as `i32` type.
48pub fn (val ComptTimeConstValue) i32() ?i32 {
49 x := val.i64()?
50 if x > -2147483649 && x < 2147483648 {
51 return i32(x)
52 }
53 return none
54}
55
56// voidptr tries to return a `ComptTimeConstValue` as `voidptr` type.
57pub fn (val ComptTimeConstValue) voidptr() ?voidptr {
58 match val {
59 i8, i16, i32, i64 { return voidptr(i64(val)) }
60 u8, u16, u32, u64 { return voidptr(u64(val)) }
61 rune { return voidptr(u64(val)) }
62 voidptr { return val }
63 string, EmptyExpr, f32, f64 {}
64 }
65
66 return none
67}
68
69// i64 tries to return a `ComptTimeConstValue` as i64 type.
70pub fn (val ComptTimeConstValue) i64() ?i64 {
71 match val {
72 i8 {
73 return i64(val)
74 }
75 i16 {
76 return i64(val)
77 }
78 i32 {
79 return i64(val)
80 }
81 i64 {
82 return i64(val)
83 }
84 u8 {
85 return i64(val)
86 }
87 u16 {
88 return i64(val)
89 }
90 u32 {
91 return i64(val)
92 }
93 u64 {
94 if val <= 9223372036854775807 {
95 return i64(val)
96 }
97 }
98 //
99 f32 {
100 if -9223372036854775808.0 <= val && val <= 9223372036854775807.0 {
101 return i64(val)
102 }
103 }
104 f64 {
105 if -9223372036854775808.0 <= val && val <= 9223372036854775807.0 {
106 return i64(val)
107 }
108 }
109 //
110 string {
111 return val.i64()
112 }
113 rune {
114 return int(val)
115 }
116 voidptr {
117 return i64(val)
118 }
119 EmptyExpr {}
120 }
121
122 return none
123}
124
125// u8 tries to return a `ComptTimeConstValue` as `u8` type.
126pub fn (val ComptTimeConstValue) u8() ?u8 {
127 x := val.u64()?
128 if x < 256 {
129 return u8(x)
130 }
131 return none
132}
133
134// u16 tries to return a `ComptTimeConstValue` as `u16` type.
135pub fn (val ComptTimeConstValue) u16() ?u16 {
136 x := val.u64()?
137 if x < 65536 {
138 return u16(x)
139 }
140 return none
141}
142
143// u32 tries to return a `ComptTimeConstValue` as `u32` type.
144pub fn (val ComptTimeConstValue) u32() ?u32 {
145 x := val.u64()?
146 if x < 4294967296 {
147 return u32(x)
148 }
149 return none
150}
151
152// u64 tries to return a `ComptTimeConstValue` as `u64` type.
153pub fn (val ComptTimeConstValue) u64() ?u64 {
154 match val {
155 i8 {
156 if val >= 0 {
157 return u64(val)
158 }
159 }
160 i16 {
161 if val >= 0 {
162 return u64(val)
163 }
164 }
165 i32 {
166 if val >= 0 {
167 return u64(val)
168 }
169 }
170 i64 {
171 if val >= 0 {
172 return u64(val)
173 }
174 }
175 // int {
176 // if val >= 0 {
177 // return u64(val)
178 //}
179 //}
180 u8 {
181 return u64(val)
182 }
183 u16 {
184 return u64(val)
185 }
186 u32 {
187 return u64(val)
188 }
189 u64 {
190 return val
191 }
192 f32 {
193 if val <= 18446744073709551615.0 {
194 return u64(val)
195 }
196 }
197 f64 {
198 if val <= 18446744073709551615.0 {
199 return u64(val)
200 }
201 }
202 string {
203 return val.u64()
204 }
205 voidptr {
206 return u64(val)
207 }
208 rune {
209 return u64(val)
210 }
211 EmptyExpr {}
212 }
213
214 return none
215}
216
217// f32 tries to return a `ComptTimeConstValue` as `f32` type.
218pub fn (val ComptTimeConstValue) f32() ?f32 {
219 x := val.f64()?
220 return f32(x)
221}
222
223// f64 tries to return a `ComptTimeConstValue` as `f64` type.
224pub fn (val ComptTimeConstValue) f64() ?f64 {
225 match val {
226 i8 {
227 return f64(val)
228 }
229 i16 {
230 return f64(val)
231 }
232 i32 {
233 return f64(val)
234 }
235 i64 {
236 return f64(val)
237 }
238 // int {
239 // return f64(val)
240 //}
241 u8 {
242 return f64(val)
243 }
244 u16 {
245 return f64(val)
246 }
247 u32 {
248 return f64(val)
249 }
250 u64 {
251 return f64(val)
252 }
253 f32 {
254 return f64(val)
255 }
256 f64 {
257 return val
258 }
259 string {
260 return val.f64()
261 }
262 voidptr {}
263 rune {}
264 EmptyExpr {}
265 }
266
267 return none
268}
269
270// string tries to return a `ComptTimeConstValue` as `string` type.
271pub fn (val ComptTimeConstValue) string() ?string {
272 match val {
273 i8 {
274 return val.str()
275 }
276 i16 {
277 return val.str()
278 }
279 i32 {
280 return val.str()
281 }
282 i64 {
283 return val.str()
284 }
285 // int {
286 // return val.str()
287 //}
288 u8 {
289 return val.str()
290 }
291 u16 {
292 return val.str()
293 }
294 u32 {
295 return val.str()
296 }
297 u64 {
298 return val.str()
299 }
300 f32 {
301 return val.str()
302 }
303 f64 {
304 return val.str()
305 }
306 rune {
307 return val.str()
308 }
309 string {
310 return val
311 }
312 voidptr {
313 return ptr_str(val)
314 }
315 EmptyExpr {}
316 }
317
318 return none
319}
320
321pub fn (obj ConstField) comptime_expr_value() ?ComptTimeConstValue {
322 if obj.comptime_expr_value !is EmptyExpr {
323 return obj.comptime_expr_value
324 }
325 return none
326}
327
328pub fn (obj ConstField) is_simple_define_const() bool {
329 return match obj.expr {
330 CharLiteral, FloatLiteral, IntegerLiteral { true }
331 else { false }
332 }
333}
334
335pub fn (obj ScopeObject) is_simple_define_const() bool {
336 if obj is ConstField {
337 return obj.is_simple_define_const()
338 }
339 return false
340}
341