Applique des ondes de mutations fournies par d'autres outils, telles que des liners ou des codes.
Il existe de nombreux liners et la plupart incluent les moyens de --fix automatiquement les pannes de règles. C'est génial mais difficile à faire pour deux raisons:
automutate propose que les liners ne proposent que comment fixer les règles, via un format JSON standardisé.
Le fait d'avoir un projet autochtone standardisé pour appliquer des mutations apporte quelques avantages:
automutate est réduit avec du code commun.En général, la détection des défaillances des règles est une préoccupation distincte de leur réparation . Les liners doivent s'exécuter rapidement sur un ensemble de fichiers en lecture seule, souvent pendant les processus construits, tandis que les fixateurs s'exécutent généralement lentement et modifient les fichiers sur la demande de l'utilisateur.
L'algorithme principal automutate est démarré dans autoMutator.ts et principalement appliqué dans mutationsApplier.ts :
while mutationsWave = getMutationsWave ( ) :
for ( file , fileMutations ) of groupMutationsByFile ( mutationsWave ) :
for mutation of getNonOverlappingMutationsInReverse ( fileMutations ) :
applyMutation ( file , mutation )getMutationsWave appelle un outil externe, comme un linter, pour recevoir une vague de mutations suggérées.groupMutationsByFile organise les mutations suggérées par fichier.getNonOverlappingMutationsInReverse Inverseverse supprime des mutations qui se chevauchent qui en conflit les uns avec les autres, et trie le reste dans l'ordre inverse afin que les mutations ultérieures n'interfèrent pas avec les positions de caractère des mutations antérieures.applyMutation modifie les fichiers sur le disque à l'aide des mutations restantes. Une seule mutation contient un identifiant type unique, une gamme de position (s) de caractères à appliquer et éventuellement une autre logique.
Les manipulations de texte de base suivantes sont fournies hors de la boîte:
multiple pour plusieurs mutations. Cela indique d' automutate que ceux-ci doivent être appliqués en une seule fois ou pas du tout, ce qui garantit la cohérence avec la détection de chevauchement de mutation intégrée.text-delete - Supprime une gamme de caractères.text-insert - insère une chaîne à un point.text-replace - remplace les caractères correspondant à une chaîne ou à une expression régulière dans une plage.text-swap - échange une gamme de caractères avec une nouvelle chaîne.Par exemple:
{
"ugly-file.txt" : [
{
"range" : {
"begin" : 7 ,
"end" : 14
},
"type" : " text-delete "
},
{
"insertion" : " inconceivable! " ,
"range" : {
"begin" : 21
},
"type" : " text-insert "
}
]
} Les services publics spécifiques à Linter peuvent définir leurs propres mutations. Par exemple, le linter d'un langage peut définir une mutation node-rename plutôt que d'utiliser une mutation multiple contenant des mutations text-swap .
Voir les mutateurs pour en savoir plus sur les mutateurs personnalisés.
Voir l'intégration.
automutate nécessite Nodejs> = 14.