Zpět na domů

PSA plugin pro IntelliJ: vlastní autodoplňování

Plugin PSA zavádí vlastní autodoplňování a navigaci v IntelliJ na základě PSI-kontextu projektu. Skript analyzuje JSON-strom a vrací completions/odkazy. Vhodný pro frameworky bez hotových pluginů.

Vlastní autodoplňování PSA pro IntelliJ IDEA
Advertisement 728x90

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:

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

Google AdInline article slot
  • PSA_CONTEXT: cesta k JSON souboru s PSI.
  • PSA_TYPE: Completion nebo GoTo.
  • 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í.

Google AdInline article slot

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

Advertisement 728x90

Číst dál