|
|
@@ -0,0 +1,119 @@
|
|
|
+# Tree-sitter Query Skizzen (Pascal/Delphi)
|
|
|
+
|
|
|
+Diese Skizzen sind bewusst so geschrieben, dass du sie schnell an die **konkreten Node-Namen** von `tree-sitter-pascal` und die **Capture-Konvention** von CodeGraph anpassen kannst.
|
|
|
+
|
|
|
+> Praxis-Tipp: Nutze `tree-sitter parse` bzw. Editor-Tools (z.B. Neovim `:InspectTree`) um die exakten Node-Typen im AST zu sehen.
|
|
|
+
|
|
|
+## A) Nodes
|
|
|
+
|
|
|
+### 1) Unit / Program / Package
|
|
|
+
|
|
|
+- Match: `unit`/`program`/`library`/`package` header
|
|
|
+- Extrahiere Name
|
|
|
+
|
|
|
+Skizze:
|
|
|
+
|
|
|
+```scm
|
|
|
+; (unit_header name: (identifier) @NAME) @NODE
|
|
|
+; (#set! "kind" "unit")
|
|
|
+
|
|
|
+; (program_header name: (identifier) @NAME) @NODE
|
|
|
+; (#set! "kind" "program")
|
|
|
+```
|
|
|
+
|
|
|
+### 2) Klassen / Interfaces / Records
|
|
|
+
|
|
|
+Skizze:
|
|
|
+
|
|
|
+```scm
|
|
|
+; (type_declaration
|
|
|
+; (type_definition
|
|
|
+; name: (identifier) @TYPE_NAME
|
|
|
+; value: (class_type) @CLASS
|
|
|
+; )
|
|
|
+; )
|
|
|
+
|
|
|
+; (type_definition name: (identifier) @TYPE_NAME value: (interface_type) @IFACE)
|
|
|
+; (type_definition name: (identifier) @TYPE_NAME value: (record_type) @REC)
|
|
|
+```
|
|
|
+
|
|
|
+### 3) Procs/Funcs (top-level)
|
|
|
+
|
|
|
+```scm
|
|
|
+; (procedure_declaration name: (identifier) @NAME) @NODE
|
|
|
+; (#set! "kind" "procedure")
|
|
|
+
|
|
|
+; (function_declaration name: (identifier) @NAME) @NODE
|
|
|
+; (#set! "kind" "function")
|
|
|
+```
|
|
|
+
|
|
|
+### 4) Methoden
|
|
|
+
|
|
|
+Je nach Grammar sind Methoden oft als procedure/function nodes innerhalb eines `class_body` oder `visibility_section` enthalten.
|
|
|
+
|
|
|
+```scm
|
|
|
+; (method_declaration name: (identifier) @NAME) @NODE
|
|
|
+; (#set! "kind" "method")
|
|
|
+; optional: capture class name via ancestor match (wenn CodeGraph das unterstützt)
|
|
|
+```
|
|
|
+
|
|
|
+## B) Edges
|
|
|
+
|
|
|
+### 1) uses (imports/dependencies)
|
|
|
+
|
|
|
+```scm
|
|
|
+; (uses_clause (qualified_identifier) @UNIT_NAME) @EDGE
|
|
|
+; (#set! "kind" "imports")
|
|
|
+```
|
|
|
+
|
|
|
+### 2) extends (Basisklasse)
|
|
|
+
|
|
|
+```scm
|
|
|
+; (class_type
|
|
|
+; base_class: (qualified_identifier) @BASE
|
|
|
+; ) @EDGE
|
|
|
+; (#set! "kind" "extends")
|
|
|
+```
|
|
|
+
|
|
|
+### 3) implements (Interfaces)
|
|
|
+
|
|
|
+```scm
|
|
|
+; (class_type
|
|
|
+; implements: (interface_list (qualified_identifier) @IFACE)
|
|
|
+; ) @EDGE
|
|
|
+; (#set! "kind" "implements")
|
|
|
+```
|
|
|
+
|
|
|
+### 4) calls (Call-Graph)
|
|
|
+
|
|
|
+Du willst in Delphi mindestens folgende Formen sehen:
|
|
|
+- `Foo()`
|
|
|
+- `Obj.Foo()`
|
|
|
+- `TMyClass.Foo()`
|
|
|
+
|
|
|
+Skizze:
|
|
|
+
|
|
|
+```scm
|
|
|
+; (call_expression
|
|
|
+; function: (identifier) @CALLEE
|
|
|
+; ) @EDGE
|
|
|
+; (#set! "kind" "calls")
|
|
|
+
|
|
|
+; (call_expression
|
|
|
+; function: (qualified_identifier
|
|
|
+; qualifier: (identifier) @QUAL
|
|
|
+; name: (identifier) @CALLEE)
|
|
|
+; ) @EDGE
|
|
|
+; (#set! "kind" "calls")
|
|
|
+```
|
|
|
+
|
|
|
+## C) MVP: „Contains“-Edges
|
|
|
+
|
|
|
+Optional, aber oft sehr nützlich: Datei/Unit enthält Klassen/Procs.
|
|
|
+
|
|
|
+```scm
|
|
|
+; (type_definition name: (identifier) @CHILD) @EDGE
|
|
|
+; (#set! "kind" "contains")
|
|
|
+```
|
|
|
+
|
|
|
+Das ist abhängig davon, wie CodeGraph containment modelliert.
|