| 1 | // Copyright (c) 2026 Alexander Medvednikov. All rights reserved. |
| 2 | // Use of this source code is governed by an MIT license |
| 3 | // that can be found in the LICENSE file. |
| 4 | module ast |
| 5 | |
| 6 | import v2.token |
| 7 | |
| 8 | fn string_inter_test_expr() Expr { |
| 9 | return Expr(Ident{ |
| 10 | name: 'value' |
| 11 | }) |
| 12 | } |
| 13 | |
| 14 | fn string_inter_test_literal(width int, precision int) Expr { |
| 15 | return Expr(StringInterLiteral{ |
| 16 | kind: .v |
| 17 | values: ['value=', ''] |
| 18 | inters: [ |
| 19 | StringInter{ |
| 20 | format: .decimal |
| 21 | width: width |
| 22 | precision: precision |
| 23 | expr: string_inter_test_expr() |
| 24 | format_expr: empty_expr |
| 25 | resolved_fmt: '%d' |
| 26 | }, |
| 27 | ] |
| 28 | }) |
| 29 | } |
| 30 | |
| 31 | fn assert_string_inter_roundtrip(files []File, width int, precision int) { |
| 32 | assert files.len == 1 |
| 33 | assert files[0].stmts.len == 2 |
| 34 | assert files[0].stmts[1] is ExprStmt |
| 35 | expr_stmt := files[0].stmts[1] as ExprStmt |
| 36 | assert expr_stmt.expr is StringInterLiteral |
| 37 | lit := expr_stmt.expr as StringInterLiteral |
| 38 | assert lit.inters.len == 1 |
| 39 | assert lit.inters[0].width == width |
| 40 | assert lit.inters[0].precision == precision |
| 41 | } |
| 42 | |
| 43 | fn test_string_inter_width_precision_survive_flat_roundtrip_losslessly() { |
| 44 | width := 1_000_000 |
| 45 | precision := -1_000_000 |
| 46 | mut b := new_flat_builder() |
| 47 | b.append_file(File{ |
| 48 | name: 'string_inter.v' |
| 49 | mod: 'string_inter' |
| 50 | stmts: [ |
| 51 | Stmt(ModuleStmt{ |
| 52 | name: 'string_inter' |
| 53 | }), |
| 54 | Stmt(ExprStmt{ |
| 55 | expr: string_inter_test_literal(width, precision) |
| 56 | }), |
| 57 | ] |
| 58 | }) |
| 59 | assert_string_inter_roundtrip(b.flat.to_files(), width, precision) |
| 60 | } |
| 61 | |
| 62 | fn test_emit_string_inter_by_ids_preserves_large_width_precision() { |
| 63 | width := 900_000 |
| 64 | precision := -900_000 |
| 65 | mut b := new_flat_builder() |
| 66 | b.append_file(File{ |
| 67 | name: 'string_inter_direct.v' |
| 68 | mod: 'string_inter' |
| 69 | stmts: [ |
| 70 | Stmt(ModuleStmt{ |
| 71 | name: 'string_inter' |
| 72 | }), |
| 73 | ] |
| 74 | }) |
| 75 | expr_id := b.emit_expr(string_inter_test_expr()) |
| 76 | format_expr_id := b.emit_expr(empty_expr) |
| 77 | inter_id := |
| 78 | b.emit_string_inter_by_ids(.decimal, width, precision, expr_id, format_expr_id, '%d') |
| 79 | lit_id := b.emit_string_inter_literal_by_ids(.v, ['value=', ''], [inter_id], token.Pos{}) |
| 80 | stmt_id := b.emit_expr_stmt_by_id(lit_id) |
| 81 | b.append_file_stmts(0, [stmt_id]) |
| 82 | assert_string_inter_roundtrip(b.flat.to_files(), width, precision) |
| 83 | } |
| 84 | |