feat: string interpolation via f"..." syntax

Bootstrap compiler:
- Add ekStringInterp AST node with text/expr parts
- Lexer: recognize f"..." prefix for interpolation strings
- Parser: split f"..." into ekStringInterp, parse inner expressions
  via sub-lexer/sub-parser. Supports escaped braces \{ and \}.
- Sema: type-check interpolated expressions, return String type
- HIR lowerer: desugar ekStringInterp to chained String_Concat
  calls with automatic type conversions:
  - int/uint types -> String_FromInt
  - float types -> String_FromFloat
  - bool -> String_FromBool
  - String -> as-is

Selfhost compiler:
- ast.bux: add ekStringInterp constant (reserved for future)
- lexer.bux: accept f" prefix, treat as plain string literal
  (selfhost parser does not implement interpolation yet)

Tests:
- _test_string_interp verifies int, float, bool, String,
  multiple interpolations, plain strings, and Fmt-style {0} templates
This commit is contained in:
2026-06-08 21:48:10 +03:00
parent cfce2a93e5
commit 17c896c4dc
7 changed files with 135 additions and 4 deletions
+4
View File
@@ -1264,6 +1264,10 @@ proc checkExpr(sema: var Sema, expr: Expr, scope: Scope): Type =
return operand
of ekSpread:
return sema.checkExpr(expr.exprSpreadOperand, scope)
of ekStringInterp:
for e in expr.exprInterpExprs:
discard sema.checkExpr(e, scope)
return makeStr()
# ---------------------------------------------------------------------------
# Statement type checking