Merge lang/foundations (9391695) into lang/schemacode: LANGUAGE.md's command list keeps --stdin-file (R10), the code map in schema (R7) and ludic syntax (R8); selfhost/main.ludic carries all three flags; reseeded from the merged source, bootstrap-cfree fixpoint holds (298653 lines), syntax --check clean, no conflict markers

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Orkun ÇAKILKAYA 2026-09-30 00:21:47 +03:00
commit d39a27a904
81 changed files with 114027 additions and 104730 deletions

View file

@ -0,0 +1,9 @@
bump: minor
type: feat
**Check an unsaved buffer.** `ludic build --check --diagnostics=json --stdin-file <path>` (and
`ludicc --check --stdin-file <path>`) checks the program as usual, but wherever the compiler would open
`<path>` - the entry, an import reached through a barrel, a component's `.xml` / `.lss`, an `.lres` -
it reads the text on stdin instead, so an editor's diagnostics follow typing without a save. Paths are
matched after normalising both (separators, relative to the working directory, `.` / `..` folded).
Diagnostics carry the file's usual name with lines and columns in the buffer; a `<path>` the program
never opens is reported as one warning.

View file

@ -0,0 +1,25 @@
bump: minor
type: feat
**One vocabulary, from the compiler, for every editor.** `ludicc --emit-syntax` (`ludic syntax [--json] [-o FILE]`)
prints the language's words from the compiler's own table (`selfhost/frontend/vocab.ludic`): every keyword with its
role (declaration, modifier, statement, operator, constant) and whether the parser reserves it, every declaration's
form, the built-in types and phases, every attribute with what it goes on, its arguments and a one-line doc
(`@Ref`, `@OneOf`, `@Range`, `@Unit`, `@Asset`, `@Color`, `@Node`, `@Clip`, `@Material`, `@Tint`, `@Derived`,
`@Text`, `@Multiline`, `@Key`, `@AppendOnly`, `@ByKey`, `@PerMap`, `@Chunked`, `@max`, `@owns`, `@frame`, `@Sync`,
`@Computed`, `@alloc_ok`, ...), the operators and the literal forms. `"syntax_version": 1`. The emitter asks the
parser's own recognisers of every row and refuses one they disagree with.
`ludic-dev syntax` writes the keyword, type and phase lists of `ludic_syntax.h`, the TextMate grammar, the JetBrains
lexer, `ludic-mode.el` and the language server between marked lines; `ludic-dev syntax --check` (also run by
`check-vocabulary` and the regression suite) fails when one falls behind or lacks a word, when docs/language has no
page for a keyword, type, phase or attribute, or when the parser tests a word or reads an attribute the vocabulary
lacks. The grammars gain `module uses port bind action reducer dispatch registry def open component prop view alias
friend unsafe numbers of as from mut system` and more; docs/language gains a page for each of them and for every
editor, registry and memory attribute.
The language server's outline names every declaration by its own kind: `export property` / `state` are structs with
every field as a child (a field's default no longer swallows the fields after it), `event` / `action` events, `port`
an interface, `registry`, `enum` with its members, `component` / `view` with their props, state and events, and
`reducer S on A`. Hover and go-to-definition resolve an attribute's argument - `@Ref(Kits)` to the registry,
`@Node(model)` to the field it names - and hover on the attribute shows its reference page; a `fn(...) -> T` field
shows its whole type.