Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Code Folding: Implementierung in eigenem Editor (https://www.delphipraxis.net/204999-code-folding-implementierung-eigenem-editor.html)

hansklok 22. Jul 2020 10:32

Code Folding: Implementierung in eigenem Editor
 
Hallo,

ich bin grade dabei mir einen eigenen Code Editor zu schreiben. Ziel ist es, dass ich etwas dabei lerne und auf nichts vorgefertigtes zurückgreife. Was mache ich bisher? Ausgangspunkt ist ein Quelltext. Diesen splitte ich in ein Zeilen Array in einer TPaintBox Subklasse um den Text jeder einzelnen Zeile zu erhalten. Nun füge ich jede dieser Zeilen in ein weiteres EditorLines Array hinzu. EditorLines ist ein Array vom Datentyp EditorLine. Eine EditorLine hat einen Index (Verweis auf die Originale Codezeile im Zeilen Array), eine Eigenschaft IndentationLevel (Einrückungsgrad), die Boolean Eigenschaft Visible und die Methode Draw zum zeichnen der Zeile selbst. TPaintBox zeichnet immer nur die sichtbaren Zeilen (sichtbar meint, alles, was in die Abmessungen der TPaintBox passt), um Systemressourcen zu sparen. Soweit funktioniert das alles sehr gut.

Nun zum Thema: Nach ausführlicher Internetsuche, könnte ich keinen Beitrag zur Technik von Codefaltung (Code Folding) finden. Hat jemand Erfahrung damit und könnte die Technik dahinter erläutern? Wie Code Folding visuell funktioniert, ist mir natürlich klar, mich interessiert, wie man so etwas in den Editor implementieren könnte.

Freue mich auf Anregungen, Danke.

Benmik 22. Jul 2020 11:08

AW: Code Folding: Implementierung in eigenem Editor
 
Ich habe mir aus anderen Gründen dazu schon mal Gedanken gemacht. Mein bescheidener Erkenntnisstand ist, dass man dazu sicher erkennen muss, wann eine Prozedur/Funktion anfängt und aufhört, unter Beachtung von verschachtelten Unterprozeduren. Das geht meiner Meinung nach nicht ohne Anwendung von Delphi-Syntax und damit Anwendung eines Stacks. Und solche Sachen wie z.B.
Delphi-Quellcode:
asm
, die kein
Delphi-Quellcode:
begin
haben, muss man auch dabei berücksichtigen.

freimatz 22. Jul 2020 12:22

AW: Code Folding: Implementierung in eigenem Editor
 
und ohne dich mit Grammatiken zu beschäftigen wirst Du da weit, aber nie zum Ziel kommen. Das wäre denn ein eigenes Thema für eine Einarbeitung.
Wie wäre es mit dem editieren? Was mich wundert ist, dass Du TPaintBox nimmst. Das ist IMHO kein TWinControl und das kannst Du deswegen zum editieren gar nicht nehmen.

himitsu 22. Jul 2020 13:01

AW: Code Folding: Implementierung in eigenem Editor
 
Jo, Zeilen bringen nicht viel

Delphi-Quellcode:
if
a
=
b
then
showessage
(
'abc'
)
;
beep
;
Delphi-Quellcode:
if a = b then showessage('abc'); beep;



Als Text/String und da, in Bezug auf SourceCode/Pascal, mindestens die größten Teile der Syntax müssen zusammen und auch verschachtelt betrachtet werden

Kommentare (bis Zeilenende)
Blockkommentare
Strings
und das Befehlsende ;
sollten mindestens behandelt werden,

denn in
Delphi-Quellcode:
if s = 'then' {if} then ...
sollten nicht alle IF und THEN als "Befehl" betrachtet werden.


Wenn es jetzt nur ums Folding geht und man z.B. {$IFDEF} ignoriert, sowie Verschachtelte und Inline-Procedure als Generics,
dann könnte man den Rest recht einfach halten, also z.B. nur alle "Befehle" raussuchen die mit function/procedure/class function/class operator/usw. beginnen ... von hier, bis zum nächsten Befehl vorm nachfolgenden Funktionsbeginn, bzw. vorm "END.".

Benmik 22. Jul 2020 13:15

AW: Code Folding: Implementierung in eigenem Editor
 
Ich dachte an Stack, und ich glaube, Delphi macht das genauso. Für jeden Beginn - begin, for, while, Repeat usw. - wird etwas auf den Stack geschoben, für jedes end; wieder entfernt; ist der Stack leer, ist die Prozedur zuende. Da steckt der Teufel natürlich gewaltig im Detail.

himitsu 22. Jul 2020 13:57

AW: Code Folding: Implementierung in eigenem Editor
 
Zitat:

Zitat von Benmik (Beitrag 1470099)
Da steckt der Teufel natürlich gewaltig im Detail.

Jo, z.B. bei den nagelneuen Managed-Records ... das hauseigene Code-Folding der IDE kennt diese Syntax noch nicht und macht dann nicht das, was man erwartet. :stupid:

jaenicke 22. Jul 2020 14:39

AW: Code Folding: Implementierung in eigenem Editor
 
Zitat:

Zitat von Benmik (Beitrag 1470099)
Ich dachte an Stack, und ich glaube, Delphi macht das genauso. Für jeden Beginn - begin, for, while, Repeat usw. - wird etwas auf den Stack geschoben, für jedes end; wieder entfernt; ist der Stack leer, ist die Prozedur zuende. Da steckt der Teufel natürlich gewaltig im Detail.

Das kann man sich einfacher machen indem man das ganze durch rekursive Methoden kapselt. Dadurch landet alles automatisch auf dem Stack. Wie so etwas aussieht, kann man bei Castalia anschauen:
https://github.com/jacobthurman/Castalia-Delphi-Parser
Kurz gesagt geht man durch den Quelltext und unterscheidet jeweils welche Möglichkeiten es vom aktuellen Punkt aus gibt. Entweder findet man dann passenden Quelltext als nächstes und macht damit weiter oder man wirft einen Parserfehler.

Benmik 22. Jul 2020 14:46

AW: Code Folding: Implementierung in eigenem Editor
 
Beeindruckend. Vielleicht ein bisschen Overkill für einen Editor. Allein durch das Durchscrollen bekommt man aber schon einen Eindruck davon, was es alles zu berücksichtigen gilt. Und das scheint mir ziemlich viel.

himitsu 22. Jul 2020 17:11

AW: Code Folding: Implementierung in eigenem Editor
 
Wenn man sich ins neue LSP reinhängen könnte, dann hätte man eigentlich alles gleich fix und fertig und frei Haus.

Das ist im Grunde ein Codeparser/Lexer, der aus dem Quellcode einen Objektbaum erstellt,
also rekurzive Objekte, so wie man es z.B. von JSON- oder XML-DOMs kennt. (Document Object Model)

PS: auch die C <-> Delphi-Header-Converter von Emba nutzen das, um z.B. das iOS-SDK-Header ins Delphi zu bekommen.
Erstmal aus dem Quellcode (C++ bzw. Objective-C oder Pascal) den Baum erstellen
und dann aus dem Baum den Quellcode der jeweils anderen Sprache generieren.

Oder man nutzt das eben, um z.B. sich die Punkte zum Falten rauszusuchen oder damit den Code schön bunt zu bekommen oder für eine Codeformatierung
oder eben der Delphi-Compiler nutzt es, um unser Pascal aufzubereiten, um es quasi an andere Compiler weiterzureichen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:24 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