AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Code Folding: Implementierung in eigenem Editor

Ein Thema von hansklok · begonnen am 22. Jul 2020 · letzter Beitrag vom 22. Jul 2020
Antwort Antwort
hansklok

Registriert seit: 14. Apr 2004
Ort: Karlsruhe
318 Beiträge
 
Delphi 2010 Architect
 
#1

Code Folding: Implementierung in eigenem Editor

  Alt 22. Jul 2020, 11:32
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.
  Mit Zitat antworten Zitat
Benmik

Registriert seit: 11. Apr 2009
560 Beiträge
 
Delphi 12 Athens
 
#2

AW: Code Folding: Implementierung in eigenem Editor

  Alt 22. Jul 2020, 12:08
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. asm , die kein begin haben, muss man auch dabei berücksichtigen.

Geändert von Benmik (22. Jul 2020 um 13:15 Uhr)
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.456 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Code Folding: Implementierung in eigenem Editor

  Alt 22. Jul 2020, 13:22
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#4

AW: Code Folding: Implementierung in eigenem Editor

  Alt 22. Jul 2020, 14:01
Jo, Zeilen bringen nicht viel

Delphi-Quellcode:
if
a
=
b
then
showessage
(
'abc'
)
;
beep
;
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 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.".
$2B or not $2B

Geändert von himitsu (22. Jul 2020 um 14:08 Uhr)
  Mit Zitat antworten Zitat
Benmik

Registriert seit: 11. Apr 2009
560 Beiträge
 
Delphi 12 Athens
 
#5

AW: Code Folding: Implementierung in eigenem Editor

  Alt 22. Jul 2020, 14:15
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#6

AW: Code Folding: Implementierung in eigenem Editor

  Alt 22. Jul 2020, 14:57
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.
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Code Folding: Implementierung in eigenem Editor

  Alt 22. Jul 2020, 15:39
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.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Benmik

Registriert seit: 11. Apr 2009
560 Beiträge
 
Delphi 12 Athens
 
#8

AW: Code Folding: Implementierung in eigenem Editor

  Alt 22. Jul 2020, 15:46
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#9

AW: Code Folding: Implementierung in eigenem Editor

  Alt 22. Jul 2020, 18:11
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.
$2B or not $2B

Geändert von himitsu (22. Jul 2020 um 18:19 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort

 

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 03:40 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