Применяет волны мутаций, предоставленных другими инструментами, такими как линтерс или кодовые демоды.
Существует множество Линтеров, и большинство из них включают способы автоматического автоматического --fix правил. Это здорово, но трудно сделать по нескольким причинам:
automutate предлагает, чтобы Linters предлагал только то, как исправить правила, через стандартизированный формат JSON.
Наличие стандартизированного источника-оживленного проекта для применения мутаций приносит пару преимуществ:
automutate уменьшается с помощью общего кода.В целом, обнаружение сбоев правил является отдельной проблемой от их исправления . Линтеры должны быстро работать по набору файлов только для чтения, часто во время встроенных процессов, в то время как фиксаторы обычно медленно работают и изменяют файлы по запросу пользователя.
Основной алгоритм automutate запускается в autoMutator.ts и в основном применяется в mutationsApplier.ts :
while mutationsWave = getMutationsWave ( ) :
for ( file , fileMutations ) of groupMutationsByFile ( mutationsWave ) :
for mutation of getNonOverlappingMutationsInReverse ( fileMutations ) :
applyMutation ( file , mutation )getMutationsWave вызывает внешний инструмент, такой как Linter, чтобы получить волну предлагаемых мутаций.groupMutationsByFile организует предлагаемые мутации по файлу.getNonOverlappingMutationsInReverse Удаляет перекрывающиеся мутации, которые будут противоречить друг другу, и сортирует оставшуюся часть в обратном порядке, чтобы более поздние мутации не мешают позициям характера более ранних мутаций.applyMutation изменяет файлы на диске, используя оставшиеся мутации. Одна мутация содержит уникальный идентификатор type , диапазон позиций символов (и) для применения, и, необязательно другую логику.
Следующие основные текстовые манипуляции предоставляются из коробки:
multiple - контейнер для множественных мутаций. Это указывает на automutate того, что они должны быть применены одновременно или нет вообще, что гарантирует согласованность со встроенным обнаружением перекрытия мутации.text-delete - удаляет диапазон символов.text-insert - встает строку в точке.text-replace - заменяет символы, соответствующие строке или регулярному выражению в диапазоне.text-swap - заменяет диапазон символов новой строкой.Например:
{
"ugly-file.txt" : [
{
"range" : {
"begin" : 7 ,
"end" : 14
},
"type" : " text-delete "
},
{
"insertion" : " inconceivable! " ,
"range" : {
"begin" : 21
},
"type" : " text-insert "
}
]
} Специфичные для Линтера утилиты могут определить свои собственные мутации. Например, языковой линтер может определить мутацию node-rename а не использовать multiple мутацию, содержащую мутации text-swap .
Смотрите мутаторы для получения дополнительной информации о пользовательских мутаторах.
Смотрите на борьбе.
automutate требует nodejs> = 14.