PSA: Eigenes Autovervollständigen und Navigieren in IntelliJ mit PSI-Kontext
Das PSA-Plugin ermöglicht Entwicklern, projektbezogene Autovervollständigung, Navigation und Code-Vorlagen direkt in IntelliJ IDEA zu implementieren. Ein Skript in beliebiger Sprache analysiert den aktuellen PSI-Baum und liefert Vorschläge zurück. So wird die Unterstützung benutzerdefinierter Frameworks ohne separate Plugins möglich.
Wie der PSI-Kontext funktioniert
Das Plugin aktiviert sich, wenn Sie den Pfad zu einem ausführbaren Skript in den Einstellungen angeben. Bei Auslösung der Autovervollständigung (Strg+Leer) oder der Navigationsfunktion (GoTo) wird ein PSA-Kontext – ein vereinfachter PSI-Baum des fokussierten Elements – generiert. Dieser ist JSON-kodiert in einer temporären Datei gespeichert (aufgrund von Begrenzungen bei Kommandozeilenargumenten) und über die Umgebungsvariable PSA_CONTEXT an das Skript übergeben.
Beispiel für PHP:
<?php
function myFunc() {
$l = '';
// ^ Cursor hier
}
Die generierte JSON enthält eine hierarchische Struktur der Elemente:
{
"elementType": "right single quote",
"elementName": null,
"elementFqn": null,
"text": "'",
"parent": {
"elementType": "String",
"text": "''",
// ... verschachtelte Struktur bis zur Dateiebene
}
}
Jeder PSI-Knoten beinhaltet elementType, elementName, elementFqn, text, textRange (startOffset/endOffset), parent/prev/next sowie optionale Parameter.
Umgebungsvariablen für das Skript
Das Skript erhält folgende Variablen:
PSA_CONTEXT: Pfad zur JSON-Datei mit dem PSI-Baum.PSA_TYPE: EntwederCompletionoderGoTo.PSA_LANGUAGE: Die Programmiersprache (PHP, JS usw.).PSA_DEBUG: Auf1, wenn Debugging aktiviert ist.PSA_OFFSET: Cursorposition innerhalb des Elements.
Das Skript analysiert den Baum, prüft den Kontext (Element und Eltern) und bestimmt die Vorschläge. Bei Completion gibt es ein Array mit Optionen zurück, bei GoTo eine einzelne Antwort mit link.
Antwortformat des Skripts
JSON-Antwort:
{
"completions": [
{
"text": "Einfügetext",
"link": "FileName.php:42:5", // nur bei GoTo
"bold": true,
"priority": 10
}
],
"notifications": ["Debug-Nachricht"],
"gotoElementTypes": ["FUNCTION", "CLASS"] // Leistungsfilter
}
priority sortiert die Ergebnisse; bold hebt Einträge hervor. gotoElementTypes begrenzt den Suchbereich bei GoTo für bessere Performance.
Dokumentation und Swagger
Das Plugin generiert automatisch eine Swagger UI aus seinen API-Modellen, um Klarheit zu schaffen. Die Methoden sind 'fiktiv', beschreiben aber die Aufrufstruktur. Nutzen Sie OpenAPI Generator, um DTO-Klassen für Ihr Skript zu erstellen.
PSI-Element-Struktur:
elementType: Typ (STRING, FUNCTION).elementName/Fqn: Name oder FQCN.options: Wörterbuch mit Parametern.text: Ursprünglicher Quelltext.textRange: Offset-Werte.- Beziehungen: parent/prev/next.
Einrichtung und Performance
Aktivieren Sie das Plugin und weisen Sie es auf Ihr Skript hin. Aktivieren Sie PSA_DEBUG zur Fehlerbehebung. Verwenden Sie gotoElementTypes-Filter, um die Overhead-Kosten bei GoTo zu reduzieren.
Vorteile gegenüber framework-spezifischen Plugins:
- Projektbezogene Abhängigkeit, nicht global.
- Unterstützt benutzerdefinierte APIs und Vorlagen.
- Sprachunabhängige Skriptunterstützung.
Beispiel-Skript (Pseudocode):
#!/bin/bash
context=$(cat $PSA_CONTEXT | jq .)
if [[ $PSA_TYPE == "Completion" ]]; then
# Analyse-Logik
echo '{"completions": [{"text": "customFunc()"}]}'
fi
Wichtige Punkte
- PSA übergibt den vollständigen PSI-Baum für präzise Kontextanalyse.
- Skripte liefern Vorschläge mit
priorityundboldfür benutzerdefinierte Rangfolge. - GoTo unterstützt
file:line:pos-Links undelementType-Filterung. - Swagger-Dokumentation beschleunigt die DTO-Entwicklung.
- Funktioniert mit jeder Projektsprache (PHP, JS/TS usw.).
— Editorial Team
Noch keine Kommentare.