GritQL : un langage de requete pour chercher et manipuler du code source

Par:
fredericmazue

ven, 24/05/2024 - 14:42

Chercher et modifier du code source, tout le monde l'a fait avec des utilitaires de base tels que grep et sed. Mais lorsque la base de code est pleine de millions de ligne de code, un outil pljus élaboré devient intéressant et même nécessaire. GritQL est un de ces outils. Ses développeurs expliquent ainsi ce qui a motivé la création de GritSQL

GritQL vient de nos expériences en matière de refactorisations et de migrations à grande échelle.

Habituellement, les migrations commencent par un travail exploratoire visant à déterminer l'étendue du problème, souvent à l'aide de simples recherches grep. Il est facile de démarrer ces opérations, mais la plupart des migrations finissent par accumuler des exigences supplémentaires, comme s'assurer que les bons packages sont importés et exclure les cas qui ne disposent pas d'un chemin de migration viable.

Finalement, toute migration complexe finit par être un programme codemod complet écrit avec un outil comme jscodeshift . Cela vient avec ses propres problèmes :

  • La plupart du travail exploratoire doit être abandonné pendant que vous découvrez comment représenter votre recherche d'expression régulière originale en tant qu'AST.
  • Lire/écrire un codemod nécessite de traduire mentalement les noms AST en ce à quoi ressemble réellement le code source.
  • La plupart des frameworks ne sont pas composables, vous êtes donc obligé de copier des modèles d'avant en arrière.
  • Les performances sont souvent une réflexion après coup, donc itérer sur un gros codemod peut être extrêmement lent.
  • Les frameworks Codemod sont spécifiques à la langue, donc si vous passez d'une langue à l'autre ou si vous essayez de migrer une API partagée, vous devez apprendre différents frameworks.

GritQL est notre tentative de développer un terrain d'entente puissant :

  • L'analyse exploratoire est simple : il suffit de mettre un extrait de code dans des backticks et de l'utiliser $metavariablespour les trous que vous souhaitez représenter.
  • Ajoutez progressivement de la complexité en introduisant des conditions secondaires avec les clauses Where.
  • Réutilisez les modèles nommés pour éviter de reconstruire les requêtes et utilisez les modèles partagés de notre bibliothèque standard pour les tâches courantes, comme garantir l'importation des modules.
  • Écrit en Rust pour des performances maximales : réécrivez des millions de lignes de code en quelques secondes.

GritQL est un logiciel libre sous licence MIT, disponible sur GitHub. Le dépot GitHub contient aussi les instructions pour installer et utiliser GritQL.

Il existe, pour GritSQL, une bibliothèque standard qui contient notamment des motifs de recherche. Cette bibliothèque est disponible sur GitHub également.

Commentaires

une comparaison avec codeql serait-elle interessante ?