Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Die Delphi-IDE (https://www.delphipraxis.net/62-die-delphi-ide/)
-   -   Select Methode From Unit Where Unit.name starting with "abc" and methode.1tePar... (https://www.delphipraxis.net/186656-select-methode-unit-where-unit-name-starting-abc-methode-1tepar.html)

bepe 20. Sep 2015 11:48

Select Methode From Unit Where Unit.name starting with "abc" and methode.1tePar...
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

ich spiele derzeit mal wieder mit OTA rum und dabei ist mir so ein lustiges Interfaces über den Weg gelaufen: IOTACodeQueryServices

Der erste Gedanke: Wie, SQL Select-Statements auf meinen Quelltext abfeuern? Und ja, das funktioniert tatsächlich (naja...). Scheinbar wurde für die Castalia Toolbar ein Parser hinzugefügt, welcher einen abgespeckten Tokenstream in einer SQLite3 DB ablegt.

Bisher habe ich eine Tabelle "symbols" und zwei Views(?) "types" (select * from symbols where symbol_type = 1) und "modules" (select * from symbols where symbol_type = 0) gefunden. Aufgebaut ist die Tabelle wie folgt:

Code:
id: Integer;
symbol_type: Integer;
symbol_subtype: Integer;
parent_id: Integer;
name: String;
qualified_name: String;
start_line: Integer;
start_col: Integer;
end_line: Integer;
end_col: Integer;
attributes: TStrings
Da ich mir noch nicht im klaren darüber bin ob und was ich damit anfangen soll, habe ich einfach mal, für Interessierte, ein kleines Spielprojekt zusammen geschustert. Das angehängte Projekt erzeugen und installieren. Dann findet ihr im Delphimenü unter "Hilfe->Hilfe-Experten" den Eintrag "sqlSearch", welcher ein kleines Suchfenster öffnet.

In das Edit ein Suchbegriff eingeben und Enter. Ein Doppelklick in der Liste öffnet die Fundstelle. Der Suchbegriff ist so aufgebaut:

Code:
[gesuchter Typ:]Suchbegriff[;type:suchbegriff][;module:suchbegriff]

gesucherter Typ:
   alias         : symbol_type = 1   symbole_subtype = 0
   pointer         : symbol_type = 1   symbole_subtype = 1
   classdef      : symbol_type = 1   symbole_subtype = 2
   record         : symbol_type = 1   symbole_subtype = 3
   set            : symbol_type = 1   symbole_subtype = 4
   array         : symbol_type = 1   symbole_subtype = 5
   proctype      : symbol_type = 1   symbole_subtype = 6
   forward         : symbol_type = 1   symbole_subtype = 7
   enumtype      : symbol_type = 1   symbole_subtype = 8
   intf         : symbol_type = 1   symbole_subtype = 9
   classref      : symbol_type = 1   symbole_subtype = 10
   
   func         : symbol_type = 2   symbole_subtype = 0
   proc         : symbol_type = 2   symbole_subtype = 1
   construct      : symbol_type = 2   symbole_subtype = 2
   destruct      : symbol_type = 2   symbole_subtype = 3
   procdef         : symbol_type = 2   symbole_subtype = 4
   
   classfield      : symbol_type = 3   symbole_subtype = 0
   localvar      : symbol_type = 3   symbole_subtype = 1
   procvar         : symbol_type = 3   symbole_subtype = 2
   enumval         : symbol_type = 3   symbole_subtype = 3
   var            : symbol_type = 3   symbole_subtype = 4
   const         : symbol_type = 3   symbole_subtype = 5
   
z.B.
   array:test                        // suche alle Arrays deren Name "test" enthält
   proc:test                        // suche alle Prozeduren deren Name "test" enthält
   proc:test;type:basis               // suche alle Prozeduren deren Name "test" enthält, welche zu einem Typ gehören deren name "basis" enthält
   proc:test;module:gui               // durchsuche alle Module, welche "gui" im Namen enthalten, nach einer Prozedur welche "test" im Namen enthält
   proc:test;type:basis;module:gui         // Tja, liebe Kinder und Kinderinnen; das heraus zu finden ist eure Hausaufgabe...
   
   // auch das klappt
   test                           // finde alle Symbole welche.. ihr ahnt es schon....
   test;module:gui                     // alles wie erwartet...
Und nochmal: Das ist auf die Schnelle entstanden. Nicht schön. Ich gebe keine Funktions- aber eine Fehlergarantie. Verbesserungsvorschläge bzgl. Quelltext werden gekonnt ignoriert. Ideen und Beispiele was man ggf. mit dem Interface anfangen könnte, werden dankent zur Kenntnis genommen.

Evtl. klappt das ganze ab XE8. Aber da DX10 rauskam bevor ich mir die XE8 Demo ansehen konnte... Mit XE7 klappt nicht, mit DX10 klappt.

Viel Spaß.

Daniel 20. Sep 2015 12:30

AW: Select Methode From Unit Where Unit.name starting with "abc" and methode.1tePar..
 
Spannende Sache - Danke für's herausfinden und testen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:52 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz