Retour à l'accueil

Plugin PSA pour IntelliJ : autocomplétion personnalisée

Le plugin PSA implémente l'autocomplétion personnalisée et la navigation dans IntelliJ basée sur le contexte PSI du projet. Le script analyse l'arbre JSON et retourne les complétions/liens. Adapté aux frameworks sans plugins prêts à l'emploi.

Autocomplétion personnalisée PSA pour IntelliJ IDEA
Advertisement 728x90

AST : Autocomplétion personnalisée et navigation dans IntelliJ via le contexte PSI

Le plugin PSA permet aux développeurs d’implémenter une autocomplétion, une navigation et des modèles de code spécifiques au projet directement dans IntelliJ IDEA. Un script écrit dans n’importe quel langage analyse l’arbre PSI actuel et retourne des suggestions. Cela résout le problème de prise en charge de frameworks personnalisés sans avoir à installer de plugins séparés.

Fonctionnement du contexte PSI

Le plugin s’active lorsque vous indiquez le chemin vers un script exécutable dans les paramètres. Lorsque l’autocomplétion (Ctrl+Space) ou la navigation (GoTo) est déclenchée, un contexte PSA — une version simplifiée de l’arbre PSI de l’élément focalisé — est généré. Il est encodé en JSON dans un fichier temporaire (en raison des limites des arguments en ligne de commande) puis transmis au script via la variable d’environnement PSA_CONTEXT.

Exemple pour PHP :

Google AdInline article slot
<?php

function myFunc() {
    $l = '';
//        ^   curseur ici
}

Le JSON généré inclut une structure hiérarchique des éléments :

{
  "elementType": "guillemet simple droit",
  "elementName": null,
  "elementFqn": null,
  "text": "'",
  "parent": {
    "elementType": "Chaîne",
    "text": "''",
    // ... structure imbriquée jusqu’au niveau du fichier
  }
}

Chaque nœud PSI contient elementType, elementName, elementFqn, text, textRange (début/fin), parent/prev/next, ainsi que des options.

Variables d’environnement disponibles pour le script

Le script reçoit :

Google AdInline article slot
  • PSA_CONTEXT : Chemin vers le fichier JSON contenant l’arbre PSI.
  • PSA_TYPE : Soit Completion, soit GoTo.
  • PSA_LANGUAGE : Langage de programmation (PHP, JS, etc.).
  • PSA_DEBUG : Valeur 1 si le débogage est activé.
  • PSA_OFFSET : Position du curseur à l’intérieur de l’élément.

Le script analyse l’arbre, interprète le contexte (élément + parents) et détermine les suggestions. Pour Completion, il retourne un tableau d'options ; pour GoTo, un objet avec un link.

Format de réponse du script

Réponse JSON :

{
  "completions": [
    {
      "text": "texte à insérer",
      "link": "FileName.php:42:5", // uniquement pour GoTo
      "bold": true,
      "priority": 10
    }
  ],
  "notifications": ["message de débogage"],
  "gotoElementTypes": ["FUNCTION", "CLASS"] // filtre de performance
}

priority trie les résultats ; bold met en évidence les entrées. gotoElementTypes restreint la portée de GoTo pour améliorer les performances.

Google AdInline article slot

Documentation et Swagger

Le plugin génère une interface Swagger UI à partir de ses modèles API pour plus de clarté. Les méthodes sont « fictives » mais décrivent bien la structure des appels. Utilisez OpenAPI Generator pour créer les classes DTO adaptées à votre script.

Structure des éléments PSI :

  • elementType : Type (STRING, FUNCTION).
  • elementName/Fqn : Nom ou FQCN.
  • options : Dictionnaire de paramètres.
  • text : Texte source original.
  • textRange : Décalages.
  • Relations : parent/prev/next.

Configuration et performances

Activez le plugin et pointez-le vers votre script. Activez PSA_DEBUG pour déboguer. Utilisez les filtres gotoElementTypes pour réduire la charge de GoTo.

Avantages par rapport aux plugins spécifiques aux frameworks :

  • Dépendance au niveau du projet, pas global.
  • Prise en charge des APIs et modèles personnalisés.
  • Support de scripts indépendants du langage.

Exemple de script (pseudocode) :

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

Points clés

  • PSA transmet l’arbre PSI complet pour une analyse contextuelle précise.
  • Les scripts retournent des complétions avec priority et bold pour un tri personnalisé.
  • GoTo prend en charge les liens file:line:pos et le filtrage par elementType.
  • La documentation Swagger accélère le développement des classes DTO.
  • Fonctionne avec n’importe quel langage de projet (PHP, JS/TS, etc.).

— Editorial Team

Advertisement 728x90

Lire ensuite