|
@@ -2,53 +2,96 @@
|
|
|
|
|
|
|
|
## 0) Prämissen
|
|
## 0) Prämissen
|
|
|
|
|
|
|
|
-- CodeGraph extrahiert **Nodes** und **Edges** über **tree-sitter** und language-spezifische **Queries (`.scm`)**.
|
|
|
|
|
|
|
+- 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).
|
|
- Danach folgt **Reference Resolution** (Calls → Definitionen, imports → Dateien, inheritance, framework patterns).
|
|
|
|
|
+- **Grammar:** [`tree-sitter-pascal`](https://github.com/Isopod/tree-sitter-pascal) (unterstützt Delphi, FreePascal und Standard-Pascal).
|
|
|
|
|
|
|
|
## 1) Parser / Grammar
|
|
## 1) Parser / Grammar
|
|
|
|
|
|
|
|
-Empfohlen: `tree-sitter-pascal` (unterstützt Delphi + FreePascal).
|
|
|
|
|
|
|
+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:**
|
|
**Tasks:**
|
|
|
-- Dependency hinzufügen (wie bei bestehenden Sprachen).
|
|
|
|
|
-- Language-Loader/Registry erweitern: `languageId = "pascal"` (oder `"delphi"`, aber konsistent).
|
|
|
|
|
|
|
+- `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
|
|
## 2) File-Erkennung
|
|
|
|
|
|
|
|
Extensions (MVP):
|
|
Extensions (MVP):
|
|
|
- `.pas` (Units)
|
|
- `.pas` (Units)
|
|
|
-- `.dpr` (Program)
|
|
|
|
|
-- `.dpk` (Package)
|
|
|
|
|
|
|
+- `.dpr` (Delphi Program)
|
|
|
|
|
+- `.dpk` (Delphi Package)
|
|
|
- `.lpr` (Lazarus Program)
|
|
- `.lpr` (Lazarus Program)
|
|
|
|
|
|
|
|
-Optional:
|
|
|
|
|
-- `.inc` (Include-Fragmente) – erst später oder nur, wenn Parser tolerant genug ist.
|
|
|
|
|
|
|
+Optional (Phase 2):
|
|
|
|
|
+- `.inc` (Include-Fragmente) – erst später, da Parser möglicherweise keinen vollständigen AST liefert.
|
|
|
|
|
|
|
|
-## 3) Queries (MVP)
|
|
|
|
|
|
|
+## 3) Extraktion (MVP)
|
|
|
|
|
|
|
|
### 3.1 Nodes
|
|
### 3.1 Nodes
|
|
|
-Extrahiere mindestens:
|
|
|
|
|
-- Unit/Program/Package Name
|
|
|
|
|
-- Klassen / Interfaces / Records
|
|
|
|
|
-- Procedures/Functions
|
|
|
|
|
-- Methoden (class/instance)
|
|
|
|
|
|
|
+
|
|
|
|
|
+| 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
|
|
### 3.2 Edges
|
|
|
-Extrahiere mindestens:
|
|
|
|
|
-- `uses` (import/dependency)
|
|
|
|
|
-- `extends` (Basisklasse)
|
|
|
|
|
-- `implements` (Interface-Implementierungen)
|
|
|
|
|
-- `calls` (Identifier + optional Qualifier)
|
|
|
|
|
|
|
+
|
|
|
|
|
+| Beziehung | Erkennung | → CodeGraph `EdgeKind` |
|
|
|
|
|
+|---|---|---|
|
|
|
|
|
+| `uses X, Y;` | `declUses` → Kind-Knoten `identifier` | `imports` |
|
|
|
|
|
+| Klassen-Vererbung | `declClass` → `parent` Feld → erster `typeref` | `extends` |
|
|
|
|
|
+| Interface-Implementierung | `declClass` → `parent` Feld → weitere `typeref`s | `implements` |
|
|
|
|
|
+| Funktionsaufruf | `exprCall` | `calls` |
|
|
|
|
|
+| Qualifizierter Aufruf | `exprDot` als Elternteil von `exprCall` | `calls` |
|
|
|
|
|
+| Enthaltensein | Parent-Child im AST (z.B. `declClass` → `declProc`) | `contains` |
|
|
|
|
|
+| Instanziierung | `exprCall` mit `TClassName.Create` | `instantiates` |
|
|
|
|
|
|
|
|
## 4) Reference Resolution (MVP)
|
|
## 4) Reference Resolution (MVP)
|
|
|
|
|
|
|
|
### 4.1 Unit-Auflösung (`uses`)
|
|
### 4.1 Unit-Auflösung (`uses`)
|
|
|
-- Index-Phase: Map `UnitName -> fileId` (aus Units/Programs/Packages)
|
|
|
|
|
|
|
+- Index-Phase: Map `unitName → fileId` (aus `moduleName` Knoten in `unit`/`program`/`library`)
|
|
|
- Resolution: Bei `uses Foo, Bar;` Edges auf Ziel-Units setzen.
|
|
- Resolution: Bei `uses Foo, Bar;` Edges auf Ziel-Units setzen.
|
|
|
-- Spezialfälle (später): `Foo in 'path\Foo.pas'` (DPR/DPK), Namespaces (`System.SysUtils`).
|
|
|
|
|
|
|
+- Spezialfälle (Phase 2): `Foo in 'path\Foo.pas'` (DPR/DPK), Namespaces (`System.SysUtils`).
|
|
|
|
|
|
|
|
### 4.2 Call-Auflösung (best effort)
|
|
### 4.2 Call-Auflösung (best effort)
|
|
|
-- Extraktion: `callName`, optional `qualifier` (`Obj.DoIt`, `TMyClass.DoIt`)
|
|
|
|
|
|
|
+- Extraktion: Name aus `exprCall`, Qualifier aus `exprDot`
|
|
|
- Heuristik-Reihenfolge:
|
|
- Heuristik-Reihenfolge:
|
|
|
1. lokale Procs/Funcs in der gleichen Unit
|
|
1. lokale Procs/Funcs in der gleichen Unit
|
|
|
2. Methoden in der gleichen Klasse
|
|
2. Methoden in der gleichen Klasse
|
|
@@ -59,14 +102,17 @@ Extrahiere mindestens:
|
|
|
|
|
|
|
|
- Fixtures aus `fixtures/` in die Test-Suite aufnehmen
|
|
- Fixtures aus `fixtures/` in die Test-Suite aufnehmen
|
|
|
- Assertions:
|
|
- Assertions:
|
|
|
- - Node-Anzahl + zentrale Namen
|
|
|
|
|
- - `uses`-Edges
|
|
|
|
|
|
|
+ - Node-Anzahl + zentrale Namen prüfen
|
|
|
|
|
+ - `uses`-Edges (imports)
|
|
|
- `extends`/`implements`-Edges
|
|
- `extends`/`implements`-Edges
|
|
|
- einfache Call-Edges
|
|
- einfache Call-Edges
|
|
|
|
|
+ - Sichtbarkeiten (public/private/protected)
|
|
|
|
|
+ - Properties, Felder, Enums
|
|
|
|
|
|
|
|
## 6) Definition of Done
|
|
## 6) Definition of Done
|
|
|
|
|
|
|
|
-- `codegraph index` indexiert Delphi/ Pascal-Dateien ohne Crash
|
|
|
|
|
-- `codegraph_search` findet Klassen/Methoden
|
|
|
|
|
|
|
+- `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
|
|
- `codegraph_callers/callees` liefert sinnvolle Ergebnisse für einfache Fälle
|
|
|
- `uses`-Graph stimmt (Unit-Abhängigkeiten)
|
|
- `uses`-Graph stimmt (Unit-Abhängigkeiten)
|
|
|
|
|
+- Sichtbarkeiten werden korrekt extrahiert
|