Zurück zur Startseite

PSA-Plugin für IntelliJ: benutzerdefinierte Autovervollständigung

PSA-Plugin implementiert benutzerdefinierte Autovervollständigung und Navigation in IntelliJ basierend auf Projekt-PSI-Kontext. Skript analysiert JSON-Baum und gibt Vervollständigungen/Links zurück. Geeignet für Frameworks ohne fertige Plugins.

Benutzerdefinierte Autovervollständigung PSA für IntelliJ IDEA
Advertisement 728x90

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:

Google AdInline article slot
<?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:

Google AdInline article slot
  • PSA_CONTEXT: Pfad zur JSON-Datei mit dem PSI-Baum.
  • PSA_TYPE: Entweder Completion oder GoTo.
  • PSA_LANGUAGE: Die Programmiersprache (PHP, JS usw.).
  • PSA_DEBUG: Auf 1, 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.

Google AdInline article slot

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 priority und bold für benutzerdefinierte Rangfolge.
  • GoTo unterstützt file:line:pos-Links und elementType-Filterung.
  • Swagger-Dokumentation beschleunigt die DTO-Entwicklung.
  • Funktioniert mit jeder Projektsprache (PHP, JS/TS usw.).

— Editorial Team

Advertisement 728x90

Weiterlesen