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 :
<?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 :
PSA_CONTEXT: Chemin vers le fichier JSON contenant l’arbre PSI.PSA_TYPE: SoitCompletion, soitGoTo.PSA_LANGUAGE: Langage de programmation (PHP, JS, etc.).PSA_DEBUG: Valeur1si 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.
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
priorityetboldpour un tri personnalisé. - GoTo prend en charge les liens
file:line:poset le filtrage parelementType. - 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
Aucun commentaire pour le moment.