Skip to content

Commit c680984

Browse files
authored
checker: fix checker generic alias type (fix #23474) (#23475)
1 parent e5153e7 commit c680984

2 files changed

Lines changed: 71 additions & 5 deletions

File tree

‎vlib/v/checker/struct.v‎

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -165,11 +165,8 @@ fn (mut c Checker) struct_decl(mut node ast.StructDecl) {
165165
continue
166166
}
167167
field_is_generic := field.typ.has_flag(.generic)
168-
if !c.ensure_generic_type_specify_type_names(field.typ, field.type_pos, c.table.final_sym(field.typ).kind in [
169-
.array,
170-
.array_fixed,
171-
.map,
172-
], field_is_generic) {
168+
if c.table.type_kind(field.typ) != .alias
169+
&& !c.ensure_generic_type_specify_type_names(field.typ, field.type_pos, c.table.final_sym(field.typ).kind in [.array, .array_fixed, .map], field_is_generic) {
173170
continue
174171
}
175172
if field_is_generic {
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
module main
2+
3+
import arrays
4+
5+
pub struct Tree {
6+
pub:
7+
// Type of structural node, `value` should be empty
8+
type string
9+
// Content of data node, `type` should be empty
10+
value string
11+
pub mut:
12+
// Child nodes
13+
kids []&Tree
14+
}
15+
16+
@[params]
17+
struct TreeCloneParams {
18+
kids []&Tree
19+
}
20+
21+
// Makes new derived node with different kids id defined.
22+
pub fn (tree Tree) clone(p TreeCloneParams) &Tree {
23+
return &Tree{
24+
type: tree.type
25+
value: tree.value
26+
kids: p.kids
27+
}
28+
}
29+
30+
// Collection of hask tools for processing tree.
31+
pub type TreeBelt = map[string]fn (input &Tree, belt TreeBelt) []&Tree
32+
33+
// Hask tool for processing node.
34+
pub type TreeHack = fn (input &Tree, belt TreeBelt) []&Tree
35+
36+
pub type TreeContext = map[string]string
37+
38+
@[params]
39+
struct TreeHackParams {
40+
belt TreeBelt
41+
context ?TreeContext
42+
}
43+
44+
// Transform tree through context with transformers
45+
pub fn (tree Tree) hack(p TreeHackParams) []&Tree {
46+
return arrays.concat(arrays.flatten(tree.kids.map(it.hack_self(p))))
47+
}
48+
49+
pub fn (tree Tree) hack_self(p TreeHackParams) []&Tree {
50+
mut handle := fn [tree] (input &Tree, belt TreeBelt) []&Tree {
51+
return [
52+
input.clone(kids: input.hack(belt: belt)),
53+
]
54+
}
55+
56+
if action := p.belt[tree.type] {
57+
handle = action
58+
}
59+
60+
return handle(tree, p.belt)
61+
}
62+
63+
fn test_main() {
64+
t := Tree{}
65+
r := t.hack_self(belt: TreeBelt(map[string]fn (&Tree, TreeBelt) []&Tree{}))
66+
assert r[0].type == ''
67+
assert r[0].value == ''
68+
assert r[0].kids.len == 0
69+
}

0 commit comments

Comments
 (0)