01-Implementation-Plan.md 4.8 KB

Implementation Plan: Pascal/Delphi in CodeGraph

0) Prämissen

  • CodeGraph extrahiert Nodes und Edges über tree-sitter und eine LanguageExtractor-Konfiguration pro Sprache in src/extraction/tree-sitter.ts.
  • Sprachen werden zentral in drei Dateien registriert: grammars.ts, types.ts, und tree-sitter.ts.
  • Danach folgt Reference Resolution (Calls → Definitionen, imports → Dateien, inheritance, framework patterns).
  • Grammar: tree-sitter-pascal (unterstützt Delphi, FreePascal und Standard-Pascal).

1) Parser / Grammar

npm-Paket: tree-sitter-pascal

Konkrete AST-Knoten (Auswahl):

tree-sitter-pascal Typ Beschreibung
unit, program, library Top-Level-Module
moduleName Name des Moduls (Kind-Knoten von unit/program/library)
declClass Klassen, Records, Objects (enthält kClass/kRecord/kObject)
declIntf Interfaces (kInterface/kDispInterface)
declProc Procedures, Functions, Methods, Constructors, Destructors
declProp Properties
declField Felder in Klassen/Records
declEnum Aufzählungstypen
declEnumValue Einzelne Enum-Werte
declType Type-Deklarationen (enthält declClass/declIntf/declEnum/etc.)
declUses uses-Klauseln (imports)
declConst Konstanten-Deklarationen
declSection Sichtbarkeitsbereiche (kPrivate/kPublic/kProtected/kPublished)
declHelper Class/Record Helpers
declExports exports-Klauseln
defProc Implementations-Body einer Prozedur/Funktion
exprCall Funktionsaufrufe
exprDot Qualifizierte Zugriffe (Obj.Method)
declArgs Parameterliste
declArg Einzelner Parameter

Tasks:

  • tree-sitter-pascal als npm-Dependency hinzufügen
  • Grammar-Loader in src/extraction/grammars.ts registrieren: pascal: () => require('tree-sitter-pascal')
  • Extension-Mapping und Language-Typ anlegen (siehe Integration Guide)

2) File-Erkennung

Extensions (MVP):

  • .pas (Units)
  • .dpr (Delphi Program)
  • .dpk (Delphi Package)
  • .lpr (Lazarus Program)

Optional (Phase 2):

  • .inc (Include-Fragmente) – erst später, da Parser möglicherweise keinen vollständigen AST liefert.

3) Extraktion (MVP)

3.1 Nodes

Delphi-Konzept tree-sitter Typ → CodeGraph NodeKind
Unit / Program / Library unit / program / library module
Klasse / Record / Object declClass class
Interface declIntf interface
Procedure / Function (top-level) declProc (mit kProcedure/kFunction) function
Methode / Constructor / Destructor declProc (mit kConstructor/kDestructor, oder innerhalb declClass) method
Property declProp property
Feld declField field
Enum declEnum enum
Enum-Wert declEnumValue enum_member
Type-Alias declType (einfache Alias-Formen) type_alias
Konstante declConst constant
Uses-Klausel declUses import

3.2 Edges

Beziehung Erkennung → CodeGraph EdgeKind
uses X, Y; declUses → Kind-Knoten identifier imports
Klassen-Vererbung declClassparent Feld → erster typeref extends
Interface-Implementierung declClassparent Feld → weitere typerefs implements
Funktionsaufruf exprCall calls
Qualifizierter Aufruf exprDot als Elternteil von exprCall calls
Enthaltensein Parent-Child im AST (z.B. declClassdeclProc) contains
Instanziierung exprCall mit TClassName.Create instantiates

4) Reference Resolution (MVP)

4.1 Unit-Auflösung (uses)

  • Index-Phase: Map unitName → fileId (aus moduleName Knoten in unit/program/library)
  • Resolution: Bei uses Foo, Bar; Edges auf Ziel-Units setzen.
  • Spezialfälle (Phase 2): Foo in 'path\Foo.pas' (DPR/DPK), Namespaces (System.SysUtils).

4.2 Call-Auflösung (best effort)

  • Extraktion: Name aus exprCall, Qualifier aus exprDot
  • Heuristik-Reihenfolge:
    1. lokale Procs/Funcs in der gleichen Unit
    2. Methoden in der gleichen Klasse
    3. Units aus uses
    4. globaler Fallback nach Name

5) Tests

  • Fixtures aus fixtures/ in die Test-Suite aufnehmen
  • Assertions:
    • Node-Anzahl + zentrale Namen prüfen
    • uses-Edges (imports)
    • extends/implements-Edges
    • einfache Call-Edges
    • Sichtbarkeiten (public/private/protected)
    • Properties, Felder, Enums

6) Definition of Done

  • codegraph index indexiert Delphi/Pascal-Dateien ohne Crash
  • codegraph_search findet Klassen/Methoden/Properties
  • codegraph_callers/callees liefert sinnvolle Ergebnisse für einfache Fälle
  • uses-Graph stimmt (Unit-Abhängigkeiten)
  • Sichtbarkeiten werden korrekt extrahiert