- Neues Dokument 07-DFM-FMX-Support.md: Format-Referenz, Extraktions-Strategie, DfmExtractor-Konzept - Neues Fixture MainForm.dfm: Verschachtelte Komponenten, Event-Handler (FormCreate, btnLoginClick, etc.) - Integration Guide erweitert: DfmExtractor-Implementierung (analog LiquidExtractor), Coding-Style-Hinweise - NodeKind-Mapping erweitert: DFM-Komponenten als component, Event-Handler als references, Verschachtelung als contains - Checklist: DFM/FMX von 'Zukunft' auf konkreten Plan (Phase 1b) hochgestuft - README aktualisiert: DFM/FMX-Support in Ziel, Inhalt und Grammar-Abschnitt aufgenommen
3.8 KiB
3.8 KiB
Checklist: Pascal/Delphi Support in CodeGraph
A) Plumbing (Infrastruktur)
npm install tree-sitter-pascalals Dependencysrc/types.ts:'pascal'zumLanguageUnion-Type hinzufügensrc/types.ts:DEFAULT_CONFIG.includeum'**/*.pas','**/*.dpr','**/*.dpk','**/*.lpr','**/*.dfm','**/*.fmx'erweiternsrc/extraction/grammars.ts: Grammar-Loaderpascal: () => require('tree-sitter-pascal')src/extraction/grammars.ts: Extension-Mapping.pas,.dpr,.dpk,.lpr,.dfm,.fmx→'pascal'src/extraction/grammars.ts: Display-Namepascal: 'Pascal / Delphi'src/extraction/tree-sitter.ts:LanguageExtractorfürpascalinEXTRACTORSMap
B) Node-Extraktion
unit/program/library→ NodeKindmoduledeclClass→ NodeKindclass(inkl. record, object)declIntf→ NodeKindinterfacedeclProc(top-level) → NodeKindfunctiondeclProc(in Klasse) → NodeKindmethod(inkl. constructor/destructor)declProp→ NodeKindpropertydeclField→ NodeKindfielddeclEnum→ NodeKindenumdeclEnumValue→ NodeKindenum_memberdeclConst→ NodeKindconstantdeclType(einfach) → NodeKindtype_alias
C) Edge-Extraktion
declUses→ EdgeKindimportsdeclClass.parent[0]→ EdgeKindextendsdeclClass.parent[1..]→ EdgeKindimplementsexprCall→ EdgeKindcallsexprDot+exprCall→ EdgeKindcalls(qualifiziert)TClass.Create→ EdgeKindinstantiates- Parent-Child Containment → EdgeKind
contains
D) Sichtbarkeit & Attribute
getVisibility:declSection→ public/private/protectedisStatic:kClassindeclProc→ truegetSignature: Parameter + Rückgabetyp extrahieren
E) Resolution
moduleName→unitName → fileIdMappinguses X;→ Unit-Node auflösenuses X in 'path'→ Datei direkt auflösen (Phase 2)- Call-Resolution: gleiche Unit → gleiche Klasse → uses-Units → global
F) Testing
- Fixtures in Test-Suite aufnehmen (
UAuth.pas,App.dpr,UTypes.pas) - Nodes: Anzahl + Namen verifizieren
- Edges: imports/extends/implements/calls prüfen
- Sichtbarkeiten prüfen
- Properties, Enums, Konstanten prüfen
G) Polishing
- Language in Supported-Languages-Dokumentation aufnehmen
- CLI-Hilfe / Config-Validierung aktualisieren
H) DFM/FMX Form-Dateien (Phase 1b)
DfmExtractor-Klasse insrc/extraction/tree-sitter.tsimplementieren (analogLiquidExtractor)- Routing in
extractFromSource():.dfm/.fmx→DfmExtractor - Komponenten als NodeKind
componentextrahieren (object <Name>: <Typ>) - Verschachtelung als EdgeKind
containsabbilden - Event-Handler (
OnClick = MethodName) alsUnresolvedReferencespeichern → EdgeKindreferences - Mehrzeilige Properties korrekt überspringen
inherited-Blöcke alscomponentbehandeln- DFM-Fixture (
MainForm.dfm) in Test-Suite aufnehmen - Resolution: Event-Handler-Namen zu Methoden in zugehöriger
.pas-Datei auflösen
I) Bekannte Einschränkungen (für spätere Phasen)
with-Statements (Phase 2): Verschleiern den Qualifier bei Aufrufen. Im MVP werden Calls innerhalb vonwith-Blöcken ohne Qualifier extrahiert..incInclude-Dateien (Optional): Enthalten Code-Fragmente, die per{$I filename}eingebunden werden. Parser liefert möglicherweise keinen vollständigen AST.- Class Helpers / Record Helpers (Phase 2):
declHelper-Knoten erweitern existierende Typen. Erfordert spezielle Resolution-Logik. - Generics (Phase 2):
typerefTplundgenericTplfür generische Typen.