Phase 5: Editor und inkrementellen Compiler implementieren und archivieren

This commit is contained in:
2026-09-06 17:58:26 +02:00
parent df85a4b7b2
commit 9c85349a4d
36 changed files with 2993 additions and 247 deletions

View File

@@ -30,7 +30,7 @@ Besondere Risiken sind unverändert ausgeführte alte Kompilate nach einer Text
|---|---|---|---|
| 01 | [Projekt- und Dokumentmodell](proposal.md) | keine | Gemeinsame Lade-/Speicheraktionen, bearbeitete Quellen, MAK und Startup-Metadaten |
| 02 | [IDE-Rahmen](../2026-09-06-phase-5-02-ide-rahmen/proposal.md) | 01 | Terminalbesitz, Menüs, Fenster, Dialoge, Optionen und Eingabetestpfad |
| 03 | [Editor und inkrementelle Übersetzung](../../phase-5-03-editor-und-inkrementelle-uebersetzung/proposal.md) | 01, 02 | Vollständige Codebearbeitung, Diagnose und schneller aktueller Compile |
| 03 | [Editor und inkrementelle Übersetzung](../2026-09-06-phase-5-03-editor-und-inkrementelle-uebersetzung/proposal.md) | 01, 02 | Vollständige Codebearbeitung, Diagnose und schneller aktueller Compile |
| 04 | [Ausführung und Output](../../phase-5-04-ausfuehrung-und-output/proposal.md) | 01, 02, 03 | Fortsetzbare VM-Sitzung, Reset, Ausgabe, Shell und Textdruck |
| 05 | [Formular-Designer](../../phase-5-05-formular-designer/proposal.md) | 01, 02, 03 | Visuelles Gestalten und konsistenter Ereigniscode |
| 06 | [Debugger und Direktfenster](../../phase-5-06-debugger-und-direktfenster/proposal.md) | 03, 04 | Quellgenaues Debuggen, Watches, Immediate, History und Fehlerhalte |

View File

@@ -0,0 +1,2 @@
schema: spec-driven
created: 2026-09-06

View File

@@ -0,0 +1,31 @@
## Context
`SourceUnit::parse` erhält Segmentherkunft. `tb-vm/src/project.rs::compile_project` parst heute alle Module, löst Exportdeklarationen und Konstanten auf, senkt sie erneut ab und verknüpft alles. Es gibt keinen inkrementellen Cache und keine Editor-Normalisierung. Das bestehende Budget steht in `bytecode-kompilat` und `docs/tbvm-design.md`. Dokumente und UI stammen aus 01/02.
## Goals / Non-Goals
**Goals:** Text und Diagnose identisch zur bestehenden Sprache; nur tatsächlich betroffene Module erneut übersetzen; Quellorte bis zur Diagnose erhalten.
**Non-Goals:** LSP, fremder Editorprozess, neuer BASIC-Parser, Rope ohne gemessenen Bedarf, teure Optimierung oder Live-Patching einer laufenden VM.
## Decisions
1. Ein dokumentbezogener Textpuffer mit Edit-Operationen reicht zunächst. Cursor/Selektion werden an Unicode-Grenzen geführt; Bildschirmspalten verwenden die vorhandene Unicode-Breitenlogik. Zusammengesetzte Aktionen (Paste, Replace All, Normalisierung, Prozedurerzeugung) sind eine Undo-Einheit. Die Zwischenablage ist IDE-intern verlässlich; ein späterer Betriebssystemadapter ist keine Voraussetzung für CUA-Kopieren zwischen IDE-Fenstern.
2. Normierung nutzt Tokenarten und Quellspannen des vorhandenen Frontends, keinen Regex-Ersatz auf dem gesamten Text. Nur eindeutig erkannte Keywords/Trennräume werden geändert; Strings, Kommentare, DATA und Typ-Suffixe bleiben erhalten. Token-/AST-Vergleich der Vorher-/Nachher-Programme prüft Semantikerhalt. Unvollständige Konstrukte werden durch den bestehenden Parserkontext als unfertig markiert, nicht mit einem zweiten permissiven Parser ausgeführt. Line Leave aktualisiert den betroffenen Modulstand; ein noch unvollständiges Modul bleibt nicht startbar.
3. Prozedurwahl zeigt Modulrumpf und SUB/FUNCTION-Einträge. Shift+F2 öffnet die Auswahl, Ctrl+F2 kehrt zur vorherigen Codeposition zurück. Die in der Spec konkretisierten Ctrl+Q-Chords sind Projektvorgaben für die in der Referenz nur allgemein genannte WordStar-Familie. Suchdialoge arbeiten zunächst auf dem aktiven Dokument oder dessen Auswahl; Projektweitsuche ist kein Phase-5-Punkt. Auswahl-Suche und F3 nutzen denselben Suchzustand.
4. Generierte DECLARE-Zeilen liegen in einem eindeutig kommentierten IDE-Bereich und werden signaturbasiert gepflegt. Vorhandene explizite passende Deklarationen gewinnen; widersprüchliche Handdeklarationen werden diagnostiziert. Der Speicherhook schreibt niemals einen nur teilweise aktualisierten deklarativen Vorspann. Unfertiger oder fehlerhafter Quelltext bleibt ausdrücklich speicherbar: dann wird die automatische DECLARE-Pflege vollständig übersprungen und erklärt, während der eingegebene Text unverändert als Entwurf gespeichert wird. DEFtype-Übernahme verwendet die am Erzeugungsort gültigen Vorgaben und erzeugt keine doppelten Header. FRM-Code benutzt denselben Hook.
5. Ein Cache innerhalb des vorhandenen Projektcompilers speichert Parsing und unverkettete Modulprodukte. Schlüssel umfassen Dokument-/Include-Inhalte, Modulidentität, Compilerkonfiguration, importierte öffentliche Vertragsinhalte und Forms-Metadaten. Abhängigkeiten folgen tatsächlicher Namensauflösung einschließlich CONST, TYPE, COMMON, DECLARE und Formularnamen. Private Rumpfänderungen invalidieren keine unabhängigen Module; Exportänderungen invalidieren transitive Verbraucher. Unsichere oder zuvor fehlerhafte Abhängigkeitsauflösung führt konservativ zur betroffenen vollständigen Neuauflösung, nicht zu einem vermeintlich gültigen alten Ergebnis.
6. Der vorhandene Linker verknüpft gecachte unverkettete Produkte neu und remappt alle Slot-, Typ-, Prozedur-, String-, DATA-, Objekt- und Quell-IDs. Bereits verknüpfte Produkte werden nicht durch Feldpatches wiederverwendet. Der bisherige Vollcompile bleibt als Vergleichspfad und CLI-Einstieg erhalten. Kein dauerhaftes Cache-Dateiformat.
7. Jede Diagnose und jedes Ergebnis gehört zu einem vollständigen Projektrevisionssatz. Start akzeptiert nur den aktuellen Satz; Compilefehler machen einen alten Erfolg nicht aktuell. Editieren während Break erzeugt eine neue Revision; die Laufentscheidung liegt bei 04. Ein einzelner UI-Prozess kann zunächst synchron auf Line Leave kompilieren, solange das bestehende Budget eingehalten wird; Hintergrund-Compiler und Cancellation werden nicht vorsorglich gebaut.
8. Tests vergleichen Voll-/Cachepfad für private Änderungen, Includes, transitive Konstanten, Typ-/COMMON-Änderungen, Entfernen/Umordnen von Modulen und Forms-Arrayänderungen. Zähler belegen Wiederverwendung; Benchmarks messen inklusive Invalidierung/Link mit dem vorhandenen Referenzprojekt. Keine fragile Millisekunden-Assertion in normalen Debug-CI-Tests.
## Risks / Trade-offs
- Verdeckte Deklarationsabhängigkeit → Export-/Importsignaturen aus realer Auflösung, Differentialtests gegen frischen Compile; bei Zweifeln sicher neu auflösen.
- Fehlerdialog beim unfertigen Block → zwischen unvollständig und eindeutig ungültig unterscheiden; Abbrechen lässt den Text stehen.
- Textnormalisierung verändert Programme → geschützte Tokenklassen und Idempotenz-/Semantiktests, bei uneindeutigem Fragment keine Normalisierung.
- Einfacher Textpuffer wird teuer → erst bei verfehltem Referenzbudget eine andere Datenstruktur erwägen.
## Migration Plan
Vollcompiler als Referenz beibehalten, Cache optional dazuschalten und mit denselben Quellen vergleichen. Generierte DECLARE-Blöcke sind normale BASIC-Kommentare und Deklarationen; Quellen bleiben mit der CLI lesbar. Cacheverlust bedeutet nur Neuübersetzung.

View File

@@ -0,0 +1,28 @@
## Why
Der vorhandene Frontend-/Projektcompiler übersetzt vollständige Einheiten, hat aber weder Editorfunktionen noch einen inkrementellen Cache. Phase 5 verlangt zeilenbezogene Rückmeldung und kurze Startzeiten auch bei mehreren Modulen.
## What Changes
- Quelltexteditor mit CUA- und WordStar-Bedienung, Undo, Suchen/Ersetzen, Include-Ansichten und Prozedurnavigation.
- Syntaxprüfung und semantikerhaltende Normalisierung beim Verlassen einer Zeile; DECLARE-Pflege beim Speichern und DEFtype-Übernahme in neue Prozeduren.
- Modulweiser Compiler-Cache mit Include- und Deklarationsabhängigkeiten, korrekter Invalidierung und identischen Ergebnissen zur vollständigen Übersetzung.
- Quellgenaue Diagnosen und revisionsgebundene Kompilate; Messungen gegen das bestehende Instant-Compile-Budget.
## Capabilities
### New Capabilities
- `ide-editor`: Quelltexteditor mit CUA- und WordStar-Bedienung, Undo, Suchen/Ersetzen, Include-Ansichten und Prozedurnavigation.
### Modified Capabilities
Keine bestehenden Anforderungen werden ersetzt; die neue IDE-Fähigkeit ergänzt die vorhandenen Laufzeit- und Dateiformatverträge.
## Impact
tb-ide-Editor, tb-frontend Lexer/Parser/Sema und tb-vm Projektcompiler/Linker; bestehende Compile-Budget-Tests und docs/tbvm-design.md. Kein zweiter BASIC-Parser und kein Optimizer.
**Abhängigkeiten:** [phase-5-01-projekt-und-dokumentmodell](../2026-09-06-phase-5-01-projekt-und-dokumentmodell/proposal.md), [phase-5-02-ide-rahmen](../2026-09-06-phase-5-02-ide-rahmen/proposal.md).
**Gesamtplanung:** [Phase-5-Übersicht](../2026-09-06-phase-5-01-projekt-und-dokumentmodell/phase-5-uebersicht.md). Die Nummern geben eine gültige Umsetzungsreihenfolge an; OpenSpec erzwingt Change-Abhängigkeiten nicht automatisch.

View File

@@ -0,0 +1,66 @@
## Purpose
Ermöglicht die vollständige Quelltextbearbeitung in der IDE und schnelle, quellgenaue Übersetzung des aktuellen Projektstands mit unveränderter BASIC-Semantik.
## ADDED Requirements
### Requirement: Editorbewegung und Änderungen
Der Editor SHALL Einfügen/Überschreiben, Auswahl, CUA-Kopieren/Ausschneiden/Einfügen/Rückgängig, Pos1/Ende, seiten- und wortweise Navigation sowie Ctrl+Y zum Zeilenlöschen unterstützen. WordStar SHALL Ctrl+Q,S/D für Zeilenanfang/-ende, Ctrl+Q,R/C für Dateianfang/-ende und Ctrl+K,03 / Ctrl+Q,03 für Setzen/Anspringen von vier Lesezeichen unterstützen. Unicode-Zeichen und Tabulatoren SHALL ohne beschädigte Zeichen oder falsche Cursorpositionen bearbeitet werden.
#### Scenario: Zusammengesetzte Bearbeitung
- **WHEN** mehrzeiliger Text eingefügt, markiert, ausgeschnitten und rückgängig gemacht wird
- **THEN** sind Text, Auswahl und Cursor nachvollziehbar wiederhergestellt; ein abgeschnittener WordStar-Chord führt keine zufällige Textänderung aus
### Requirement: Suchen und Ersetzen
Find, Selected Text mit Ctrl+Backslash, Repeat Last Find mit F3 und Change SHALL Suchtext, Richtung, Groß-/Kleinschreibung und Wortgrenzen berücksichtigen. Change SHALL Einzelersetzung und Ersetzen aller Treffer im gewählten Suchbereich erlauben; eine Ersetzungsaktion SHALL rückgängig machbar sein. Das Ende des Suchbereichs SHALL einen erkennbaren Rücksprung anbieten.
#### Scenario: Leere und verkürzende Ersetzung
- **WHEN** Treffer durch leeren oder kürzeren Text ersetzt werden
- **THEN** werden alle vorgesehenen Treffer genau einmal verarbeitet; Undo stellt den gesamten Zustand vor der Aktion her
### Requirement: Zeilenprüfung und Normalisierung
Bei aktivem Syntax Checking SHALL das Verlassen einer geänderten Zeile eine Prüfung und bei eindeutig gültiger Syntax eine Normalisierung von Keywords und Leerzeichen auslösen. Zeichenketten, Kommentare, DATA-Nutztext, Bezeichner und Typ-Suffixe MUST semantisch unverändert bleiben. Unvollständige mehrzeilige Konstrukte SHALL als noch unvollständig behandelbar bleiben; sie dürfen die weitere Eingabe nicht blockieren. Abschalten SHALL automatische Formatierung und Fehlerdialoge unterbinden; Run SHALL weiterhin eine vollständige Gültigkeitsprüfung verlangen.
#### Scenario: Nutztext unverändert
- **WHEN** eine Zeile mit kleingeschriebenen Keywords, einem String, einem Kommentar und Typ-Suffixen verlassen wird
- **THEN** werden nur syntaktische Keywords und zulässige Abstände normalisiert; erneute Normalisierung verändert nichts mehr
#### Scenario: Unvollständiger Block
- **WHEN** nach SUB oder einem mehrzeiligen IF die nächste Zeile begonnen wird, bevor END SUB beziehungsweise END IF vorhanden ist
- **THEN** bleibt der Editor bedienbar und zeigt den unvollständigen Zustand, ohne das Fragment zu verwerfen oder ein altes Kompilat als aktuell startbar zu behandeln
### Requirement: Prozeduren und Deklarationen
New Sub und New Function SHALL gültige, eindeutig benannte Prozedurrümpfe mit den wirksamen DEFtype-Vorgaben anlegen. Shift+F2 und Ctrl+F2 SHALL Prozedurwahl beziehungsweise Rückkehr ermöglichen. Beim Speichern SHALL benötigte DECLARE-Prototypen erzeugt oder aktualisiert werden; benutzerdefinierte Deklarationen MUST NOT still überschrieben werden. Konflikte SHALL quellgenau gemeldet und der Dokumentstand erhalten werden. Unvollständige oder fehlerhafte Quellen SHALL als Entwurf speicherbar bleiben; dabei SHALL eine nicht sicher mögliche DECLARE-Pflege vollständig übersprungen und erklärt werden.
#### Scenario: Wiederholtes Speichern
- **WHEN** eine neue Prozedur angelegt und das Dokument mehrfach gespeichert wird
- **THEN** existiert genau eine passende Deklaration; der zweite Speichervorgang erzeugt keine weitere Änderung
#### Scenario: Unfertigen Entwurf speichern
- **WHEN** eine noch unvollständige Prozedur gespeichert und erneut geöffnet wird
- **THEN** bleibt der eingegebene Text erhalten; es wurde kein unvollständiger DECLARE-Vorspann erzeugt und die ausgelassene automatische Pflege wurde erklärt
### Requirement: Include-Ansichten und Diagnosen
Included File SHALL die Originaldatei der Einbindung öffnen; Included Lines SHALL die Expansion als klar gekennzeichnete Ansicht ein-/ausblenden. Diagnosewahl SHALL in das richtige Modul, die physische Datei und Zeile springen. Eingeblendete Expansion SHALL entweder zur Ursprungsdatei weiterleiten oder schreibgeschützt sein.
#### Scenario: Gleichnamige Quellzeilen
- **WHEN** zwei Includes derselben Übersetzung in derselben physischen Zeilennummer Fehler enthalten
- **THEN** führen ihre Diagnosen jeweils zur richtigen Datei und nicht zur verketteten Modulzeile
### Requirement: Korrekte inkrementelle Übersetzung
Nach Änderungen SHALL nur die betroffene Übersetzungseinheit und ihre tatsächlich betroffenen abhängigen Einheiten neu übersetzt werden. Includes, öffentliche Signaturen, Konstanten, TYPE-/COMMON-Deklarationen, Modulreihenfolge und Forms-Struktur SHALL in die Gültigkeitsprüfung eingehen. Inkrementelle und frische vollständige Übersetzung desselben Stands SHALL dieselben Diagnosen und dasselbe Laufzeitverhalten liefern. Veraltete Ergebnisse MUST NOT einen neueren Dokumentstand überschreiben oder als dessen Kompilat ausgeführt werden.
#### Scenario: Private Änderung
- **WHEN** nur der Prozedurrumpf eines Moduls ohne Änderung seines öffentlichen Vertrags geändert wird
- **THEN** wird dieses Modul neu übersetzt, unveränderte unabhängige Module werden wiederverwendet und das neu verknüpfte Projekt entspricht der vollständigen Übersetzung
#### Scenario: Transitive Änderung
- **WHEN** eine exportierte Konstante oder ein TYPE in einem gemeinsam eingebundenen Include geändert wird
- **THEN** werden alle betroffenen direkten und transitiven Verbraucher aktualisiert; entfernte Symbole liefern dieselben Fehler wie eine frische Übersetzung
### Requirement: Nachweisbarer Instant Compile
Die IDE-Übersetzung SHALL das bestehende Release-Budget von unter 50 ms für das Referenz-Einzelmodul und unter 1 s für das ungefähr 50.000-Zeilen-Referenzprojekt auf dokumentierter Referenzhardware einhalten. Messungen SHALL vollständigen Compile und Änderungen mit Cache einschließlich Invalidierung und Link getrennt ausweisen.
#### Scenario: Reproduzierbare Messung
- **WHEN** der Release-Benchmark auf der ausgewiesenen Referenzhardware ausgeführt wird
- **THEN** nennt er Hardware, Profil, Projektgröße, vollständige und inkrementelle Dauer sowie neu übersetzte Module und bewertet beide bestehenden Zeitgrenzen

View File

@@ -0,0 +1,26 @@
## 1. Editor und Navigation
- [x] 1.1 Den Texteditor auf dem Dokumentmodell aus 01 integrieren; Tests mit Unicode, Tabs, Zeilenumbrüchen, Einfügen/Überschreiben, Auswahl und Undo belegen korrekten Text und Cursor.
- [x] 1.2 CUA-, Wort-/Seitennavigation, Ctrl+Y und die spezifizierten WordStar-Chords/Lesezeichen anbinden; eingespeiste Tastenfolgen prüfen auch abgebrochene Chords und Mehrfenster-Kopieren.
- [x] 1.3 Find, Selected Text, F3 und Change mit Einzel-/Gesamtersetzung implementieren; Tests prüfen Wortgrenzen, Suchrichtung, Großschreibung, Rücksprung, leere Ersetzung und gemeinsames Undo.
- [x] 1.4 Prozedurauswahl und Shift+F2/Ctrl+F2 sowie Include-Ansichten umsetzen; Navigationstests treffen physische Dateien und verhindern Speichern einer Expansion als Ursprungsdatei.
## 2. Prüfung und Quelltextpflege
- [x] 2.1 Token-/Spanneninformationen des vorhandenen Frontends für semantikerhaltende Zeilennormalisierung verwenden; Tests belegen Idempotenz und erhalten Strings, Kommentare, DATA, Bezeichner und Typ-Suffixe.
- [x] 2.2 Line Leave an Syntax Checking und Diagnoseanzeige anbinden; Eingabetests unterscheiden unfertige SUB-/IF-Blöcke von echten Fehlern und belegen das deaktivierte Verhalten.
- [x] 2.3 New Sub/New Function mit Namenprüfung und wirksamer DEFtype-Übernahme implementieren; erzeugte Quellen müssen über den bestehenden Compiler gültig sein.
- [x] 2.4 DECLARE-Erzeugung/-Aktualisierung in den gemeinsamen Speicherhook aufnehmen; Tests belegen wiederholtes Speichern ohne Änderungen, Handdeklarationskonflikte, unverändertes Speichern unfertiger Entwürfe und denselben Weg für FRM-Code.
## 3. Inkrementeller Compiler
- [x] 3.1 Den Projektcompiler in wiederverwendbare Parse-/Modulcompile-/Link-Schritte zerlegen und den bisherigen Vollcompile darüber erhalten; bestehende Compiler-/CLI-Regressionen bleiben grün.
- [x] 3.2 Modulcache mit Dokument-/Include-Revisionssatz und Import-/Exportsignaturen einführen; Zählertests belegen Wiederverwendung unveränderter Module nach privater Rumpfänderung.
- [x] 3.3 Transitive Invalidierung für CONST, TYPE, COMMON, DECLARE und Includes umsetzen; Differentialtests mit Änderungen und gelöschten Symbolen liefern dieselben Diagnosen wie ein frischer Compile.
- [x] 3.4 Forms-Struktur, Modulreihenfolge und sämtliche beim Link remappten Identitäten berücksichtigen; Tests vergleichen umgeordnete Module, Control-Arrays, DATA und Prozedurverweise mit dem Vollcompile.
- [x] 3.5 Fehlerzustände und Ergebnisrevisionen an den Editor anbinden; ein Test mit gültig→fehlerhaft→gültig belegt, dass niemals ein veraltetes Ergebnis als aktueller Stand startet.
## 4. Leistung und Abnahme
- [x] 4.1 Die vorhandenen Release-Compile-Benchmarks um Änderungen mit Cache einschließlich Invalidierung/Link ergänzen; dokumentierte Messungen prüfen Einzelmodul unter 50 ms und Referenzprojekt unter 1 s sowie tatsächlich neu übersetzte Module.
- [x] 4.2 Editor-/Compilerbedienung und Cachegrenzen in docs erläutern und alle Szenarien in verification.md zuordnen; relevante Frontend-, VM-, CLI- und IDE-Tests sowie Formatprüfung müssen bestehen.

View File

@@ -0,0 +1,119 @@
# Verifizierung: phase-5-03-editor-und-inkrementelle-uebersetzung
Stand: 2026-09-06. Abgleich gegen proposal.md, design.md, tasks.md und
specs/ide-editor/spec.md; Implementierung und Korrekturen im Arbeitsverzeichnis.
| Dimension | Ergebnis |
| --- | --- |
| Vollständigkeit | 15/15 Aufgaben, 7/7 Anforderungen, 10/10 Szenarien |
| Korrektheit | Ereignistests, Compiler-Differentialtests und Release-Messung bestanden |
| Kohärenz | Gemeinsames Dokumentmodell, regulärer Lexer/Parser/Sema und bestehender Linker; keine neue Abhängigkeit |
| Offene Befunde | 0 CRITICAL, 0 WARNING, 0 SUGGESTION |
## Anforderungs- und Szenariozuordnung
Alle Code- und Testpfade sind relativ zur Repositorywurzel angegeben.
| Anforderung / Szenario | Umsetzung | Nachweis |
| --- | --- | --- |
| Editorbewegung und Änderungen / Zusammengesetzte Bearbeitung | `tb-ide/src/editor.rs`: editor_key, editor_insert, editor_scroll; `documents.rs`: View, replace_ranges, undo; TerminalGuard aktiviert Bracketed Paste | `crates/tb-ide/tests/editor.rs`: cua_unicode_overwrite_wordstar_and_shared_undo; crlf_navigation_word_boundaries_readonly_and_normalization_keep_views |
| Suchen und Ersetzen / Leere und verkürzende Ersetzung | editor.rs: Search, matches, find_next, replace_matches; gemeinsame Dialogfelder und Dispatcher | search_scope_direction_wrap_and_shortening_replace_all: Richtung, Wortgrenzen, Case, Auswahlbereich, Ctrl+Backslash, F3-Rücksprung, leere/verkürzende Ersetzung und Undo |
| Zeilenprüfung und Normalisierung / Nutztext unverändert | `tb-frontend/src/editing.rs`: normalization_edits mit Keywordpositionen und Tokenvergleich; editor.rs: line_leave | `crates/tb-frontend/tests/editing.rs`: normalization_protects_tokens_and_is_idempotent; IDE-Zeilen-/Mehransichtstest |
| Zeilenprüfung und Normalisierung / Unvollständiger Block | Parser markiert ausschließlich fehlende Blockabschlüsse am EOF als unvollständig; keine zweite Fragmentgrammatik | incomplete_is_parser_context_not_a_second_grammar; line_leave_incomplete_invalid_disabled_and_current_revisions |
| Prozeduren und Deklarationen / Wiederholtes Speichern | new_procedure, Signaturen mit DEFtype-Kontext; gemeinsamer Project::save_file-Hook mit Projektauflösung; Save Project benutzt denselben Hook | declaration_maintenance_and_procedure_generation_are_transactional; deftype_context_does_not_leak_from_another_procedure; procedures_and_shared_save_hook_preserve_drafts_and_frm_code; external_include_revision_and_project_context_declarations |
| Prozeduren und Deklarationen / Unfertigen Entwurf speichern | Bei Parser-/Compilefehlern keine teilweise DECLARE-Pflege, unveränderter Entwurf mit begründeter Meldung; Handdeklarationen bleiben erhalten | Frontend-Test prüft unvollständigen Block, Syntaxfehler und konfliktbehaftete Handdeklaration; IDE-Test speichert und liest den Entwurf sowie FRM-Code erneut |
| Include-Ansichten und Diagnosen / Gleichnamige Quellzeilen | Included File öffnet das physische Dokument; Included Lines ist markiert und schreibgeschützt; goto_diagnostic verwendet Datei, physische Zeile und Spalte einschließlich FRM-Offset | includes_and_diagnostic_selection_use_original_physical_files: zwei Includes mit Fehlern auf Zeile 1; zusätzlicher Schreibschutz-/Scrolltest |
| Korrekte inkrementelle Übersetzung / Private Änderung | ProjectCompiler cached Parsing und unverknüpfte Produkte; Importvertragsvergleich ignoriert verschobene fremde Prozedurzeilen | `crates/tb-vm/tests/incremental.rs`: cached_private_edits_parse_and_compile_only_changed_modules; Zähler prüfen auch private Änderungen mit zusätzlicher Zeile vor einer weiteren Prozedur |
| Korrekte inkrementelle Übersetzung / Transitive Änderung | Bestehende Exportauflösung faltet Konstanten transitiv; Schlüssel enthalten benötigte importierte Konstanten, TYPE-/Prozedurtabellen und Forms-Katalog; COMMON wird frisch gelinkt | constants_types_common_removed_symbols_and_order_match_full_compiler; unused_constants_do_not_invalidate_independent_units_and_declare_changes_do; includes_source_ids_data_and_forms_relink_without_patching_old_products |
| Nachweisbarer Instant Compile / Reproduzierbare Messung | `crates/tb-vm/benches/compile.rs`: bestehender Referenzgenerator, Vollcompile und Cacheänderungen einschließlich Auflösung/Link und Modulzählern | Release-Messung unten und in docs/tbvm-design.md |
Die Kürzel `tb-ide/src` und `tb-frontend/src` in der Tabelle stehen jeweils unter
`crates/`. Tests ohne wiederholten Pfad stehen in den genannten editing.rs-
beziehungsweise editor.rs-Testdateien.
## Ergänzende Korrektheitsprüfung
- Differentialtests vergleichen **vollständige TBC-Bytes** erfolgreicher Cache-
und Vollcompiles. Damit stimmen Instruktionen, Tabellen und Quellzuordnung
überein; Fehlerfälle vergleichen die vollständigen formatierten Diagnosen.
- Abgedeckt sind private Änderungen, Konstante→transitiver Verbraucher,
gelöschte Symbole, TYPE-Layout, COMMON-Typ, DECLARE-Signatur, Modulreihenfolge,
zusätzliche Includedatei/Quell-ID, DATA, Strings, Prozedurverweise sowie der
Wechsel eines Controls zum Array und geänderte Index-Anfangswerte.
- Gültig→fehlerhaft→gültig liefert niemals einen alten Erfolg als aktuellen
Stand. Kompilate **und Diagnosen** sind revisionsgebunden. Noch ungeöffnete
Includes werden frisch gelesen; bereits geöffnete Puffer bleiben gemäß
Dokumentmodell maßgeblich gegenüber externen Dateiänderungen.
- Copy/Paste benutzen die interne Zwischenablage zwischen IDE-Fenstern.
CRLF, Unicode, Tabs und breite Zeichen werden über Eingabeereignisse geprüft;
TestBackend prüft die sichtbare Auswahl. Normalisierung und Speicherpflege
erhalten Cursor und Auswahl anderer Ansichten.
- Die bestehende Dokument-/IDE-Regression bleibt erhalten. Angepasste Erwartungen
betreffen die jetzt verfügbare Copy-Funktion, den zusätzlichen Diagnostics-
Menüpunkt und neue DECLARE-Zeilen beim Speichern. Der reine Fenstertest schaltet
Syntax Checking für seinen absichtlich ungültigen Text `abc` aus; die neuen
Editor-Tests prüfen aktivierte Prüfung und Fehlerdialoge ausdrücklich.
## Behobene Befunde aus den Prüfrunden
1. DECLARE-Pflege zunächst ohne Projektkontext: auf tatsächliche Include-,
Modul- und Forms-Auflösung im gemeinsamen Speicherhook umgestellt. Generierte
Deklarationen stehen nach TYPE-/DEFtype-Angaben vor den Prozeduren.
2. Positionsverschiebung bei Normalisierung/Speichern: disjunkte Textänderungen
und gemeinsames Positionsremapping erhalten Cursor, Auswahl und Lesezeichen;
Undo bleibt eine Dokumenttransaktion.
3. Weitere Schreibwege in Included Lines: Undo, Load Text, Prozedurerzeugung,
Ersetzen und Editieraktionen sind dort gesperrt; Lesen/Scrollen und Rückkehr
zum Original bleiben möglich.
4. CRLF- und Wortbewegung: Navigation/Entfernen behandeln CRLF gemeinsam,
Ctrl+Rechts berücksichtigt den Beginn des Wortbereichs und Auswahlkollaps
folgt der Bewegungsrichtung.
5. DEFtype-Kontext: keine Übernahme aus einer fremden Prozedur; Includes und der
aktuelle Block werden berücksichtigt. Prozedurnamen werden projektweit geprüft.
6. Cacheinvalidierung: verschobene fremde Quellzeilen sind kein Importvertrag;
unbenutzte importierte Konstanten invalidieren unabhängige Produkte nicht.
7. Diagnosegültigkeit: Quellenänderungen machen auch alte Diagnosen ungültig;
die Diagnoseauswahl prüft vor der Navigation erneut den Revisionssatz.
8. Doppeltes Menü-Mnemonic und Clippy-Hinweise beseitigt.
## Validierung
- `cargo test --workspace`: **529 bestanden, 0 fehlgeschlagen, 2 bestehende
Tests ignoriert**. Die ignorierten Tests sind der bewusste Golden-File-Generator
und der externe VBDOS-Korpus mit erforderlichem `TB_VBDOS_REPO`.
- `cargo clippy -p tb-ide -p tb-vm -p tb-frontend --all-targets -- -D warnings`:
bestanden.
- `cargo fmt --all -- --check`, `cargo build -p tb-ide`, `git diff --check`:
bestanden.
- `openspec validate --all --strict --json`: alle aktiven Changes und Hauptspecs
gültig.
- Tatsächlicher PTY-Smoke-Test mit `target/debug/tb`, 100×30 und isoliertem
temporären Arbeits-/Konfigurationsverzeichnis: Bracketed Paste eines
PRINT-Statements, Enter/Line Leave und Normalisierung, Exit mit Discard;
Exit-Code 0, identischer termios-Zustand, Cursor sichtbar, Alternate Screen und
Bracketed Paste deaktiviert, keine Dateien erzeugt. Kein Emulator/GUI nötig.
Release, macOS/aarch64, Apple M5 Max, 2026-09-06:
| Referenz | Vollcompile | Änderung mit Cache | Neu / wiederverwendet | Bewertung |
| --- | ---: | ---: | ---: | --- |
| 508 Zeilen | 1,21 ms | 0,74 ms | 1 / 0 | < 50 ms erfüllt |
| 49.760 Zeilen / 20 Module | 103 ms | 22,10 ms | 1 / 19 | < 1 s erfüllt |
Cachewerte sind der Median von sieben Änderungen einschließlich Invalidierung
und Link; der bisherige Vollcompile-Harness misst das beste Einzelmodul aus zehn
Läufen und einen Projektlauf. Die Messung umfasst 335.421 Projektinstruktionen.
## Bewertung
Keine offenen Befunde im Scope dieses Changes. Keine spezifizierte Funktion
wurde zurückgestellt. VM-Start/Continue und die Verwendung des aktuellen
Kompilats im Laufprozess gehören zum abhängigen Change 04; native Erzeugung
bleibt Phase 6. Der Change ist implementiert und verifiziert.
## Synchronisation und Archivierung
Am 2026-09-06 wurden alle sieben Anforderungen und zehn Szenarien in
`openspec/specs/ide-editor/spec.md` übernommen. Alle 18 Hauptspecs bestanden
die strikte Validierung vor der Archivierung. Der Change wurde anschließend
archiviert; relative Links und Abhängigkeiten der Folgechanges wurden angepasst.