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