====== pasls — Eigene Patches ======
Dokumentation aller Änderungen am [[https://github.com/castle-engine/pascal-language-server|pascal-language-server]] Repository, die für die WvdS FPC Extension-Suite benötigt werden.
Diese Patches sind **nicht upstream** und müssen nach jedem ''git pull'' des Upstream-Repos erneut angewandt werden.
===== Übersicht =====
**Repository:** ''D:\Workspace\3rd\pascal-language-server''
**Upstream:** ''castle-engine/pascal-language-server'' (GitHub)
**Geänderte Dateien:**
| Datei | Änderungen | Beschreibung |
^ ''server/pasls.lpr'' | +6 Zeilen | 3 neue Dispatch-Einträge |
^ ''server/uinitialize.pas'' | +9 Zeilen | 3 neue Server-Capabilities |
^ ''server/utextdocument.pas'' | +598 Zeilen | 3 LSP-Handler + 5 Hilfsfunktionen, 1 uses-Erweiterung |
===== Patch 1: textDocument/hover =====
//Datum: 2026-03-02//
==== Motivation ====
pasls lieferte keine Hover-Informationen. Die Extension musste ''textDocument/definition'' als Workaround nutzen und konnte nur die rohe Quellcodezeile an der Deklarationsstelle anzeigen — ohne Sichtbarkeit, Klassenname oder vollständige Signatur.
Lazarus IDE nutzt CodeTools ''FindSmartHint'' → ''ExtractProcHead'' für formatierte Signaturen. Diese Infrastruktur ist in pasls über CodeToolBoss verfügbar, war aber nicht angebunden.
==== Änderungen ====
**pasls.lpr** — Dispatch-Eintrag:
else if Request.Method = 'textDocument/hover' then
TextDocument_Hover(Rpc, Request)
**uinitialize.pas** — Capability:
Writer.Key('hoverProvider');
Writer.Bool(true);
**utextdocument.pas** — Handler + Hilfsfunktionen:
| Prozedur/Funktion | Zweck |
^ ''TextDocument_Hover'' | LSP-Handler: ''FindSmartHint'' → Signatur + ''GetPasDocComments'' → Dokumentation |
^ ''ExtractPasDocText'' | Liest Kommentar-Text aus ''PCodeXYPosition''-Liste, entfernt Delimiter ''(**'', ''*)'', ''{**'', ''}'' |
^ ''FindMatchingParen'' | Hilfsfunktion für verschachtelte Klammern in PasDoc-Tags |
^ ''FormatPasDocAsMarkdown'' | Parst ''@abstract'', ''@param'', ''@returns'', ''@raises'' in Markdown |
==== CodeTools-API ====
TextDocument_Hover
├── ParseCompletionRequest(Request.Reader) → URI + Position
├── CodeToolBoss.FindFile(FileName) → TCodeBuffer
├── CodeToolBoss.InitCurCodeTool(Code)
├── CurCodeTool.FindSmartHint(CurPos) → "procedure TClass.Method(Params): Type\nFile(Line,Col)"
├── CodeToolBoss.GetPasDocComments(Code,X,Y) → TFPList von PCodeXYPosition
│ └── ExtractPasDocText(Code, Positions) → Roher Kommentartext
│ └── FormatPasDocAsMarkdown(Raw) → Markdown mit Tags
└── LSP Hover Response: { contents: { kind: "markdown", value: "..." } }
==== Response-Format ====
```pascal
private procedure TMyClass.DoSomething(const Value: Integer): Boolean
`` `
---
Beschreibung aus PasDoc-Kommentar.
*Parameters:*
- **`Value`** — Wert zum Prüfen
*Returns:* True wenn gültig
---
*Source:* `MyUnit.pas(42,5)`
===== Patch 2: textDocument/references =====
//Datum: 2026-03-01//
==== Motivation ====
Find All References (''Shift+F12'') war als "Geplant" markiert. CodeTools bietet ''FindReferences'' über ''TFindIdentifierReferenceCache'' + ''CTUnitGraph''.
==== Änderungen ====
**pasls.lpr** — Dispatch-Eintrag:
else if Request.Method = 'textDocument/references' then
TextDocument_References(Rpc, Request)
**uinitialize.pas** — Capability:
Writer.Key('referencesProvider');
Writer.Bool(true);
**utextdocument.pas** — Handler + Shared Helpers:
| Prozedur/Funktion | Zweck |
^ ''TextDocument_References'' | LSP-Handler: ''FindReferences'' über Workspace-Dateien, gibt ''Location[]'' zurück |
^ ''WriteRange'' | Shared Helper: Schreibt LSP Range-Object ''{ start: {line,character}, end: {line,character} }'' |
^ ''GetIdentLenAtPos'' | Shared Helper: Ermittelt Identifier-Länge an Position für Range-Berechnung |
==== CodeTools-API ====
TextDocument_References
├── ParseCompletionRequest → URI + Position
├── CodeToolBoss.FindFile → TCodeBuffer
├── TFindIdentifierReferenceCache.Create
├── CodeToolBoss.FindReferencesInFiles(Dateien, Cache)
│ └── Iteriert über Workspace-Dateien via CTUnitGraph
└── LSP Response: Location[] mit { uri, range }
==== uses-Erweiterung ====
// Vorher:
uses ... CustomCodeTool, udebug, uutils, ULogVSCode;
// Nachher:
uses ... CustomCodeTool, CTUnitGraph, udebug, uutils, ULogVSCode, CastleLsp;
''CTUnitGraph'' wird für Workspace-weite Dateisuche benötigt, ''CastleLsp'' für ''TRpcResponse''-Typen.
===== Patch 3: textDocument/documentHighlight =====
//Datum: 2026-03-01//
==== Motivation ====
Document Highlight hebt automatisch alle Vorkommen eines Identifiers in der aktuellen Datei hervor. Nutzt dieselbe ''FindReferences''-Infrastruktur wie Patch 2, aber beschränkt auf eine einzelne Datei.
==== Änderungen ====
**pasls.lpr** — Dispatch-Eintrag:
else if Request.Method = 'textDocument/documentHighlight' then
TextDocument_DocumentHighlight(Rpc, Request)
**uinitialize.pas** — Capability:
Writer.Key('documentHighlightProvider');
Writer.Bool(true);
**utextdocument.pas** — Handler:
| Prozedur/Funktion | Zweck |
^ ''TextDocument_DocumentHighlight'' | LSP-Handler: ''FindReferences'' auf aktuelle Datei, gibt ''DocumentHighlight[]'' zurück |
Nutzt die Shared Helpers ''WriteRange'' und ''GetIdentLenAtPos'' aus Patch 2.
===== Build-Anleitung =====
# 1. Kompilieren
cd D:\Workspace\3rd\pascal-language-server\server
C:\Lazarus\lazbuild.exe pasls.lpi
# 2. Deployen (VSCode muss geschlossen sein oder pasls-Prozess beenden)
taskkill /F /IM pasls.exe
copy pasls.exe C:\Lazarus\pasls.exe
Nach dem Deployen VSCode neu laden: ''Ctrl+Shift+P'' → ''Developer: Reload Window''.
===== Upgrade-Prozedur (Upstream-Updates) =====
cd D:\Workspace\3rd\pascal-language-server
# 1. Eigene Änderungen sichern
git stash
# 2. Upstream holen
git pull origin master
# 3. Patches erneut anwenden
git stash pop
# 4. Konflikte lösen (falls nötig) und neu bauen
cd server
C:\Lazarus\lazbuild.exe pasls.lpi
===== Siehe auch =====
* [[..:p:installation|Installation und Konfiguration]] — pasls-Einrichtung für Anwender
* [[..:p:solution-manager#language_server_pasls|Solution Manager: Language Server]] — Feature-Dokumentation
* [[.:extension-architektur|Extension-Architektur]] — Client-seitige LSP-Integration