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:
<?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:
PSA_CONTEXT: ścieżka do pliku JSON z danymi PSI.PSA_TYPE:CompletionlubGoTo.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.
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
completionsz 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
Brak komentarzy.