AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte Delphi-Parser mit Anwendung "Hyperlinked Browser for Ids and References"

Delphi-Parser mit Anwendung "Hyperlinked Browser for Ids and References"

Ein Thema von DenkDirNix · begonnen am 19. Apr 2020 · letzter Beitrag vom 26. Apr 2020
Antwort Antwort
DenkDirNix Online
Registriert seit: 13. Dez 2018
Moinsen,

ich habe ein altes Tool (aus 2003 für Delphi7) mal etwas aufgefrischt und suche jetzt neben freundlichen Kommentaren natürlich auch Nutzer (bzw. erstmal Tester).
Motivation war die Unzuverlässigkeit der IDE-Funktion "Referenzen suchen".

Was tut das Tool
  • Input ist ein übersetzbares Delphi-Projekt, eine Library oder Package. Die Entwicklung basiert auf dem Sprachumfang von Delphi 10.3.3, sollte aber in der Regel abwärtskompatibel sein. Es wird auch eine einzelne Unit oder eine Folge von Deklarationen akzeptiert.
  • Source-Files werden geparst und alle Elemente entsprechend der statischen Blockstruktur und Typ-gerecht in einen TreeView einsortiert. Elemente sind im wesentlichen die Identifier, aber auch Pascal-Direktiven und -Attribute, Compiler-Direktiven und -Schalter, Literale sowie falls gewünscht die Keywords.
  • Alle Referenzen (also textuelle Vorkommen) dieser Ids werden daneben als Liste von Code-Snippets angezeigt. Dazu der Referenz-Typ, also deklarierend, lesend, schreibend, weiterreichend. Alle Identifier in diesen Code-Snippets sind hyperlinked zum TreeView (per Rechts-Click).
  • Per DoppelClick öffnet man den FileViewer zur aktuellen Referenz, Identifier sind dort ebenfalls hyperlinked.

Regeln für Einordnung der Ids im Treeview
  • Variablen mit eindeutig zugeordnetem Speicher erhalten die gesamte Typ-Struktur kopiert
  • Zugriffe über Pointer (auch Klassen) sind nicht unbedingt eindeutig einer Variablen zuzuordnen. Sie landen deshalb unter dem zugehörigen Typ.

Nutzen
  • Zusätzlich zum üblichen funktionsbezogen-sequentiellen Blick auf die Anweisungen im Quellcode bekommt man schnellen Zugriff auf den "Lebenslauf" eines Ids, zum Beispiel eines propertys.
    Man stelle sich die Frage "Welche Ereignisse müssen sich auf dieses Property lesend/schreibend auswirken, ist das so in der Liste wiederzufinden, falls nein - warum nicht?"
    Im Idealfall beantwortet man sich diese Frage vorher im Kopf und vergleicht dann mit der programmierten Quellcode-Realität.
  • Filterung nach speziellen Nutzungen (z.B. ungenutzte Variablen, nur schreibende Zugriffe,...)
  • sieht hübsch aus
  • stört nicht bei der Arbeit

Specials
  • Units dürfen fehlen. Nicht deklarierte Elemente werden in einer <Unknown-unscoped>-Liste geführt.
    Natürlich ist solch ein Ergebnis nicht mehr exakt, trotzdem kann man idR damit arbeiten.
    -> Empfehlung: Ohne Nicht-Projekt-Units anfangen, soweit nötig dann hinzufügen (evtl als reduzierte Version).
    Grenzen wenn ein Identifier nicht deklariert ist:
    - fehlender type bei overload- und operator-Zuordnung
    - falsche Zuordnung zu Identifier gleichen Namens in äußerem Scope, auch zu System-Ids
    - dann gff auch falscher Referenz-Typ für Parameter
  • Ids aus System.pas sind rudimentär integriert, können nach Bedarf ergänzt werden.

Was geht noch nicht

- Allgemeiner Test-Status: siehe Datei _Versionen.txt
- $IF: nur einfache declared- und defined-Ausdrücke erlaubt ohne AND und OR. Das kann zu Parser-Fehlern oder auch falschen Zuordnungen führen!
- Generic-Types werden nicht unterschieden sondern alle unter dem Type-Namen eingetragen
- Unit-Gültigkeitsbereiche
- Lazarus, FreePascal, TurboPascal
- Auswertung dproj
- Projekt-Gruppen
- horizontales Scrollen im Source-Viewer (bitte erstmal F12 benutzen)
- typgerechte Zuordnung von generics, operatoren und overloads (letztere nur in export-clause)
- Exception-Behandlung
- Suche nach Ids die lokaler / weniger sichtbar deklariert werden können
- FileViewer -> Editor
- Identifier-Rename
- HotKey-Liste für Identifier und Referenzen
- Die Zuordnung zu overload-Methoden geschieht auch nach Kompatibilitätsregeln. Die sind mir noch nicht ganz klar.
- $Include-Files direkt nach Uses-Ende. WorkAround: Ein zweites Semikolon einfügen: "Uses UnitA, UnitB;;"
- Richtig viele Identifier überfordern den verwendeten Standard-TreeView. Umstellung kommt...
- Export der Ergebisse

Was geht noch nicht (und bleibt wohl auch so)

- $IF mit Berechnungen, insbesondere sizeOf()
- vollständig integrierte System.pas
- aktuelle Referenz in IDE öffnen

Wenn's nicht funktioniert...

- Syntaxfehler in der Quelle?
- $IF mit nicht-einfacher Bedingung?
- falsch oder nicht gesetzte Compiler-Defines ?
- sonst: bitte Hinweis zur Reproduzierbarkeit an mich

Anzeige und Bedienung

siehe Hilfe-Datei

Aktueller Download ist auch aus meiner DropBox möglich.
Miniaturansicht angehängter Grafiken
refpicmain.jpg   refpicoptions.jpg   refpicfiltered.jpg   refpicfilters.jpg  
Angehängte Dateien
Dateityp: zip _All in one.zip (1,13 MB, 4x aufgerufen)

Geändert von DenkDirNix (17. Mai 2020 um 08:02 Uhr) Grund: Fehler bei Compiler-Direktiven behoben.
 
DenkDirNix
Online

 
Delphi 10.3 Rio
 
#2
  Alt 26. Apr 2020, 12:07
Vielen Dank @Rainer und @Michael für die freundlichen und dezenten Hinweise auf den (vor)letzten Fehler im Parser. Es gibt doch Konstrukte in Object-Pascal von denen man nicht zu träumen wagte. Zum Beispiel:
Code:
- f( nil^ )                          // Aufruf zur Deklaration "function f( const aPara )"
- @@Methode                          // Adresse von Methoden
- raise ... at @pTry2;               // ist "at" Keyword oder Direktive?
- inherited                          // im record-constructor!
Das sollte jetzt funktionieren, im Anhang Version 0.9.0
Angehängte Dateien
Dateityp: zip Ref.zip (1,13 MB, 6x aufgerufen)

Geändert von DenkDirNix (27. Apr 2020 um 07:15 Uhr)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:49 Uhr.
Powered by vBulletin® Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2020 by Daniel R. Wolf