Przejdź do głównej zawartości

GritQL

GritQL to język zapytań do wykonywania strukturalnych wyszukiwań w kodzie źródłowym. Oznacza to, że szczegóły takie jak białe znaki lub nawet typ cudzysłowów używanych w ciągach będą ignorowane w twoim zapytaniu wyszukiwania. Dodatkowo oferuje wiele funkcji, które pozwalają na zapytania o strukturę składni, takie jak fragmenty, dopasowanie, zagnieżdżanie i zmienne.

GritQL jest open-source i został stworzony przez Grit.io.

Biome używa GritQL do dwóch celów:

Zapytania GritQL działają poprzez wzorce. Najczęstszym wzorcem, który zobaczysz, jest fragment kodu, który wygląda jak zwykły kod źródłowy owinięty w backticki:

`console.log('Hello, world!')`

Ten wzorzec dopasuje każde wywołanie console.log(), któremu przekazano ciąg 'Hello, world!'. Ale ponieważ GritQL wykonuje strukturalne dopasowanie, nie zależy mu na szczegółach formatowania. To również pasuje:

console.log (
'Hello, world!'
)

I to również (zauważ zmianę w cudzysłowach):

console.log("Hello, world!")

Zapytania GritQL mogą również mieć zmienne. Następujące dopasuje każde wywołanie console.log() niezależnie od przekazanego komunikatu:

`console.log($message)`

To również dopasuje dowolną z metod na obiekcie console:

`console.$method($message)`

Ta sama nazwa zmiennej może wystąpić wiele razy w jednym fragmencie:

`$fn && $fn()`

To dopasuje foo && foo(), a nawet foo.bar && foo.bar(), ale nie foo && bar().

Możesz dodać warunki do wzorców używając operatora where. Jest to często używane razem z operatorem dopasowania, <::

`console.$method($message)` where {
$method <: `log`
}

To zapytanie jest identyczne ze wzorcem console.log($message), który widzieliśmy wcześniej, ale staje się szybko bardziej interesujące, gdy dodamy inne operatory do mieszanki:

`console.$method($message)` where {
$method <: or { `log`, `info`, `warn`, `error` }
}

Dla bardziej precyzyjnych zapytań możesz dopasować bezpośrednio do wewnętrznych węzłów składni Biome. Każdy węzeł jest identyfikowany przez unikalną nazwę PascalCase.

Na przykład, aby znaleźć wszystkie instrukcje JavaScript if, możesz dopasować węzeł JsIfStatement:

engine biome(1.0)
language js(typescript,jsx)
JsIfStatement() as $stmt where {
register_diagnostic(
span=$stmt,
message="Found an if statement"
)
}

Możesz odkryć nazwy węzłów dla swojego kodu, eksplorując drzewo składni w Biome Playground. Pełna lista wszystkich dostępnych węzłów jest również dostępna w plikach .ungram w katalogu xtask/codegen repozytorium Biome.

Aby uzyskać więcej informacji o GritQL i jego składni, zobacz oficjalną Dokumentację języka GritQL.

Proszę pamiętać, że Biome nie obsługuje jeszcze wszystkich funkcji Grit.

Obsługa GritQL w Biome jest aktywnie rozwijana. Wiele rzeczy już działa, ale nadal można oczekiwać błędów, a niektóre funkcje są nadal całkowicie brakujące.

Aby uzyskać szczegółowy przegląd, które funkcje GritQL są obsługiwane, a które są nadal w trakcie, zobacz issue na GitHubie: https://github.com/biomejs/biome/issues/2582.

Mamy również szczegółowy RFC, który kieruje kierunkiem naszych wysiłków związanych z wtyczkami: https://github.com/biomejs/biome/discussions/1762

tl;dr: Pracujemy nad obsługą wtyczek, które mogą być albo czystymi wtyczkami GritQL albo wtyczkami JS/TS, które używają GritQL do wyboru kodu, na którym chcą działać. Bądźcie czujni!