Powrót do strony głównej

Wtyczka PSA dla IntelliJ: niestandardowe autouzupełnianie

Wtyczka PSA wprowadza niestandardowe autouzupełnianie i nawigację w IntelliJ na podstawie kontekstu PSI projektu. Skrypt analizuje drzewo JSON i zwraca completions/linki. Nadaje się do frameworków bez gotowych wtyczek.

Niestandardowe autouzupełnianie PSA dla IntelliJ IDEA
Advertisement 728x90

PSA: niestandardowe uzupełnianie i nawigacja w IntelliJ oparte na kontekście PSI

Plugin PSA pozwala programistom wdrażać projektowo specyficzne uzupełniania kodu, przejścia po linkach i szablony bezpośrednio w IntelliJ IDEA. Skrypt napisany w dowolnym języku analizuje drzewo PSI bieżącego kontekstu i zwraca propozycje. Rozwiązuje problem obsługi niestandardowych frameworków bez instalowania dodatkowych wtyczek.

Mechanizm działania oparty na kontekście PSI

Plugin aktywuje się w ustawieniach poprzez podanie ścieżki do pliku wykonywalnego. Podczas wywołania uzupełniania (Ctrl+Space) lub funkcji GoTo generowany jest PSA Context — uproszczone drzewo PSI skupione na aktualnym elemencie. Jest ono zakodowane w formacie JSON i zapisane w pliku tymczasowym (z powodu ograniczeń długości argumentów wiersza poleceń), a następnie przekazywane skryptowi przez zmienną środowiskową PSA_CONTEXT.

Przykład dla PHP:

Google AdInline article slot
<?php

function myFunc() {
    $l = '';
//        ^   kursor tutaj
}

Wygenerowany plik JSON zawiera hierarchię elementów:

{
  "elementType": "right single quote",
  "elementName": null,
  "elementFqn": null,
  "text": "'",
  "parent": {
    "elementType": "String",
    "text": "''",
    // ... struktura zagnieżdżona aż do pliku
  }
}

Każdy węzeł PSI zawiera elementType, elementName, elementFqn, text, textRange (startOffset/endOffset), parent/prev/next oraz opcje.

Zmienne środowiskowe dla skryptu

Skrypt otrzymuje:

Google AdInline article slot
  • PSA_CONTEXT: ścieżka do pliku JSON z danymi PSI.
  • PSA_TYPE: Completion lub GoTo.
  • PSA_LANGUAGE: język (PHP, JS itp.).
  • PSA_DEBUG: wartość 1 przy włączonej trybie debugowania.
  • PSA_OFFSET: pozycja kursora w elemencie.

Skrypt parsuje drzewo, analizuje kontekst (element + rodzice) i określa możliwe propozycje. Dla Completion zwraca tablicę opcji, dla GoTo — pojedynczy obiekt z pola link.

Format odpowiedzi skryptu

Odpowiedź w formacie JSON:

{
  "completions": [
    {
      "text": "tekst do wstawienia",
      "link": "FileName.php:42:5", // tylko dla GoTo
      "bold": true,
      "priority": 10
    }
  ],
  "notifications": ["komunikat debugowania"],
  "gotoElementTypes": ["FUNCTION", "CLASS"] // filtr dla wydajności
}

priority sortuje wyniki, bold wyróżnia tekst pogrubionym. gotoElementTypes ogranicza zakres GoTo, co przyspiesza działanie.

Google AdInline article slot

Dokumentacja i Swagger

Plugin generuje interfejs Swagger UI na podstawie modeli API. Metody są fikcyjne i służą wyłącznie do opisu struktury wywołań. Użyj OpenAPI Generator do tworzenia klas DTO dla skryptu.

Struktura elementu PSI:

  • elementType: typ (STRING, FUNCTION).
  • elementName/Fqn: nazwa / FQCN.
  • options: słownik parametrów.
  • text: oryginalny tekst.
  • textRange: zakres offsetów.
  • Relacje: parent/prev/next.

Konfiguracja i wydajność

Włącz plugin i wskaż skrypt. Do debugowania włącz PSA_DEBUG. Filtry gotoElementTypes zmniejszają obciążenie funkcji GoTo.

Zalety w porównaniu do wtyczek frameworków:

  • Zależność od projektu, nie globalna.
  • Obsługa niestandardowych API i szablonów.
  • Uniwersalność języków skryptów.

Przykład skryptu (pseudokod):

#!/bin/bash
context=$(cat $PSA_CONTEXT | jq .)
if [[ $PSA_TYPE == "Completion" ]]; then
  # logika analizy
  echo '{"completions": [{"text": "customFunc()"}]}'
fi

Co należy pamiętać

  • PSA przesyła pełne drzewo PSI do precyzyjnej analizy kontekstu.
  • Skrypt zwraca completions z priorytetem i pogrubieniem dla niestandardowego sortowania.
  • Funkcja GoTo obsługuje linki typu file:line:pos oraz filtry po typie elementu.
  • Dokumentacja Swagger przyspiesza rozwój klas DTO.
  • Działa z dowolnymi językami projektu (PHP, JS/TS itp.).

— Editorial Team

Advertisement 728x90

Czytaj dalej