Обычный grep ищет по тексту и не понимает, что перед ним код. Из-за этого при рефакторинге легко получить ложные срабатывания: например, строка $A && $A() может встретиться в комментарии или в строковом литерале. Инструмент ast-grep решает эту проблему иначе — он сопоставляет не символы, а узлы синтаксического дерева. Шаблон записывается как фрагмент настоящего кода, а метапеременные вроде $A обозначают один узел.
Как работает сопоставление по дереву
Когда вы запускаете поиск, ast-grep разбирает исходник в дерево разбора (AST) и сравнивает его с шаблоном. Метапеременная $A подходит на роль любого одного узла, поэтому одна и та же конструкция находится независимо от имён переменных. Пробелы, переносы строк и форматирование не влияют на результат — это особенно удобно в проектах, где код писали разные люди с разными настройками редактора.
Пример: поиск проверки перед вызовом
Допустим, в TypeScript нужно найти все места, где значение сначала проверяется, а затем вызывается. Шаблон выглядит так:
sg run -p '$A && $A()' -l tsФлаг -l ts указывает язык, а -p задаёт шаблон. В результате вы получите список узлов, где одна и та же сущность встречается и в условии, и в вызове. Обратите внимание: в Linux имя sg может быть занято системной командой (например, для смены группы), поэтому в таких окружениях используйте полное имя ast-grep вместо сокращения.
Замена кода без ручной правки
Найденные совпадения можно не только просматривать, но и заменять. Синтаксический подход снижает риск задеть лишнее: замена применяется к узлам, а не к произвольным вхождениям текста. Это пригодится при обновлении библиотеки, когда нужно поменять устаревший вызов на новый API во всём проекте, или при борьбе с повторяющимися конструкциями, которые расползлись по кодовой базе.
Собственные правила в YAML
В README проекта описана установка, примеры поиска и замены, а также настройка собственных правил проверки в YAML. Такие правила позволяют описывать более сложные условия, чем одиночный шаблон, и переиспользовать их в команде. Если вы регулярно сталкиваетесь с однотипными правками, имеет смысл один раз оформить правило и запускать его как часть проверки кода.
Когда это действительно экономит время
Инструмент особенно полезен в больших проектах, где текстовый поиск даёт сотни совпадений, а нужны лишь те, что относятся к коду. Синтаксическое сопоставление отсекает комментарии и строки, а метапеременные избавляют от необходимости перебирать все варианты имён. Вместе с возможностью замены и YAML-правилами ast-grep закрывает задачи, для которых раньше приходилось писать одноразовые скрипты.



