4.8 KiB
4.8 KiB
Projektplan: Transformation des AST-Visualisierers zum Interaktiven Editor
- Datum: 08.09.2025 11:20
- Motivation
- Der aktuelle AST-Visualisierer ist ein leistungsfähiges Anzeigetool. Um ihn zu einem interaktiven Werkzeug für die Skript-Entwicklung, -Analyse und -Modifikation weiterzuentwickeln, muss eine robuste Architektur für Zustandsverwaltung, Bearbeitung und Persistenz geschaffen werden.
- Ziel
- Die Entwicklung einer flexiblen Editor-Architektur, die eine klare Trennung zwischen dem logischen AST-Modell und seiner visuellen Repräsentation gewährleistet. Das System muss komplexe Anforderungen erfüllen: Es soll optionale Darstellungsmodi (Baum- vs. Graphen-Ansicht), zwei Arten von Metadaten (logisch vs. instanzspezifisch) und eine hohe Datenintegrität bei internen (z.B. Umsortieren) und externen (z.B. Einfügen von LLM-Code) Bearbeitungen sicherstellen.
- Ergebnis
- Ein interaktiver, visueller AST-Editor mit einem hochentwickelten Zustandsmanagement. Die Architektur bietet eine nahtlose Benutzererfahrung, bei der Layout-Anpassungen und Zustände (z.B. eingeklappte Knoten) auch bei komplexen Operationen wie Refactoring oder dem Mergen von extern modifiziertem Code intelligent erhalten bleiben. Das System ist durch ein flexibles JSON-Format persistent und interoperabel.
TODO: Nächste Schritte
- Fundament: ViewModel-Schicht und Stabile IDs einführen
- Beschreibung: Das Kernstück der neuen Architektur schaffen. Eine TVisualNodeViewModel-Klasse wird als Vermittler zwischen dem IAstNode-Modell und der TAuraNode-Ansicht eingeführt.
- Umsetzung:
- Jede TVisualNodeViewModel-Instanz erhält beim Erstellen eine einzigartige, permanente und strukturunabhängige TViewModelID (z.B. Int64).
- Der TAstToAuraNodeVisitor wird so umgebaut, dass er primär einen Baum aus ViewModel-Objekten erzeugt, welcher die Hierarchie des AST widerspiegelt.
- Zustandsverwaltung: Metadaten-System implementieren
- Beschreibung: Die getrennte Speicherung von logischen und instanzspezifischen Metadaten implementieren.
- Umsetzung:
- Logische Metadaten: Eine zentrale TDictionary<IAstNode, TLogicalMetadata> für Eigenschaften erstellen, die für alle Instanzen eines Knotens gelten (z.B. Farbkodierung).
- Instanz-Metadaten: Eine TDictionary<TViewModelID, TVisualInstanceMetadata> für Eigenschaften erstellen, die nur für eine bestimmte visuelle Instanz gelten (z.B. IsCollapsed, Position auf der Leinwand).
- Die Rendering-Logik anpassen, um beide Metadatentypen beim Zeichnen eines TAuraNode zu berücksichtigen.
- Persistenz: JSON-Serialisierung erweitern
- Beschreibung: Das Speichern und Laden des gesamten Editor-Zustands ermöglichen.
- Umsetzung:
- Einen Serialisierungsprozess entwerfen, der drei getrennte Bereiche in der JSON-Datei ablegt:
- Den reinen IAstNode-Baum.
- Die logischen Metadaten, verknüpft über eine temporäre ID des IAstNode.
- Die instanzspezifischen Metadaten, verknüpft über die stabile TViewModelID.
- Einen Serialisierungsprozess entwerfen, der drei getrennte Bereiche in der JSON-Datei ablegt:
- Interaktion: Grundlegende Editierbarkeit herstellen
- Beschreibung: Dem Benutzer erlauben, den AST-Graphen zu verändern (Knoten hinzufügen, löschen, umsortieren).
- Umsetzung:
- Das Command Pattern implementieren, bei dem jede Änderung eine Execute- und Unexecute-Methode hat (für Undo/Redo).
- Jeder Command ist dafür verantwortlich, sowohl das IAstNode-Modell als auch den TVisualNodeViewModel-Baum konsistent zu halten. Da die Metadaten an die stabilen IDs gekoppelt sind, bleiben sie bei diesen Operationen automatisch erhalten.
- Fortgeschrittene Interaktion: "Smart Paste" / Abgleich-Algorithmus
- Beschreibung: Das intelligente Einfügen von extern veränderten AST-Teilbäumen ermöglichen.
- Umsetzung:
- Einen "Diff & Merge"-Algorithmus entwickeln. Beim Einfügen vergleicht dieser den neuen AST-Teilbaum mit dem alten.
- Bei äquivalenten Knoten werden die bestehenden TVisualNodeViewModel-Instanzen (samt ihrer IDs und Metadaten) wiederverwendet, um den visuellen Zustand zu erhalten. Nur bei echten Änderungen oder neuen Knoten werden neue ViewModels mit neuen IDs erzeugt.
- Optionale Ansicht: Eindeutige Knoten-Visualisierung ("Graph"-Modus)
- Beschreibung: Den optionalen Modus implementieren, in dem jeder IAstNode nur einmal dargestellt wird.
- Umsetzung:
- Den TAstToAuraNodeVisitor um einen Modus erweitern. In diesem Modus führt er eine TDictionary<IAstNode, TVisualNodeViewModel>, um bereits erstellte ViewModels für einen IAstNode zu finden und wiederzuverwenden, anstatt neue zu erstellen. Stattdessen wird nur eine neue Verbindungslinie gezeichnet.