Merge commit '49b5e80' into lang/foundations

This commit is contained in:
Orkun ÇAKILKAYA 2026-09-29 20:05:26 +03:00
commit e74656c372
38 changed files with 1986 additions and 16 deletions

View file

@ -48,7 +48,7 @@ program LudicDev {
print("which ships to users and carries none of the below.")
print("")
print("build:")
print(" build build the whole toolchain into bin/ (ludicc, ludic, ludic-dev, ludic-fmt, ludic-lsp)")
print(" build build the whole toolchain into bin/ (ludicc, ludic, ludic-dev, ludic-fmt, ludic-lsp, ludic-ui-preview)")
print(" build-cli build just bin/ludicc from the IR seed")
print(" tools [--install] [--test] build the editor toolchain (ludic-fmt, ludic-lsp)")
print(" clean remove build/")

View file

@ -32,6 +32,7 @@ program Ludic {
import "scripts.ludic"
import "deps.ludic"
import "schema.ludic"
import "ui_preview.ludic"
import "testpar.ludic"
import "migrate.ludic"
@ -78,6 +79,7 @@ program Ludic {
print(" doctor check that the install is complete and usable")
print(" fmt [--check] [paths...] format Ludic source in place (--check: report, write nothing)")
print(" lsp run the language server on stdio (what editors spawn)")
print(" ui-preview [--font DIR] preview a game's ludic.ui components for a studio, on stdio")
print(" help this message")
print("")
print("package scripts (package.ludic):")
@ -110,6 +112,7 @@ program Ludic {
if (cmd == "clean") { return cmd_clean() }
if (cmd == "fmt") { return cmd_fmt() }
if (cmd == "lsp") { return cmd_lsp() }
if (cmd == "ui-preview") { return cmd_ui_preview() }
if (cmd == "doctor") { return cmd_doctor() }
if (cmd == "upgrade") { return cmd_upgrade() }
if (cmd == "script") { return cmd_script() }

View file

@ -324,7 +324,7 @@ function build_artifacts(ver: pointer) -> bool {
let name = `ludic-{ver}-{plat}-{arch}`
let stage = `{tmp_dir()}/{name}`
shell(`rm -rf {stage} && mkdir -p {stage}/bin`)
if not shq(`cp bin/ludic bin/ludicc bin/ludic-fmt bin/ludic-lsp {stage}/bin/`) {
if not shq(`cp bin/ludic bin/ludicc bin/ludic-fmt bin/ludic-lsp bin/ludic-ui-preview {stage}/bin/`) {
err("release: the toolchain is not built (run: ludic-dev build)\n")
return false
}

View file

@ -44,7 +44,9 @@ function cmd_dev_build() -> int {
if not build_tool("ludic-fmt", "tools/ludic-tools/fmt.ludic") { return 1 }
print("ludicc: tools/ludic-tools/lsp.ludic -> bin/ludic-lsp")
if not build_tool("ludic-lsp", "tools/ludic-tools/lsp.ludic") { return 1 }
print("ludicc: tools/ui-preview/main.ludic -> bin/ludic-ui-preview")
if not build_tool("ludic-ui-preview", "tools/ui-preview/main.ludic") { return 1 }
sync_vscode_grammar()
print("done. toolchain in bin/ (ludicc, ludic, ludic-dev, ludic-fmt, ludic-lsp)")
print("done. toolchain in bin/ (ludicc, ludic, ludic-dev, ludic-fmt, ludic-lsp, ludic-ui-preview)")
return 0
}

View file

@ -0,0 +1,19 @@
# ---- ludic ui-preview ---------------------------------------------------------
# A game's ludic.ui components previewed for a studio over stdio: ludic.ui with a backend that
# records its draw calls, and component classes the studio describes. No game code, no GPU, no
# network. The studio spawns it; tools/ui-preview/protocol-v1.md is the contract.
#
# ludic ui-preview [--font DIR] the host, on stdin and stdout
function cmd_ui_preview() -> int {
var args = ""
var ai = 2
while ai < arg_count() {
args = `{args} {sh_single(arg(ai))}`
ai += 1
}
let bin = `{ludic_home()}bin/{exe_name("ludic-ui-preview")}`
if is_exec(bin) { return sh(`exec {sh_single(bin)}{args}`) }
if capture_line(`command -v {exe_name("ludic-ui-preview")} 2>/dev/null`) != "" { return sh(`exec {exe_name("ludic-ui-preview")}{args}`) }
err("ludic ui-preview: no bin/ludic-ui-preview in this install (a checkout builds it with: ludic-dev build)\n")
return 1
}