GritQL
GritQLは、ソースコードの構造検索を実行するためのクエリ言語です。 つまり、空白や、文字列で使用される引用符の種類などの些細な情報は、検索クエリでは無視されます。 さらに、スニペット、マッチング、ネスト、変数など、構文構造をクエリできる多くの機能も提供します。
GritQLはオープンソースであり、Grit.ioによって作成されました。
サポートされている言語
Section titled “サポートされている言語”BiomeのGritQLは現在、以下のターゲット言語をサポートしています:
- JavaScript/TypeScript:
language js(オプションのフレーバー:typescript、jsx) - CSS:
language css - JSON:
language json
BiomeはGritQLを2つの目的で使用しています:
- アナライザープラグイン
biome searchコマンド。これはIDE拡張機能にも拡張したいと考えています
GritQLクエリは パターン を通じて機能します。 最もよく見られるパターンは、バッククォートで囲まれた通常のソースコードのように見えるコードスニペットです。
`console.log('Hello, world!')`このパターンは、文字列 'Hello, world!' が渡された全ての console.log() の呼び出しに一致します。
ただし、GridQLは 構造的 マッチングを行うため、フォーマットの詳細には関心がありません。
これもマッチします:
console.log ( 'Hello, world!')そして、これもマッチします(引用符が変化したことに注目してください):
console.log("Hello, world!")GritQLクエリでは変数も使用できます。
次のクエリは渡されるメッセージに関係なく、全ての console.log() 呼び出しに一致します。
`console.log($message)`これは、console オブジェクトの任意のメソッドに一致します:
`console.$method($message)`同じ変数名が1つのスニペット内で複数回出現することもできます。
`$fn && $fn()`これは foo && foo() や、foo.bar && foo.bar() にもマッチしますが、foo && bar() にはマッチしません。
where 演算子を使用してパターンに条件を追加できます。
これは通常、<: マッチ演算子と一緒に使用されます:
`console.$method($message)` where { $method <: `log`}このクエリは先ほど見た console.log($message) パターンと同じですが、他の演算子を追加するとすぐに、さらに興味深いものになります:
`console.$method($message)` where { $method <: or { `log`, `info`, `warn`, `error` }}Biomeの構文ノードとのマッチング
Section titled “Biomeの構文ノードとのマッチング”より正確なクエリを行うために、Biome内部の構文ノードに直接マッチさせることができます。各ノードは一意の PascalCase 名で識別されます。
たとえば、すべてのJavaScript if 文を見つけるには、 JsIfStatement ノードとマッチさせることができます:
engine biome(1.0)language js(typescript,jsx)
JsIfStatement() as $stmt where { register_diagnostic( span=$stmt, message="Found an if statement" )}コードのノード名を調べるには、Biome Playgroundで構文ツリーを探索できます。利用可能なすべてのノードの完全なリストは、Biomeリポジトリの xtask/codegen ディレクトリにある .ungram ファイルでも確認できます。
JSONパターン
Section titled “JSONパターン”GritQLはJSONファイル内のパターンをマッチさせることができ、設定ファイルの検索と変換に役立ちます:
language json
`"foo": $value`このパターンは、キー "foo" を持つ任意のJSONメンバーにマッチします。
より正確なマッチングには、BiomeのJSON構文ノードを直接使用できます:
language json
JsonMember(name = JsonMemberName(value = `"version"`))JSON GritQLは、既存のGritパターンとの互換性のために、TreeSitter互換のノードエイリアスもサポートしています:
| Biome AST | TreeSitterエイリアス |
|---|---|
JsonMember | pair |
JsonObjectValue | object |
JsonArrayValue | array |
言語ドキュメント
Section titled “言語ドキュメント”GritQLとその構文については、公式の GritQL 言語ドキュメントを参照してください。
BiomeはGritの全ての機能を(まだ)サポートしていないことに注意してください。
BiomeはGritQLサポートに積極的に取り組んでいます。 多くの機能がすでに動作していますが、バグがまだ発生することが予想され、一部の機能はまだ完全に欠落しています。
サポートされているGritQLの機能と、まだ進行中の機能の詳細な概要については、GitHubのIssueを参照してください: https://github.com/biomejs/biome/issues/2582
プラグインの取り組みの方向性を示す詳細なRFCもあります: https://github.com/biomejs/biome/discussions/1762
まとめ: 私たちは、純粋なGritQLプラグイン、またはGritQLを使用して操作したいコードを選択するJS/TSプラグインのいずれかをサポートするプラグインに取り組んでいます。お楽しみに!
Copyright (c) 2023-present Biome Developers and Contributors.