v4.2.3

Released 2026-05-24 · GitHub release · CHANGELOG

Type-name passthrough is now total, and statically-typed targets enforce typed parameters. Surface syntax is unchanged; the behavior change affects only sources that relied on the old portable-alias translation.

Highlights

  • Type names pass through verbatim on every target (#37) — framec no longer rewrites a portable alias to a per-backend native type (inti64, strString, …); it copies the type name you write straight into the output, honoring Frame’s “no type system — type names pass through” contract. Structural transforms (Rust borrow→owned widening, Kotlin voidUnit, C runtime containers) are unaffected.
  • E606 — statically-typed targets require typed parameters (#37) — on C, C++, Java, Go, Rust, C#, Kotlin, and Swift, an untyped event / handler / state / lifecycle parameter is now a hard error with a fix-it.
  • Default-target warning + FRAMEC_DEFAULT_TARGET (#36) — framec warns once before falling back to python_3, and the env var sets the implicit target.
  • WASM build / @frame-lang/framec-wasm — the library builds for wasm32; the wasm-bindgen entry point lives in a separate framec-wasm crate.

Action required

Statically-typed targets (C, C++, Java, Go, Rust, C#, Kotlin, Swift): write your target’s own type names instead of portable aliases — e.g. x: i64 (Rust), x: long (Java), x: std::string (C++). Dynamic targets (Python, JS, TS, Ruby, Lua, PHP, Dart, GDScript) are unaffected.

4.2.2 was tagged but never released — its commit tripped the CI formatting gate; 4.2.3 is the same content cut from a clean commit.