Iter 5b: Cross-Module-Typcheck mit qualifizierten Verweisen
Neue API check_workspace(&Workspace) -> Vec<Diagnostic>; check_module hebt das Modul intern in einen Trivial-Workspace. Term::Var mit genau einem Punkt im Namen ist ein qualifizierter Verweis <prefix>.<def>, aufgelöst über Import-Map (alias-oder-modulname → echter Modulname). Drei neue Diagnostic-Codes: unknown-module, unknown-import, invalid-def-name. ail check lädt jetzt immer via load_workspace; Loader-Fehler werden im JSON-Modus zu strukturierten Diagnostics (module-not-found, module-cycle, …). DESIGN.md und JOURNAL.md dokumentieren die Konvention. Hash-Stabilität: alle ir_snapshot_*- Tests bitidentisch grün, kein neuer AST-Knoten.
This commit is contained in:
@@ -100,6 +100,25 @@ Begründung:
|
||||
Trade-off: keine Inline-Optimierungen über die LLVM-API. Wir setzen auf
|
||||
`clang -O2` als Standard-Pipeline.
|
||||
|
||||
## Konvention: Qualifizierte Cross-Module-Verweise (Iter 5b)
|
||||
|
||||
Cross-Module-Aufrufe nutzen **keinen** neuen AST-Knoten. Stattdessen ist ein
|
||||
`Term::Var { name }` mit genau einem Punkt im Namen ein qualifizierter
|
||||
Verweis: `<prefix>.<def>`.
|
||||
|
||||
- `<prefix>` ist ein Import-Alias (`import { module: "X", as: "<prefix>" }`)
|
||||
oder, falls ohne Alias importiert, der Modulname selbst.
|
||||
- `<def>` ist der Name einer Top-Level-Definition im Zielmodul.
|
||||
- Def-Namen DÜRFEN keinen Punkt enthalten — der Typchecker meldet
|
||||
`invalid-def-name` mit `ctx: { "reason": "contains-dot" }`.
|
||||
- Der Workspace-Loader (Iter 5a) findet alle erreichbaren Module; der
|
||||
Typchecker (Iter 5b, `check_workspace`) löst Punkt-Namen über die
|
||||
Import-Map auf. Diagnostic-Codes: `unknown-module` (Prefix nicht
|
||||
importiert), `unknown-import` (Modul gefunden, Def nicht).
|
||||
|
||||
Hash-Stabilität: kein neuer AST-Knoten, keine umbenannten Felder — alle
|
||||
bisherigen Modul-Hashes bleiben bitidentisch.
|
||||
|
||||
## Datenmodell (MVP)
|
||||
|
||||
### Module
|
||||
|
||||
@@ -220,3 +220,32 @@ Sub-Schritte:
|
||||
Während Iter 5 gleich beim Bau **`source_filename` pfad-unabhängig
|
||||
halten** (nur Modulname, kein Verzeichnis-Prefix), sonst kippen die
|
||||
IR-Snapshots.
|
||||
|
||||
## 2026-05-07 — Iter 5b fertig: Cross-Module-Typcheck
|
||||
|
||||
- `check_workspace(&Workspace) -> Vec<Diagnostic>` als Top-Level-API.
|
||||
`check_module` bleibt erhalten und hebt das Modul intern in einen
|
||||
Trivial-Workspace.
|
||||
- Konvention für qualifizierte Verweise (in DESIGN.md festgehalten):
|
||||
`Term::Var { name }` mit genau einem Punkt = `<prefix>.<def>`. Prefix
|
||||
ist Import-Alias oder Modulname. Kein neuer AST-Knoten, keine
|
||||
umbenannten Felder ⇒ Hashes bleiben stabil; alle `ir_snapshot_*`
|
||||
weiterhin grün.
|
||||
- Drei neue Diagnostic-Codes: `unknown-module`,
|
||||
`unknown-import`, `invalid-def-name` (mit `ctx.reason: "contains-dot"`).
|
||||
- CLI: `ail check <entry>` lädt jetzt **immer** über `load_workspace`.
|
||||
Workspace-Lade-Fehler werden im JSON-Modus zu strukturierten
|
||||
Diagnostics mit Codes `module-not-found`, `module-cycle`,
|
||||
`module-name-mismatch`, `module-hash-mismatch`, `schema-mismatch`.
|
||||
`ail build` und `ail emit-ir` bleiben pro Einzelmodul (Codegen
|
||||
cross-module ist 5c).
|
||||
- Beispiele: `ws_main.ail.json` ruft jetzt `ws_lib.add` auf
|
||||
(beobachtbar). Neu: `ws_broken.ail.json` (`unknown-import`),
|
||||
`ws_unknown_module.ail.json` (`unknown-module`).
|
||||
- Tests: 37 grün (vorher 32). 4 neue Workspace-Integrationstests in
|
||||
`crates/ailang-check/tests/workspace.rs`, ein neuer e2e-Test
|
||||
`check_workspace_resolves_import`.
|
||||
- Schulden: Single-Shot-Diagnostics weiterhin (Multi-Diagnose nach 5c).
|
||||
Punkt-Konvention deckt nur einen Punkt ab — verschachtelte Modulpfade
|
||||
(`a.b.c`) gibt es nicht; das wäre erst mit Hierarchie-Modulen ein
|
||||
Thema und fällt aktuell als `unbound-var` durch.
|
||||
|
||||
Reference in New Issue
Block a user