PSA: Vlastní doplňování a navigace v IntelliJ na základě PSI kontextu
Plugin PSA umožňuje vývojářům přímo ve IntelliJ IDEA implementovat projektově specifické doplňování kódu, přechody podle odkazů a šablony kódu. Skript libovolného jazyka analyzuje strom PSI aktuálního kontextu a vrátí návrhy. Tímto řeší problém podpory vlastních frameworků bez nutnosti instalace samostatných pluginů.
Princip práce s PSI kontextem
Plugin se aktivuje v nastavení zadáním cesty k spustitelnému skriptu. Při aktivaci doplňování (Ctrl+Space) nebo přechodu se generuje PSA Context – zjednodušený strom PSI zaměřeného prvku. Tento strom je JSON-kódován do dočasného souboru (kvůli omezením argumentů příkazové řádky) a předán skriptu prostřednictvím proměnné prostředí PSA_CONTEXT.
Příklad pro PHP:
<?php
function myFunc() {
$l = '';
// ^ kurzor je tady
}
Vygenerovaný JSON obsahuje hierarchii prvků:
{
"elementType": "right single quote",
"elementName": null,
"elementFqn": null,
"text": "'",
"parent": {
"elementType": "String",
"text": "''",
// ... vnořená struktura až po soubor
}
}
Každý uzel PSI obsahuje elementType, elementName, elementFqn, text, textRange (startOffset/endOffset), parent/prev/next a volitelné možnosti.
Proměnné prostředí pro skript
Skript obdrží:
PSA_CONTEXT: cesta k JSON souboru s PSI.PSA_TYPE:CompletionneboGoTo.PSA_LANGUAGE: jazyk (PHP, JS atd.).PSA_DEBUG: 1 při zapnuté ladění.PSA_OFFSET: pozice kurzoru v elementu.
Skript analyzuje strom, vyhodnocuje kontext (prvek + rodiče) a určuje návrhy. Pro Completion vrací pole variant, pro GoTo jeden s link.
Formát odpovědi skriptu
JSON odpověď:
{
"completions": [
{
"text": "text pro vložení",
"link": "FileName.php:42:5", // pouze pro GoTo
"bold": true,
"priority": 10
}
],
"notifications": ["ladící zpráva"],
"gotoElementTypes": ["FUNCTION", "CLASS"] // filtr pro výkon
}
priority řadí výsledky, bold zvýrazní tučně. gotoElementTypes omezuje GoTo pro zrychlení.
Dokumentace a Swagger
Plugin generuje Swagger UI na základě modelů pro pochopení API. Metody jsou fiktivní, popisují strukturu volání. Použijte OpenAPI Generator pro DTO třídy skriptu.
Struktura PSI prvku:
elementType: typ (STRING, FUNCTION).elementName/Fqn: jméno/FQCN.options: slovník parametrů.text: původní text.textRange: offsety.- Vztahy: parent/prev/next.
Nastavení a výkon
Aktivujte plugin a zadejte skript. Pro ladění zapněte PSA_DEBUG. Filtry gotoElementTypes minimalizují zatížení při GoTo.
Výhody oproti framework pluginům:
- Závislost na projektu, nikoli globální.
- Podpora vlastních API/šablon.
- Univerzalita jazyků skriptu.
Příklad skriptu (pseudokód):
#!/bin/bash
context=$(cat $PSA_CONTEXT | jq .)
if [[ $PSA_TYPE == "Completion" ]]; then
# logika analýzy
echo '{"completions": [{"text": "customFunc()"}]}'
fi
Co je důležité
- PSA předává kompletní strom PSI pro přesnou analýzu kontextu.
- Skript vrací completions s priority/bold pro vlastní řazení.
- GoTo podporuje odkazy file:line:pos a filtr typů prvků.
- Swagger dokumentace urychlí vývoj DTO.
- Funguje s jakýmkoli jazykem projektu (PHP, JS/TS atd.).
— Editorial Team
Zatím žádné komentáře.