gogrep
1.0.0
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
コマンドを適用した結果のノードは、標準出力に 1 行ずつ出力されます。
-a オペランドの 2 つの簡単な例を次に示します。
gogrep -x '$x + $y' // will match both numerical and string "+" operations
gogrep -x '$x + $y' -a 'type(string)' // matches only string concatenations