@@ -31,6 +31,7 @@ fn (mut g Gen) assert_stmt(original_assert_statement ast.AssertStmt) {
3131 node.expr.right = subst_expr
3232 }
3333 }
34+ metaname := g.gen_assert_metainfo_common (node)
3435 g.inside_ternary++
3536 if g.pref.is_test {
3637 g.write ('if (' )
@@ -41,11 +42,11 @@ fn (mut g Gen) assert_stmt(original_assert_statement ast.AssertStmt) {
4142 g.write (')' )
4243 g.decrement_inside_ternary ()
4344 g.writeln (' {' )
44- metaname_ok := g.gen_assert_metainfo (node, .pass)
45- g.writeln ('\t main__TestRunner_name_table[test_runner._typ]._method_assert_pass(test_runner._object, &${metaname_ok } );' )
45+ g.gen_assert_metainfo (node, .pass, metaname )
46+ g.writeln ('\t main__TestRunner_name_table[test_runner._typ]._method_assert_pass(test_runner._object, &${metaname } );' )
4647 g.writeln ('} else {' )
47- metaname_fail := g.gen_assert_metainfo (node, .fail)
48- g.writeln ('\t main__TestRunner_name_table[test_runner._typ]._method_assert_fail(test_runner._object, &${metaname_fail } );' )
48+ g.gen_assert_metainfo (node, .fail, metaname )
49+ g.writeln ('\t main__TestRunner_name_table[test_runner._typ]._method_assert_fail(test_runner._object, &${metaname } );' )
4950 g.gen_assert_postfailure_mode (node)
5051 g.writeln ('}' )
5152 } else {
@@ -57,8 +58,8 @@ fn (mut g Gen) assert_stmt(original_assert_statement ast.AssertStmt) {
5758 g.write ('))' )
5859 g.decrement_inside_ternary ()
5960 g.writeln (' {' )
60- metaname_panic := g.gen_assert_metainfo (node, .panic)
61- g.writeln ('\t builtin____print_assert_failure(&${metaname_panic } );' )
61+ g.gen_assert_metainfo (node, .panic, metaname )
62+ g.writeln ('\t builtin____print_assert_failure(&${metaname } );' )
6263 g.gen_assert_postfailure_mode (node)
6364 g.writeln ('}' )
6465 }
@@ -126,13 +127,48 @@ fn (mut g Gen) gen_assert_postfailure_mode(node ast.AssertStmt) {
126127 if g.pref.is_test {
127128 g.writeln ('\t longjmp(g_jump_buffer, 1);' )
128129 }
129- g.writeln2 ('\t // TODO' , '\t // Maybe print all vars in a test function if it fails?' )
130130 if g.pref.assert_failure_mode != .continues {
131131 g.writeln ('\t builtin___v_panic(_S("Assertion failed..."));' )
132132 }
133133}
134134
135- fn (mut g Gen) gen_assert_metainfo (node ast.AssertStmt, kind AssertMetainfoKind) string {
135+ fn (mut g Gen) gen_assert_metainfo (node ast.AssertStmt, kind AssertMetainfoKind, metaname string ) {
136+ if kind == .pass {
137+ return
138+ }
139+ if node.extra is ast.EmptyExpr {
140+ g.writeln ('\t ${metaname} .has_msg = false;' )
141+ g.writeln ('\t ${metaname} .message = _SLIT0;' )
142+ } else {
143+ g.writeln ('\t ${metaname} .has_msg = true;' )
144+ g.write ('\t ${metaname} .message = ' )
145+ g.gen_assert_single_expr (node.extra, ast.string_type)
146+ g.writeln (';' )
147+ }
148+ match node.expr {
149+ ast.InfixExpr {
150+ left_type := if node.expr.left_ct_expr {
151+ g.type_resolver.get_type_or_default (node.expr.left, node.expr.left_type)
152+ } else {
153+ node.expr.left_type
154+ }
155+ right_type := if node.expr.right_ct_expr {
156+ g.type_resolver.get_type (node.expr.right)
157+ } else {
158+ node.expr.right_type
159+ }
160+ g.write ('\t ${metaname} .lvalue = ' )
161+ g.gen_assert_single_expr (node.expr.left, left_type)
162+ g.writeln (';' )
163+ g.write ('\t ${metaname} .rvalue = ' )
164+ g.gen_assert_single_expr (node.expr.right, right_type)
165+ g.writeln (';' )
166+ }
167+ else {}
168+ }
169+ }
170+
171+ fn (mut g Gen) gen_assert_metainfo_common (node ast.AssertStmt) string {
136172 mod_path := cestring (g.file.path)
137173 fn_name := g.fn_decl.name
138174 line_nr := node.pos.line_nr
@@ -142,53 +178,27 @@ fn (mut g Gen) gen_assert_metainfo(node ast.AssertStmt, kind AssertMetainfoKind)
142178 }
143179 src = cestring (src)
144180 metaname := 'v_assert_meta_info_${g.new_tmp_var()} '
145- g.writeln ('\t VAssertMetaInfo ${metaname} = {0};' )
146- g.writeln ('\t ${metaname} .fpath = ${ctoslit(mod_path)} ;' )
147- g.writeln ('\t ${metaname} .line_nr = ${line_nr} ;' )
148- g.writeln ('\t ${metaname} .fn_name = ${ctoslit(fn_name)} ;' )
181+ g.writeln ('VAssertMetaInfo ${metaname} = {0};' )
182+ g.writeln ('${metaname} .fpath = ${ctoslit(mod_path)} ;' )
183+ g.writeln ('${metaname} .line_nr = ${line_nr} ;' )
184+ g.writeln ('${metaname} .fn_name = ${ctoslit(fn_name)} ;' )
149185 metasrc := cnewlines (ctoslit (src))
150- g.writeln ('\t ${metaname} .src = ${metasrc} ;' )
186+ g.writeln ('${metaname} .src = ${metasrc} ;' )
187+ g.writeln ('${metaname} .has_msg = false;' )
151188 match node.expr {
152189 ast.InfixExpr {
153190 expr_op_str := ctoslit (node.expr.op.str ())
154191 expr_left_str := cnewlines (ctoslit (node.expr.left.str ()))
155192 expr_right_str := cnewlines (ctoslit (node.expr.right.str ()))
156- g.writeln ('\t ${metaname} .op = ${expr_op_str} ;' )
157- g.writeln ('\t ${metaname} .llabel = ${expr_left_str} ;' )
158- g.writeln ('\t ${metaname} .rlabel = ${expr_right_str} ;' )
159- left_type := if node.expr.left_ct_expr {
160- g.type_resolver.get_type_or_default (node.expr.left, node.expr.left_type)
161- } else {
162- node.expr.left_type
163- }
164- right_type := if node.expr.right_ct_expr {
165- g.type_resolver.get_type (node.expr.right)
166- } else {
167- node.expr.right_type
168- }
169- if kind != .pass {
170- g.write ('\t ${metaname} .lvalue = ' )
171- g.gen_assert_single_expr (node.expr.left, left_type)
172- g.writeln (';' )
173- g.write ('\t ${metaname} .rvalue = ' )
174- g.gen_assert_single_expr (node.expr.right, right_type)
175- g.writeln (';' )
176- }
193+ g.writeln ('${metaname} .op = ${expr_op_str} ;' )
194+ g.writeln ('${metaname} .llabel = ${expr_left_str} ;' )
195+ g.writeln ('${metaname} .rlabel = ${expr_right_str} ;' )
177196 }
178197 ast.CallExpr {
179- g.writeln ('\t ${metaname} .op = _S("call");' )
198+ g.writeln ('${metaname} .op = _S("call");' )
180199 }
181200 else {}
182201 }
183- if node.extra is ast.EmptyExpr {
184- g.writeln ('\t ${metaname} .has_msg = false;' )
185- g.writeln ('\t ${metaname} .message = _SLIT0;' )
186- } else {
187- g.writeln ('\t ${metaname} .has_msg = true;' )
188- g.write ('\t ${metaname} .message = ' )
189- g.gen_assert_single_expr (node.extra, ast.string_type)
190- g.writeln (';' )
191- }
192202 return metaname
193203}
194204
0 commit comments