Skip to content

Commit 192d6d2

Browse files
authored
v: support $if T is $array_dynamic { and $if T is $array_fixed { in addition to $if T is $array { (#19882)
1 parent c838226 commit 192d6d2

File tree

8 files changed

+115
-21
lines changed

8 files changed

+115
-21
lines changed

doc/docs.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5798,6 +5798,8 @@ V supports the following compile time types:
57985798
57995799
- `$alias` => matches [Type aliases](#type-aliases).
58005800
- `$array` => matches [Arrays](#arrays) and [Fixed Size Arrays](#fixed-size-arrays).
5801+
- `$array_dynamic` => matches [Arrays](#arrays), but not [Fixed Size Arrays](#fixed-size-arrays).
5802+
- `$array_fixed` => matches [Fixed Size Arrays](#fixed-size-arrays), but not [Arrays](#arrays)
58015803
- `$enum` => matches [Enums](#enums).
58025804
- `$float` => matches `f32`, `f64` and float literals.
58035805
- `$function` => matches [Function Types](#function-types).

vlib/v/ast/ast.v

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,12 +130,15 @@ pub mut:
130130
}
131131

132132
pub enum ComptimeTypeKind {
133+
unknown
133134
map_
134135
int
135136
float
136137
struct_
137138
iface
138139
array
140+
array_fixed
141+
array_dynamic
139142
sum_type
140143
enum_
141144
alias
@@ -151,12 +154,15 @@ pub:
151154

152155
pub fn (cty ComptimeType) str() string {
153156
return match cty.kind {
157+
.unknown { '\$unknown' }
154158
.map_ { '\$map' }
155159
.int { '\$int' }
156160
.float { '\$float' }
157161
.struct_ { '\$struct' }
158162
.iface { '\$interface' }
159163
.array { '\$array' }
164+
.array_dynamic { '\$array_dynamic' }
165+
.array_fixed { '\$array_fixed' }
160166
.sum_type { '\$sumtype' }
161167
.enum_ { '\$enum' }
162168
.alias { '\$alias' }

vlib/v/ast/table.v

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2303,6 +2303,9 @@ pub fn (t &Table) get_generic_names(generic_types []Type) []string {
23032303
pub fn (t &Table) is_comptime_type(x Type, y ComptimeType) bool {
23042304
x_kind := t.type_kind(x)
23052305
match y.kind {
2306+
.unknown {
2307+
return false
2308+
}
23062309
.map_ {
23072310
return x_kind == .map
23082311
}
@@ -2322,6 +2325,12 @@ pub fn (t &Table) is_comptime_type(x Type, y ComptimeType) bool {
23222325
.array {
23232326
return x_kind in [.array, .array_fixed]
23242327
}
2328+
.array_dynamic {
2329+
return x_kind == .array
2330+
}
2331+
.array_fixed {
2332+
return x_kind == .array_fixed
2333+
}
23252334
.sum_type {
23262335
return x_kind == .sum_type
23272336
}

vlib/v/fmt/fmt.v

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -757,7 +757,10 @@ pub fn (mut f Fmt) expr(node_ ast.Expr) {
757757
}
758758
ast.ComptimeType {
759759
match node.kind {
760+
.unknown { f.write('\$unknown') }
760761
.array { f.write('\$array') }
762+
.array_dynamic { f.write('\$array_dynamic') }
763+
.array_fixed { f.write('\$array_fixed') }
761764
.struct_ { f.write('\$struct') }
762765
.iface { f.write('\$interface') }
763766
.map_ { f.write('\$map') }

vlib/v/gen/golang/golang.v

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -660,7 +660,10 @@ pub fn (mut f Gen) expr(node_ ast.Expr) {
660660
}
661661
ast.ComptimeType {
662662
match node.kind {
663+
.unknown { f.write('\$unknown') }
663664
.array { f.write('\$array') }
665+
.array_dynamic { f.write('\$array_dynamic') }
666+
.array_fixed { f.write('\$array_fixed') }
664667
.struct_ { f.write('\$struct') }
665668
.iface { f.write('\$interface') }
666669
.map_ { f.write('\$map') }

vlib/v/parser/comptime.v

Lines changed: 29 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -11,57 +11,66 @@ import v.token
1111
const (
1212
supported_comptime_calls = ['html', 'tmpl', 'env', 'embed_file', 'pkgconfig', 'compile_error',
1313
'compile_warn', 'res']
14-
comptime_types = ['map', 'array', 'int', 'float', 'struct', 'interface', 'enum',
15-
'sumtype', 'alias', 'function', 'option']
14+
comptime_types = ['map', 'array', 'array_dynamic', 'array_fixed', 'int', 'float',
15+
'struct', 'interface', 'enum', 'sumtype', 'alias', 'function', 'option']
1616
)
1717

1818
fn (mut p Parser) parse_comptime_type() ast.ComptimeType {
19-
mut node := ast.ComptimeType{ast.ComptimeTypeKind.map_, p.tok.pos()}
20-
19+
pos := p.tok.pos()
2120
p.check(.dollar)
2221
name := p.check_name()
2322
if name !in parser.comptime_types {
2423
p.error('unsupported compile-time type `${name}`: only ${parser.comptime_types} are supported')
2524
}
26-
mut cty := ast.ComptimeTypeKind.map_
27-
match name {
25+
mut kind := ast.ComptimeTypeKind.unknown
26+
kind = match name {
2827
'map' {
29-
cty = .map_
28+
.map_
3029
}
3130
'struct' {
32-
cty = .struct_
31+
.struct_
3332
}
3433
'interface' {
35-
cty = .iface
34+
.iface
3635
}
3736
'int' {
38-
cty = .int
37+
.int
3938
}
4039
'float' {
41-
cty = .float
40+
.float
4241
}
4342
'alias' {
44-
cty = .alias
43+
.alias
4544
}
4645
'function' {
47-
cty = .function
46+
.function
4847
}
4948
'array' {
50-
cty = .array
49+
.array
50+
}
51+
'array_fixed' {
52+
.array_fixed
53+
}
54+
'array_dynamic' {
55+
.array_dynamic
5156
}
5257
'enum' {
53-
cty = .enum_
58+
.enum_
5459
}
5560
'sumtype' {
56-
cty = .sum_type
61+
.sum_type
5762
}
5863
'option' {
59-
cty = .option
64+
.option
6065
}
61-
else {}
66+
else {
67+
.unknown
68+
}
69+
}
70+
return ast.ComptimeType{
71+
kind: kind
72+
pos: pos
6273
}
63-
node = ast.ComptimeType{cty, node.pos}
64-
return node
6574
}
6675

6776
// // #include, #flag, #v

vlib/v/tests/comptime_kinds_test.v

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,22 @@ fn assert_array[T]() {
1414
}
1515
}
1616

17+
fn assert_array_dynamic[T]() {
18+
$if T is $array_dynamic {
19+
assert true
20+
} $else {
21+
assert false
22+
}
23+
}
24+
25+
fn assert_array_fixed[T]() {
26+
$if T is $array_fixed {
27+
assert true
28+
} $else {
29+
assert false
30+
}
31+
}
32+
1733
fn assert_struct[T]() {
1834
$if T is $struct {
1935
assert true
@@ -46,6 +62,22 @@ fn assert_not_array[T]() {
4662
}
4763
}
4864

65+
fn assert_not_array_dynamic[T]() {
66+
$if T is $array_dynamic {
67+
assert false
68+
} $else {
69+
assert true
70+
}
71+
}
72+
73+
fn assert_not_array_fixed[T]() {
74+
$if T is $array_fixed {
75+
assert false
76+
} $else {
77+
assert true
78+
}
79+
}
80+
4981
struct Abc {}
5082

5183
struct Bc {}
@@ -73,6 +105,30 @@ fn test_kind_array() {
73105
assert_not_array[map[int]int]()
74106
}
75107

108+
fn test_kind_array_dynamic() {
109+
assert_array_dynamic[[]int]()
110+
assert_array_dynamic[[]f32]()
111+
assert_array_dynamic[[]string]()
112+
113+
assert_not_array_dynamic[Abc]()
114+
assert_not_array_dynamic[string]()
115+
assert_not_array_dynamic[int]()
116+
assert_not_array_dynamic[map[int]int]()
117+
assert_not_array_dynamic[[3]int]()
118+
}
119+
120+
fn test_kind_array_fixed() {
121+
assert_array_fixed[[3]int]()
122+
assert_array_fixed[[5]f32]()
123+
assert_array_fixed[[6]string]()
124+
125+
assert_not_array_fixed[Abc]()
126+
assert_not_array_fixed[string]()
127+
assert_not_array_fixed[int]()
128+
assert_not_array_fixed[map[int]int]()
129+
assert_not_array_fixed[[]int]()
130+
}
131+
76132
fn test_kind_struct() {
77133
assert_struct[Abc]()
78134
assert_struct[Bc]()

vlib/v/tests/comptime_type_test.v

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ type Sumtype = int | string
1111

1212
struct Foo {}
1313

14+
fn dummy_fn() {}
15+
1416
struct Test {
1517
a Abc
1618
b map[string]string
@@ -20,7 +22,7 @@ struct Test {
2022
f f64
2123
g Alias
2224
h Foo
23-
i fn ()
25+
i fn () = dummy_fn
2426
j Sumtype
2527
k ?int
2628
}
@@ -37,11 +39,14 @@ fn test_comptime_types() {
3739
mut c_fn := 0
3840
mut c_sum := 0
3941
mut c_option := 0
42+
mut fixeda := 0
4043
$for f in Test.fields {
4144
$if f.typ is $alias {
4245
c_alias++
4346
} $else $if f.typ is $interface {
4447
i++
48+
} $else $if f.typ is $array_fixed {
49+
fixeda++
4550
} $else $if f.typ is $array {
4651
a++
4752
} $else $if f.typ is $map {
@@ -66,6 +71,7 @@ fn test_comptime_types() {
6671
assert a == 1
6772
assert m == 1
6873
assert e == 1
74+
assert fixeda == 0
6975
assert c_int == 1
7076
assert c_float == 1
7177
assert c_alias == 1

0 commit comments

Comments
 (0)