![]() |
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. |
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:
, die kein
asm
Delphi-Quellcode:
haben, muss man auch dabei berücksichtigen.
begin
|
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. |
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:
sollten nicht alle IF und THEN als "Befehl" betrachtet werden.
if s = 'then' {if} then ...
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.". |
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.
|
AW: Code Folding: Implementierung in eigenem Editor
Zitat:
|
AW: Code Folding: Implementierung in eigenem Editor
Zitat:
![]() 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. |
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.
|
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 ![]() 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 13:17 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz