Perl::LanguageServer & Debugger für Visual Studio Code u.a. Editoren

Begonnen von Risiko, 31 Dezember 2020, 14:02:43

Vorheriges Thema - Nächstes Thema

Risiko

Hallo Zusammen,

wollte mal nachfragen, wer diesen LanguageServer kennt und ihn (am Besten im Zusammenhang mit FHEM) im Einsatz hat.
Er wurde dieses Jahr auf dem 22. Deutscher Perl/Raku-Workshop vorgestellt.

Hier ein paar Links:
https://act.yapc.eu/gpw2020/talk/7706
https://www.fau.tv/clip/id/12891

https://github.com/richterger/Perl-LanguageServer
https://metacpan.org/pod/Perl::LanguageServer

Ich persönlich würde es sehr begrüßen, wenn man mit vscode entwickeln und debuggen könnte (OT: mit python geht das z.B. prima)
Leider bringt (jedenfalls bei mir) fhem.pl (und wahrscheinlich ein paar Module) den Parser aktuell zum abstürzen. Viele Module gehen aber.
Ich bin mit dem Entwickler bereits im Kontakt: https://rt.cpan.org/Public/Bug/Display.html?id=133979

Vielleicht hat ja jemand Lust, mit zu unterstützen?



Sidey

Hi,

ich habe mich daran auch schon versucht, es aber bisher nicht zum Laufen gekommen.
Wenn Du hier weiterkommst lass es mich bitte wissen.

Eventuell wäre es ja auch ein Lösungsweg komplett über die WSL zu entwickeln.
Da habe ich aber bisher noch das Problem mit den SSH Keys die nicht geladen werden.


Grüße Sidey
Signalduino, Homematic, Raspberry Pi, Mysensors, MQTT, Alexa, Docker, AlexaFhem

Maintainer von: SIGNALduino, fhem-docker, alexa-fhem-docker, fhempy-docker

StefanStrobel

Hallo,

fände ich auch interessant.
Ich bin schon vor einer Weile für die Entwicklung von ArduCounter mit PlatformIO auf vscode umgestiegen und nutze es seither auch für Perl / Fhem mit der Extension Perl 1.18.0. Dabei läuft im Hintergrund ctags.

Vermutlich würde der Language-Server noch etwas mehr bringen, aber auch so kann man schon elegant zur Definition von Variablen / Funktionen springen und hat alle anderen Vorteile von vscode mit integriertem Git (nutze ich als lokale Versionsverwaltung). Für die, die es mögen gibt es auch eine perlcritic-Extension.

Für das Testen nutze ich einen einfachen vscode Task, der perl fhem.pl -t mit dem gerade geöffneten Test-File aufruft und dann mit einem einfachen Problem-Matcher die Fehler sammelt, so dass man an die richtige Stelle im Code springen kann.
Ich finde das sehr komfortabel.

Gruss
   Stefan

Risiko

Leider reagiert der Entwickler des LanguageServers nicht. Bekomme leider kein Feedback mehr und so ist es jedenfalls für FHEM nicht nutzbar.
Einfachere Scripte gehen zwar, hilft nur nicht und mich selbst an den Server zu machen, habe ich keine Zeit.
Ich werde jetzt auch auch mal deinen Workflow probieren.
Danke dafür.

Sidey

Ich habe den LanguageServer zum laufen bekommen.

Aber nicht nativ unter Windows.
Das hat bei einigen anderen auch nicht geklappt.
Irgendwas ist da mit der AIO.dll.

Wenn Du unter Win10 ein Linux Subsystem aktivierst, kannst Du vscode mit WSL verbinden und dort den LangageServer installieren.
Das geht alles ohne besondere Konfigurationen heraus.

Der LanguageServer hilft einem aber nicht super viel wenn FHEM Module entwickelt werden, denn der Language Server bekommt die geöffnete Perl Datei und lässt sie compilieren.
Die diversen globalen Variablen sind da nicht definiert, da die in der fhem.pl hinterlegt sind und dadurch nicht eingebunden sind.

Auf Anhieb ist mir auch kein Mechanismus untergekommen, wie wir das lösen könnten.

Grüße Sidey
Signalduino, Homematic, Raspberry Pi, Mysensors, MQTT, Alexa, Docker, AlexaFhem

Maintainer von: SIGNALduino, fhem-docker, alexa-fhem-docker, fhempy-docker

Risiko

Danke für die Info.

Ich verwende Ubuntu mit perl 5.30 (alle Module über cpan aktualisiert) und da stürzt der Server beim Parsen von fhem.pl ab.
Zum debuggen komme ich gar nicht, was eigentlich mein Ziel ist.
Hatte die Hoffnung, in FHEM Modulen Haltepunkte setzen und debuggen zu können (so wie bei anderen Sprachen auch).

Deine Argumentation mit den globalen Variablen verstehe ich leider nicht, musst du sie eben bekannt machen.

Risiko.

Sidey

Ich hab das gestern mit FHEM.pl probiert.

Da stürzt erst einmal nichts ab.
Syntax Check funktioniert.


Mehr habe ich nicht untersucht, denn nach meinem Verständnis startet der Language Server Fhem.pl ohne weitere Parameter.
Ich habe auch versucht prove zu nutzen um zumindest gewisse Aktionen Steuern zu können, aber die Datei wird nicht als Parameter übergeben.

Vielleicht fehlt mir da jetzt auch einfach eine Idee wie das nützlich sein könnte, wenn ich ein Modul entwickele.

Der Syntax Check der FHEM Module klappt ja weiterhin nicht,
da die globalen Fhem Variablen in fhem.pl definiert sind.
Das lässt sich ja nicht in einem FHEM Modul mittels use einbinden.
Wenn es da Ideen gibt immer her damit.

Wenn Du eine FM bekommst kannst Du die ja mal teilen.
Bei der Installation vom Language Server gab es ein paar Schwierigkeiten mit Abhängigkeiten. Vielleicht hast Du die ja auch?

Grüße Sidey

Signalduino, Homematic, Raspberry Pi, Mysensors, MQTT, Alexa, Docker, AlexaFhem

Maintainer von: SIGNALduino, fhem-docker, alexa-fhem-docker, fhempy-docker

Risiko

Zitat von: Sidey am 30 Januar 2021, 10:48:47
Da stürzt erst einmal nichts ab.
Syntax Check funktioniert.

Ich habe auch nochmal alles neu installiert. Ja, die Abhängigkeiten, welche nicht selbst direkt aufgelöst werden, sind nervig. Aber leider keine Veränderung.
Viele Dateien\Module wie z.B. Blocking.pm, HttpUtils.pm, TcpServerUtils.pm,etc. werden erfolgreich analysiert. Syntax check geht.
Nur eben fhem.pl nicht. >:(

Welches OS und perl Version nutzt du?

Zitat von: Sidey am 30 Januar 2021, 10:48:47
Mehr habe ich nicht untersucht, denn nach meinem Verständnis startet der Language Server Fhem.pl ohne weitere Parameter.
Kannst du das nicht in der "launch.json" einstellen!?

Zitat von: Sidey am 30 Januar 2021, 10:48:47
Der Syntax Check der FHEM Module klappt ja weiterhin nicht,
da die globalen Fhem Variablen in fhem.pl definiert sind.
Das lässt sich ja nicht in einem FHEM Modul mittels use einbinden.
Wieso nicht. Z.B. use vars qw($readingFnAttributes);

Also wenn der Server nicht abschmiert  ;), funktioniert das doch soweit recht gut (Syntax check und Visualisierung\syntax highlighting - auch der Module :), Goto Definition, goto reference, IntelliSense, etc.)

Risiko


Sidey

Zitat von: Risiko am 30 Januar 2021, 15:54:59
Ich habe auch nochmal alles neu installiert. Ja, die Abhängigkeiten, welche nicht selbst direkt aufgelöst werden, sind nervig. Aber leider keine Veränderung.
Viele Dateien\Module wie z.B. Blocking.pm, HttpUtils.pm, TcpServerUtils.pm,etc. werden erfolgreich analysiert. Syntax check geht.

Kann ich leider nicht Bestätigen. Auch in Blocking.pm erhalte ich diese Fehler. Wie soll das denn auch gehen wenn blocking.pm an perl übergeben wird? Der ganze "FHEM" Kram im global Namespace ist doch unbekannt.

Hier ein Beispiel eines "Syntax Fehlers"

{
"resource": "/fhem/FHEM/Blocking.pm",
"owner": "_generated_diagnostic_collection_name_#0",
"severity": 8,
"message": "\t(Do you need to predeclare Log?)Global symbol \"%defs\" requires explicit package name (did you forget to declare \"my %defs\"?) at - line 47.",
"startLineNumber": 47,
"startColumn": 1,
"endLineNumber": 48,
"endColumn": 1
}


Zitat von: Risiko am 30 Januar 2021, 15:54:59
Nur eben fhem.pl nicht. >:(
Da bekomme ich keine Fehler, was auch zu erwarten ist, da die Syntax korrekt ist :)


Zitat von: Risiko am 30 Januar 2021, 15:54:59
Welches OS und perl Version nutzt du?

Ich habe es in einem Ubuntu WSL getestet.

Linux Thor 5.4.72-microsoft-standard-WSL2 #1 SMP Wed Oct 28 23:40:43 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

---

This is perl 5, version 30, subversion 0 (v5.30.0) built for x86_64-linux-gnu-thread-multi



Zitat von: Risiko am 30 Januar 2021, 15:54:59
Kannst du das nicht in der "launch.json" einstellen!?

Das weiss ich nicht. Die launch.json habe ich noch nicht verändert. Dachte dort werden nur für den Debugger Dinge konfiguriert.

Zitat von: Risiko am 30 Januar 2021, 15:54:59
Wieso nicht. Z.B. use vars qw($readingFnAttributes);

Du meinst alle fhem Variablen und Subs in das eigene Modul einfügen?
Ja das könnte ich, aber das würde dazu führen, dass die fhem Funktionen überschrieben werden, wenn das fhem Modul über fhem geladen wird.
Das finde ich nicht Zielführend. Vielleicht habe ich aber auch etwas übersehen.

Zitat von: Risiko am 30 Januar 2021, 15:54:59
Also wenn der Server nicht abschmiert  ;), funktioniert das doch soweit recht gut (Syntax check und Visualisierung\syntax highlighting - auch der Module :), Goto Definition, goto reference, IntelliSense, etc.)

Prinzipiell ja, aber der Syntax Check moniert ja schon z.B. ein fehlendes DevIo und sämtliche subs die in fhem.pl definiert sind.
Echte Fehler habe ich so noch nicht finden können.

Vielleicht reden wir auch von unterschiedlichen Dingen?
Wir reden von dem hier oder?
https://marketplace.visualstudio.com/items?itemName=richterger.perl

in Settings.json habe ich folgendes. Versuche perlCmd zu verändern brachten bislang keinen Erfolg.

    "perl.logLevel": 2,
    "perl.perlCmd": "",
    "perl.ignoreDirs": null,


Grüße Sidey
Signalduino, Homematic, Raspberry Pi, Mysensors, MQTT, Alexa, Docker, AlexaFhem

Maintainer von: SIGNALduino, fhem-docker, alexa-fhem-docker, fhempy-docker

Risiko

Denke auch, wir reden etwas aneinander vorbei  ;)
Ich verstehe nicht, warum du das Modul zur Prüfung unbedingt selbst mit perl aufrufen willst.
Das macht doch der Server für dich und das fast instantan (nach dem Tippen von Quellcode) und man bekommt rot unterstrichen die Fehlerstellen angezeigt.
Oder willst du die Parameter für die Prüfung selbst festlegen können  - der Server ruft glaube nur perl -c auf.
Öffnest du eine einzelne Datei oder einen Folder ?

Du kannst in der json-Datei auch eigene Kommandos platzieren und dann perl mit irgendwas aufrufen. Ist aber meiner Meinung nach nicht Sinn der Sache.

Da ich es aktuell nicht zum laufen bekomme und auch keine Idee habe, woran es liegen kann, gebe ich erstmal auf.

Risiko


Sidey

Du hast mich da auf was gebracht.

Da gibt es zwei Aspekte mit dem Language Server.

(1)
Der eine Teil ist der Syntax Check und dafür wird die geöffnete Datei. Also z.B. ein FHEM Modul mit perl aufgerufen.
Der Syntaxcheck bricht schon früh ab, wenn zum Beispiel ein Compile Fehler vorliegt. Das passiert wenn man use DevIo; verwendet.
Bis da hin werden Syntaxfehler auch gefunden, aber danach natürlich nicht mehr.

Daher bin ich der Meinung, dass man irgendwie fhem.pl laufen lassen muss und darin das Modul starten.


(2)
Mit dem Debugger hatte ich mich nicht näher beschäftigt. Du hast mich aber hier auf eine Idee gebracht.
Ich habe mir in der launch.json einen Eintrag hinterlegt um fhem mit einen Testfile zu starten:

        {
            "type": "perl",
            "request": "launch",
            "name": "FHEM-Test",
            // "cwd":  "/test-fhem/app/",
            "program": "/test-fhem/app/fhem.pl",
            "args": ["-t","${workspaceFolder}/${relativeFile}"],
            "stopOnEntry": false,
            "reloadModules": true
        }


Und da kann ich jetzt debuggen und breakpoints setzen.
Was leider nicht funktioniert hat ist cwd setzen. Das hat leider keine Auswirkung und cwd ist damit wohl der workspacefolder und nicht dort wo fhem läuft was sich auf den modpath auswirkt wenn das Attribut mit "." definiert ist.

Ob sich da noch was findet wird sich wohl zeigen.

Grüße Sidey 
Signalduino, Homematic, Raspberry Pi, Mysensors, MQTT, Alexa, Docker, AlexaFhem

Maintainer von: SIGNALduino, fhem-docker, alexa-fhem-docker, fhempy-docker