Skip to content

Commit 78effd0

Browse files
authored
type_resolver: refactor resolve_comptime_type (#23616)
1 parent e4d1011 commit 78effd0

File tree

9 files changed

+43
-29
lines changed

9 files changed

+43
-29
lines changed

cmd/tools/vast/vast.v

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1453,6 +1453,7 @@ fn (t Tree) selector_expr(node ast.SelectorExpr) &Node {
14531453
obj.add_terse('from_embed_types', t.array_node_type(node.from_embed_types))
14541454
obj.add_terse('has_hidden_receiver', t.bool_node(node.has_hidden_receiver))
14551455
obj.add_terse('next_token', t.token_node(node.next_token))
1456+
obj.add_terse('is_field_typ', t.bool_node(node.is_field_typ))
14561457
obj.add('pos', t.pos(node.pos))
14571458
obj.add('scope', t.number_node(int(node.scope)))
14581459
return obj

vlib/v/ast/ast.v

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -311,6 +311,7 @@ pub mut:
311311
from_embed_types []Type // holds the type of the embed that the method is called from
312312
generic_from_embed_types [][]Type // holds the types of the embeds for each generic instance when the same generic method is called.
313313
has_hidden_receiver bool
314+
is_field_typ bool // var.typ for comptime $for var
314315
}
315316

316317
// root_ident returns the origin ident where the selector started.

vlib/v/checker/checker.v

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1645,6 +1645,7 @@ fn (mut c Checker) selector_expr(mut node ast.SelectorExpr) ast.Type {
16451645
return node.expr_type
16461646
}
16471647
}
1648+
node.is_field_typ = node.is_field_typ || c.comptime.is_comptime_selector_type(node)
16481649
old_selector_expr := c.inside_selector_expr
16491650
c.inside_selector_expr = true
16501651
mut typ := c.expr(mut node.expr)

vlib/v/gen/c/assert.v

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -151,12 +151,12 @@ fn (mut g Gen) gen_assert_metainfo(node ast.AssertStmt, kind AssertMetainfoKind)
151151
g.writeln('\t${metaname}.op = ${expr_op_str};')
152152
g.writeln('\t${metaname}.llabel = ${expr_left_str};')
153153
g.writeln('\t${metaname}.rlabel = ${expr_right_str};')
154-
left_type := if g.comptime.is_comptime_expr(node.expr.left) {
155-
g.type_resolver.get_type(node.expr.left)
154+
left_type := if node.expr.left_ct_expr {
155+
g.type_resolver.get_type_or_default(node.expr.left, node.expr.left_type)
156156
} else {
157157
node.expr.left_type
158158
}
159-
right_type := if g.comptime.is_comptime_expr(node.expr.right) {
159+
right_type := if node.expr.right_ct_expr {
160160
g.type_resolver.get_type(node.expr.right)
161161
} else {
162162
node.expr.right_type

vlib/v/gen/c/cgen.v

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3584,7 +3584,7 @@ fn (mut g Gen) expr(node_ ast.Expr) {
35843584
}
35853585
}
35863586
ast.IsRefType {
3587-
typ := g.resolve_comptime_type(node.expr, g.get_type(node.typ))
3587+
typ := g.type_resolver.typeof_type(node.expr, g.get_type(node.typ))
35883588
node_typ := g.unwrap_generic(typ)
35893589
sym := g.table.sym(node_typ)
35903590
if sym.language == .v && sym.kind in [.placeholder, .any] {
@@ -3669,7 +3669,7 @@ fn (mut g Gen) expr(node_ ast.Expr) {
36693669
g.writeln2('\tpanic_option_not_set(_SLIT("none"));', '}')
36703670
g.write(cur_line)
36713671
if is_unwrapped {
3672-
typ := g.resolve_comptime_type(node.expr, node.typ)
3672+
typ := g.type_resolver.typeof_type(node.expr, node.typ)
36733673
g.write('*(${g.base_type(typ)}*)&')
36743674
g.expr(node.expr)
36753675
g.write('.data')
@@ -3844,7 +3844,7 @@ fn (mut g Gen) type_name(raw_type ast.Type) {
38443844
}
38453845

38463846
fn (mut g Gen) typeof_expr(node ast.TypeOf) {
3847-
typ := g.resolve_comptime_type(node.expr, g.get_type(node.typ))
3847+
typ := g.type_resolver.typeof_type(node.expr, g.get_type(node.typ))
38483848
sym := g.table.sym(typ)
38493849
if sym.kind == .sum_type {
38503850
// When encountering a .sum_type, typeof() should be done at runtime,
@@ -3894,30 +3894,30 @@ fn (mut g Gen) selector_expr(node ast.SelectorExpr) {
38943894
// typeof(expr).name
38953895
mut name_type := node.name_type
38963896
if node.expr is ast.TypeOf {
3897-
name_type = g.resolve_comptime_type(node.expr.expr, name_type)
3897+
name_type = g.type_resolver.typeof_type(node.expr.expr, name_type)
38983898
}
38993899
g.type_name(name_type)
39003900
return
39013901
} else if node.field_name == 'idx' {
39023902
mut name_type := node.name_type
39033903
if node.expr is ast.TypeOf {
3904-
name_type = g.resolve_comptime_type(node.expr.expr, name_type)
3904+
name_type = g.type_resolver.typeof_type(node.expr.expr, name_type)
39053905
}
39063906
// `typeof(expr).idx`
39073907
g.write(int(g.unwrap_generic(name_type)).str())
39083908
return
39093909
} else if node.field_name == 'unaliased_typ' {
39103910
mut name_type := node.name_type
39113911
if node.expr is ast.TypeOf {
3912-
name_type = g.resolve_comptime_type(node.expr.expr, name_type)
3912+
name_type = g.type_resolver.typeof_type(node.expr.expr, name_type)
39133913
}
39143914
// `typeof(expr).unaliased_typ`
39153915
g.write(int(g.table.unaliased_type(g.unwrap_generic(name_type))).str())
39163916
return
39173917
} else if node.field_name == 'indirections' {
39183918
mut name_type := node.name_type
39193919
if node.expr is ast.TypeOf {
3920-
name_type = g.resolve_comptime_type(node.expr.expr, name_type)
3920+
name_type = g.type_resolver.typeof_type(node.expr.expr, name_type)
39213921
}
39223922
// `typeof(expr).indirections`
39233923
g.write(int(g.unwrap_generic(name_type).nr_muls()).str())
@@ -5224,7 +5224,7 @@ fn (mut g Gen) cast_expr(node ast.CastExpr) {
52245224
node_typ := g.unwrap_generic(node.typ)
52255225
mut expr_type := node.expr_type
52265226
sym := g.table.sym(node_typ)
5227-
if g.comptime.is_comptime_expr(node.expr) {
5227+
if g.comptime.is_comptime(node.expr) {
52285228
expr_type = g.unwrap_generic(g.type_resolver.get_type(node.expr))
52295229
}
52305230
node_typ_is_option := node.typ.has_flag(.option)
@@ -7231,7 +7231,7 @@ fn (mut g Gen) get_type(typ ast.Type) ast.Type {
72317231
}
72327232

72337233
fn (mut g Gen) size_of(node ast.SizeOf) {
7234-
typ := g.resolve_comptime_type(node.expr, g.get_type(node.typ))
7234+
typ := g.type_resolver.typeof_type(node.expr, g.get_type(node.typ))
72357235
node_typ := g.unwrap_generic(typ)
72367236
sym := g.table.sym(node_typ)
72377237
if sym.language == .v && sym.kind in [.placeholder, .any] {

vlib/v/gen/c/comptime.v

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -801,21 +801,6 @@ fn (mut g Gen) pop_comptime_info() {
801801
g.comptime.comptime_for_method_ret_type = old.comptime_for_method_ret_type
802802
}
803803

804-
fn (mut g Gen) resolve_comptime_type(node ast.Expr, default_type ast.Type) ast.Type {
805-
if g.comptime.is_comptime_expr(node) {
806-
return g.type_resolver.get_type(node)
807-
} else if node is ast.SelectorExpr && node.expr_type != 0 {
808-
if node.expr is ast.Ident && g.comptime.is_comptime_selector_type(node) {
809-
return g.type_resolver.get_type_from_comptime_var(node.expr)
810-
}
811-
sym := g.table.sym(g.unwrap_generic(node.expr_type))
812-
if f := g.table.find_field_with_embeds(sym, node.field_name) {
813-
return f.typ
814-
}
815-
}
816-
return default_type
817-
}
818-
819804
fn (mut g Gen) comptime_for(node ast.ComptimeFor) {
820805
sym := if node.typ != g.field_data_type {
821806
g.table.final_sym(g.unwrap_generic(node.typ))

vlib/v/gen/c/fn.v

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1324,7 +1324,7 @@ fn (mut g Gen) gen_to_str_method_call(node ast.CallExpr) bool {
13241324
return true
13251325
}
13261326
} else if left_node is ast.PostfixExpr {
1327-
rec_type = g.resolve_comptime_type(left_node.expr, rec_type)
1327+
rec_type = g.type_resolver.get_type_or_default(left_node.expr, rec_type)
13281328
if left_node.op == .question {
13291329
rec_type = rec_type.clear_flag(.option)
13301330
}

vlib/v/type_resolver/comptime_resolver.v

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,22 @@ pub fn (t &ResolverInfo) is_comptime_variant_var(node ast.Ident) bool {
7575
return node.name == t.comptime_for_variant_var
7676
}
7777

78+
// typeof_type resolves type for typeof() expr where field.typ is resolved to real type instead of int type to make type(field.typ).name working
79+
pub fn (mut t TypeResolver) typeof_type(node ast.Expr, default_type ast.Type) ast.Type {
80+
if t.info.is_comptime(node) {
81+
return t.get_type(node)
82+
} else if node is ast.SelectorExpr && node.expr_type != 0 {
83+
if node.expr is ast.Ident && node.is_field_typ {
84+
return t.get_type_from_comptime_var(node.expr)
85+
}
86+
sym := t.table.sym(t.resolver.unwrap_generic(node.expr_type))
87+
if f := t.table.find_field_with_embeds(sym, node.field_name) {
88+
return f.typ
89+
}
90+
}
91+
return default_type
92+
}
93+
7894
// get_ct_type_var gets the comptime type of the variable (.generic_param, .key_var, etc)
7995
@[inline]
8096
pub fn (t &ResolverInfo) get_ct_type_var(node ast.Expr) ast.ComptimeVarKind {

vlib/v/type_resolver/type_resolver.v

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,7 @@ pub fn (mut t TypeResolver) get_type(node ast.Expr) ast.Type {
207207
}
208208
return ctyp
209209
} else if node is ast.SelectorExpr {
210-
if t.info.is_comptime_selector_type(node) {
210+
if node.is_field_typ {
211211
return t.get_type_from_comptime_var(node.expr as ast.Ident)
212212
}
213213
if node.expr is ast.Ident && node.expr.ct_expr {
@@ -216,8 +216,18 @@ pub fn (mut t TypeResolver) get_type(node ast.Expr) ast.Type {
216216
// Struct[T] can have field with generic type
217217
if struct_sym.info is ast.Struct && struct_sym.info.generic_types.len > 0 {
218218
if field := t.table.find_field(struct_sym, node.field_name) {
219+
if f_unwrap := node.scope.find_struct_field(ast.Expr(node.expr).str(),
220+
t.get_type_or_default(node.expr, node.expr_type), node.field_name)
221+
{
222+
return f_unwrap.smartcasts.last()
223+
}
219224
return field.typ
220225
}
226+
} else {
227+
sym := t.table.sym(t.resolver.unwrap_generic(node.expr_type))
228+
if f := t.table.find_field_with_embeds(sym, node.field_name) {
229+
return f.typ
230+
}
221231
}
222232
}
223233
return node.typ

0 commit comments

Comments
 (0)