CodeGraph verwendet keine .scm-Query-Dateien für die Extraktion. Stattdessen wird die Logik über ein LanguageExtractor-Objekt in src/extraction/tree-sitter.ts definiert. Dieses Objekt mappt tree-sitter AST-Knotentypen auf die interne Verarbeitungslogik.
| Datei | Änderung |
|---|---|
src/extraction/grammars.ts |
Grammar-Loader, Extension-Mapping, Display-Name |
src/types.ts |
Language-Union-Type, DEFAULT_CONFIG.include Patterns |
src/extraction/tree-sitter.ts |
EXTRACTORS-Map mit LanguageExtractor-Konfiguration |
Die Konfiguration definiert, welche AST-Knotentypen welcher Semantik entsprechen:
interface LanguageExtractor {
functionTypes: string[]; // Top-Level Funktionen/Prozeduren
classTypes: string[]; // Klassen, Records, Objects
methodTypes: string[]; // Methoden, Konstruktoren, Destruktoren
interfaceTypes: string[]; // Interfaces
structTypes: string[]; // Structs (in Delphi: leer)
enumTypes: string[]; // Enums
typeAliasTypes: string[]; // Type-Aliase
importTypes: string[]; // uses-Klauseln
callTypes: string[]; // Funktionsaufrufe
variableTypes: string[]; // Variable/Feld-Deklarationen
nameField: string; // AST-Feld für den Namen
bodyField: string; // AST-Feld für den Body
paramsField: string; // AST-Feld für Parameter
returnField?: string; // AST-Feld für Rückgabetyp
getSignature?: (node, source) => string | undefined;
getVisibility?: (node) => 'public' | 'private' | 'protected' | 'internal' | undefined;
isExported?: (node, source) => boolean;
isStatic?: (node) => boolean;
isConst?: (node) => boolean;
}
| LanguageExtractor-Feld | tree-sitter-pascal Typ(en) | Anmerkung |
|---|---|---|
functionTypes |
['declProc'] |
Top-Level, gefiltert nach Kontext (kein Parent declClass) |
classTypes |
['declClass'] |
Enthält class, record, object |
methodTypes |
['declProc'] |
Innerhalb declClass, inkl. constructor/destructor |
interfaceTypes |
['declIntf'] |
interface, dispinterface |
structTypes |
[] |
Records werden über declClass (mit kRecord) abgedeckt |
enumTypes |
['declEnum'] |
Innerhalb von declType |
typeAliasTypes |
['declType'] |
Einfache type X = Y Deklarationen |
importTypes |
['declUses'] |
uses-Klauseln |
callTypes |
['exprCall'] |
Funktions-/Methodenaufrufe |
variableTypes |
['declField', 'declConst'] |
Felder und Konstanten |
nameField |
'name' |
declProc, declConst, declField, declEnumValue haben name-Feld |
bodyField |
'body' |
Nur bei defProc (Implementierungen) |
paramsField |
'args' |
declProc hat args-Feld (declArgs) |
returnField |
'type' |
declProc hat optionales type-Feld |
declProc wird sowohl für Top-Level-Funktionen als auch für Methoden verwendet. Die Unterscheidung erfolgt über den Kontext:
interface (der Unit-interface-Abschnitt) oder implementationdeclClass oder declIntfkProcedure, kFunction, kConstructor, oder kDestructorDelphi gruppiert Mitglieder in Sichtbarkeitsbereichen:
declClass → declSection (kPublic) → declProc, declField, declProp
→ declSection (kPrivate) → declField
Die getVisibility-Funktion muss den nächsten declSection-Vorfahren inspizieren.
declClass hat ein parent-Feld mit einer Liste von typeref-Knoten:
typeref ist typischerweise die Basisklasse (extends)typerefs sind implementierte Interfaces (implements)with-Statements (Phase 2)with-Statements erzeugen einen impliziten Scope, der Call-Qualifier verschleiert:
with MyObj do
DoSomething; // ist eigentlich MyObj.DoSomething
Im MVP wird dies nicht aufgelöst – Calls innerhalb von with werden ohne Qualifier extrahiert.
Delphi-Unit-Namen können Punkte enthalten (System.SysUtils). Der moduleName-Knoten enthält den vollständigen Namen. Die Resolution muss sowohl exakte Matches als auch Suffix-Matches unterstützen.