ast-grep : booster la réécriture de code IA

Imaginez refactoriser votre code en un clin d’œil sans gaspiller des tokens sur votre LLM préféré. Imaginez encore modifier le thème de votre site web en un rien de temps grâce à l’IA et les bons outils. À défaut, imaginez remplacer grep ou ripgrep par un outil encore plus magique. Et bien, c’est peut être ast-grep qu’il vous faut !

ast-grep est un programme pour développeurs disponible sur de nombreuses plateformes. Toujours dans la catégorie IA, cette fois je vous fais découvrir un outil très agréable pour ceux qui utilisent Claude Code, Qwen Code, Opencode ou encore Crush. ast-grep permet de faire de la recherche et du remplacement de masse, et donc d’économiser des tokens sur votre LLM.

Qu’est-ce qu’ast-grep ?

ast-grep est un outil de recherche et de transformation de code basé sur l’analyse syntaxique (Abstract Syntax Tree). Contrairement aux outils de recherche textuelle traditionnels comme grep, le programme comprend la structure du code, permettant des recherches précises et contextuelles dans votre codebase. C’est un peu un grep boosté aux épinards de Popeye qui remplace ce que vous voulez où vous le voulez – dans la limite du raisonnable, quand même.

Comment installer ast-grep ?

Image du site officiel ast-grep (https://ast-grep.github.io/)
ast-grep permet de trouver des patterns et de les remplacer en une ligne de commande

Installer ast-grep est simple et rapide, selon votre système d’exploitation et vos préférences. L’outil est principalement distribué via Cargo (le gestionnaire de paquets de Rust), mais des alternatives existent pour éviter d’installer Rust si vous n’en avez pas besoin. Voici les méthodes principales. Assurez-vous d’avoir une connexion internet active.

Prérequis

Avant de commencer, vérifiez que vous avez :

  • Un terminal comme cmd (beurk 😬) ou Powershell sur Windows, Terminal sur macOS, ou Bash sur Linux.
  • Pour la méthode Cargo : Rust installé (téléchargez-le depuis rustup.rs si nécessaire).
  • Permissions d’administration si besoin pour les installations globales.

1. Installation via Cargo (recommandée pour les utilisateurs Rust)

Cette méthode est la plus directe si vous avez déjà Rust installé. Ouvrez votre terminal et exécutez :

cargo install ast-grep

Une fois terminé, vérifiez l’installation en tapant ast-grep --version. Cela devrait afficher la version installée (ex. 0.20.0 ou supérieure). Si Cargo n’est pas dans votre PATH, redémarrez votre terminal.

2. Installation via npm (pour les utilisateurs Node.js)

Si vous préférez éviter Rust, utilisez la version JavaScript via npm. Assurez-vous d’avoir Node.js installé (version 14+ recommandée).

npm install -g @ast-grep/cli

Ensuite, lancez sg --version (l’exécutable s’appelle sg dans cette version). Notez que cette variante pourrait être légèrement moins performante que la version Rust pour les grands codebases.

3. Installation via pip (pour les utilisateurs Python)

Une autre alternative sans Rust : utilisez Python (version 3.8+). Installez via pip :

pip install ast-grep

Exécutez ensuite ast-grep --version pour vérifier. Cette méthode est idéale pour les environnements sans compilation.

4. Autres méthodes et gestionnaires de paquets

  • Homebrew (macOS/Linux) : brew install ast-grep
  • Scoop (Windows) : scoop install ast-grep
  • Docker : Pour un conteneur isolé, utilisez l’image officielle : docker run --rm -v $(pwd):/src ast-grep/ast-grep scan /src.

Consultez la documentation officielle pour les mises à jour ou les problèmes spécifiques à votre OS. Si vous rencontrez des erreurs (ex. permissions), essayez avec sudo (Linux/macOS) ou en tant qu’administrateur (Windows). Si besoin, laissez un petit commentaire au bas de cet article.

Pourquoi utiliser cet outil ?

En premier lieu, pour les férus du langage, ast-grep est codé en Rust, oui oui, le même Rust qui fait peut-être tourner votre navigateur actuellement et dont de nombreux développeurs font l’éloge. Maintenant que c’est dit, il n’y a pas que ça.

Il supporte plusieurs langages, que l’on peut définir en argument lors du lancement du programme. Le site officiel indique les langages suivants :

Domaine de langageLangages supportés
Programmation systèmeC, C++, Rust
Programmation serveurGo, Java, Python, C#
Web développementJS(X), TS(X), HTML, CSS
MobileKotlin, Swift
ConfigurationJSON, YAML
Scripting et protocolesLua, Thrift

Parmi les avantages face aux outils classiques comme tree, grep ou encore ripgrep, il y a :

  • Recherche structurelle intelligente : Au lieu de chercher des chaînes de caractères, ast-grep recherche des patterns syntaxiques. Vous pouvez trouver toutes les fonctions qui prennent un paramètre spécifique, peu importe leur nom ou leur position dans le code.
  • Support multi-langage : JavaScript, TypeScript, Python, Rust, Go, Java, et bien d’autres langages sont supportés nativement. Si vous êtes sur Windows et que vous n’avez pas Cargo installé, vous pouvez par exemple utiliser la version Python ou JavaScript.
  • Transformations sûres : Les modifications se basent sur la structure du code, réduisant drastiquement les risques d’erreurs lors des refactorings.

Ce qu’on peut faire avec ast-grep

Pour vous prouver la puissance d’ast-grep, rien ne vaut quelques lignes d’exemples.

1. Identifier des fonctions dans le code source

# Trouver toutes les fonctions nommées 'handle'

ast-grep --pattern 'function handle($$$) { $$$ }' --lang js

2. Extraction de contexte précis

Avant de poser une question à Claude Code, utilisez ast-grep pour extraire le contexte pertinent :

# Trouver tous les hooks React personnalisés 

ast-grep --pattern 'function use$HOOK_NAME() { $$$ }' --lang tsx 

# Extraire toutes les définitions de types TypeScript 

ast-grep --pattern 'type $NAME = $$$' --lang typescript 

3. Analyse de patterns problématiques

Identifiez rapidement les anti-patterns ou les zones de code problématiques :

# Détecter les fonctions async sans gestion d'erreur explicite 

ast-grep --pattern 'async function $NAME($$$) { $$$ }' --globs '!**/*test*' 

# Trouver les console.log oubliés en production 

ast-grep --pattern 'console.log($$$)' --globs '!node_modules/*' # Identifier les variables déclarées mais non utilisées ast-grep --pattern 'let $VAR = $$$'

Pour des patterns plus complexes, il est possible non pas de faire appel aux arguments en ligne de commande, mais carrément de créer un fichier YAML qui fera les détections ou changements nécessaires. C’est plus complexe et plus long, mais aussi plus précis. Voici ce que ça donne :

# rules/no-async-without-try-catch.yml
id: async-without-error-handling
language: JavaScript
rule:
  all:
    - pattern: |
        async function $NAME($$$) {
          $$$BODY
        }
    - not:
        pattern: |
          async function $NAME($$$) {
            try {
              $$$
            } catch ($$$) {
              $$$
            }
          }

Pour exécuter cette règle :

ast-grep scan --rule rules/no-async-without-try-catch.yml

4. Préparation de refactorings complexes

Avant de faire un refactoring majeur, il est possible de prévisualiser des changements :

# Identifier toutes les utilisations d'une ancienne API 

ast-grep --pattern 'oldAPI.$METHOD($$$)' # Localiser tous les imports d'un module spécifique ast-grep --pattern 'import { $$$ } from "old-library"' 

# Exclure les fichiers de test et de documentation 

ast-grep --pattern 'deprecatedFunction($$$)' --globs '!**/*test*' --globs '!**/docs/*'

5. Identifier des requêtes vulnérables en SQL :

# Détecter les requêtes SQL potentiellement vulnérables 

ast-grep --pattern 'query("SELECT * FROM " + $VAR)' 

# Trouver les utilisations dangereuses d'eval ast-grep --pattern 'eval($CODE)' 

# Identifier les expressions régulières complexes sans validation 

ast-grep --pattern 'new RegExp($PATTERN)'

6. Trouver des boucles imbriquées :

# Trouver les boucles imbriquées 

ast-grep --pattern 'for ($$$) { $$$ for ($$$) { $$$ } $$$ }' # Détecter les appels synchrones bloquants dans du code async ast-grep --pattern 'fs.readFileSync($$$)' 

# Identifier les re-rendus React potentiellement coûteux ast-grep --pattern 'useEffect(() => { $$$ }, [])' --lang tsx

7. Intégrer ast-grep dans un workflow avec Claude Code (ou autre) :

Pour les utilisateurs de CI/CD, que ce soit avec GitHub, GitLab, Gitea ou une autre plateforme, vous pouvez créer un script qui va parcourir votre code pour retrouver des patterns interdits. Un exemple ici avec un script Bash :

#!/bin/bash
# Vérifier l'absence d'anti-patterns avant le merge
if ast-grep --pattern 'console.log($$$)' --globs '!**/*test*' --quiet; then
    echo "Console.log détecté - demander à Claude Code de les remplacer par un logger approprié"
    exit 1
fi

# Vérifier l'absence de TODO en production
if ast-grep --pattern 'TODO: $$$' --quiet; then
    echo "TODO trouvés - review nécessaire"
    exit 1
fi

Article précédent

Kan : kanban gratuit et open source

Écrire un commentaire

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *