GO111MODULE=on go get mvdan.cc/gogrep
Найдите код Go, используя синтаксические деревья.
gogrep -x 'if $x != nil { return $x, $*_ }'
Обратите внимание, что этот проект больше не разрабатывается . Подробнее см. №64.
usage: gogrep commands [packages]
Команда имеет форму «шаблон -A», где -A — одно из:
-x find all nodes matching a pattern
-g discard nodes not matching a pattern
-v discard nodes matching a pattern
-a filter nodes by certain attributes
-s substitute with a given syntax tree
-w write source back to disk or stdout
Шаблон — это часть кода Go, которая может включать подстановочные знаки. Это может быть:
a statement (many if split by semicolons)
an expression (many if split by commas)
a type expression
a top-level declaration (var, func, const)
an entire file
Подстановочные знаки состоят из $
и имени. Все подстановочные знаки с одинаковым именем в выражении должны соответствовать одному и тому же узлу, за исключением «_». Пример:
$x.$_ = $x // assignment of self to a field in self
Если *
стоит перед именем, оно будет соответствовать любому количеству узлов. Пример:
fmt.Fprintf(os.Stdout, $*_) // all Fprintfs on stdout
*
также может использоваться для сопоставления необязательных узлов, например:
for $*_ { $*_ } // will match all for loops
if $*_; $b { $*_ } // will match all ifs with condition $b
Узлы, полученные в результате применения команд, будут выводиться построчно в стандартный вывод.
Вот два простых примера операнда -a:
gogrep -x '$x + $y' // will match both numerical and string "+" operations
gogrep -x '$x + $y' -a 'type(string)' // matches only string concatenations