From 71e5200f1c8cb5bbe8772477af6ea60fc2063125 Mon Sep 17 00:00:00 2001 From: Alexander Medvednikov Date: Wed, 10 Jun 2026 23:56:33 +0300 Subject: [PATCH] v2: transformer test fixes --- ...ject_runtime_const_init_fns_to_flat_test.v | 44 +++++++++++++++++++ vlib/v2/transformer/transformer.v | 10 ++--- 2 files changed, 49 insertions(+), 5 deletions(-) diff --git a/vlib/v2/transformer/inject_runtime_const_init_fns_to_flat_test.v b/vlib/v2/transformer/inject_runtime_const_init_fns_to_flat_test.v index a95c8fff9..013249713 100644 --- a/vlib/v2/transformer/inject_runtime_const_init_fns_to_flat_test.v +++ b/vlib/v2/transformer/inject_runtime_const_init_fns_to_flat_test.v @@ -102,6 +102,50 @@ fn test_inject_runtime_const_init_fns_to_flat_signature_matches_legacy() { assert ref_sig == sub_sig } +fn test_inject_runtime_const_init_fns_legacy_path_decodes_cursor_backed_inits() { + mut source_builder := ast.new_flat_builder() + source_builder.append_file(ast.File{ + name: 'mymod.v' + mod: 'mymod' + stmts: [ + ast.Stmt(ast.ModuleStmt{ + name: 'mymod' + }), + ast.Stmt(ast.ConstDecl{ + fields: [ + ast.FieldInit{ + name: 'answer' + value: ast.Expr(ast.CallExpr{ + lhs: ast.Expr(ast.Ident{ + name: 'make_value' + }) + }) + }, + ] + }), + ] + }) + field := source_builder.flat.file_cursor(0).stmts().at(1).list_at(0).at(0) + mut t := create_runtime_init_fns_to_flat_test_transformer() + t.runtime_const_inits_by_mod['mymod'] = [ + RuntimeConstInit{ + name: 'mymod__answer' + expr_cursor: field.edge(0) + }, + ] + mut files := [make_mymod_file()] + t.inject_runtime_const_init_fns(mut files) + assert files[0].stmts.len == 2 + fn_decl := files[0].stmts[1] as ast.FnDecl + assert fn_decl.name == '__v_init_consts_mymod' + assert fn_decl.stmts.len == 1 + assign := fn_decl.stmts[0] as ast.AssignStmt + assert assign.rhs.len == 1 + call := assign.rhs[0] as ast.CallExpr + assert call.lhs is ast.Ident + assert (call.lhs as ast.Ident).name == 'make_value' +} + fn test_inject_runtime_const_init_fns_to_flat_no_matching_file_is_noop() { // runtime_const_modules names 'mymod' but no file has that mod — the // inner loop never finds a match, so the splice is a no-op. diff --git a/vlib/v2/transformer/transformer.v b/vlib/v2/transformer/transformer.v index 3ad289ba0..cdbf884fc 100644 --- a/vlib/v2/transformer/transformer.v +++ b/vlib/v2/transformer/transformer.v @@ -4616,14 +4616,12 @@ fn (mut t Transformer) transform_expr_in_module(mod string, expr ast.Expr) ast.E fn (mut t Transformer) runtime_const_init_fn_stmt(mod string, fn_name string, inits []RuntimeConstInit) ast.Stmt { mut stmts := []ast.Stmt{cap: inits.len} for item in inits { - if item.expr_cursor.is_valid() { - continue - } + expr := if item.expr_cursor.is_valid() { item.expr_cursor.expr() } else { item.expr } saved_pending := t.pending_stmts t.pending_stmts = []ast.Stmt{} old_skip_if := t.skip_if_value_lowering t.skip_if_value_lowering = true - transformed_expr := t.transform_expr_in_module(mod, item.expr) + transformed_expr := t.transform_expr_in_module(mod, expr) t.skip_if_value_lowering = old_skip_if generated_pending := t.pending_stmts t.pending_stmts = saved_pending @@ -4679,7 +4677,9 @@ fn (mut t Transformer) runtime_const_init_fn_stmt_to_flat(mod string, fn_name st lhs_id := out.emit_ident_by_name(item.name, token.Pos{}) stmt_ids << out.emit_assign_stmt_by_ids(.assign, [lhs_id], [rhs_id], token.Pos{}) } - receiver_id := out.emit_parameter(ast.Parameter{}) + receiver_id := out.emit_parameter(ast.Parameter{ + typ: ast.empty_expr + }) typ_id := out.emit_type(ast.Type(ast.FnType{})) attrs_id := out.emit_aux_list_from_ids([]) stmts_id := out.emit_aux_list_from_ids(stmt_ids) -- 2.39.5