Skip to content

Commit 2bad47d

Browse files
rriskiTheAlexLichter
authored andcommitted
feat(grit): allow matching native Biome AST nodes (biomejs#7510)
1 parent a70ceff commit 2bad47d

File tree

15 files changed

+1323
-73
lines changed

15 files changed

+1323
-73
lines changed

.changeset/fruity-towns-repair.md

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
---
2+
"@biomejs/biome": patch
3+
---
4+
5+
Implements [#7339](https://github.com/biomejs/biome/discussions/7339). GritQL patterns can now use native Biome AST nodes using their `PascalCase` names, in addition to the existing TreeSitter-compatible `snake_case` names.
6+
7+
```grit
8+
engine biome(1.0)
9+
language js(typescript,jsx)
10+
11+
or {
12+
// TreeSitter-compatible pattern
13+
if_statement(),
14+
15+
// Native Biome AST node pattern
16+
JsIfStatement()
17+
} as $stmt where {
18+
register_diagnostic(
19+
span=$stmt,
20+
message="Found an if statement"
21+
)
22+
}
23+
```

crates/biome_grit_patterns/src/grit_target_language/css_target_language.rs

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
mod constants;
2+
pub mod generated_mappings;
23

34
use super::{
45
DisregardedSlotCondition, GritTargetLanguageImpl, LeafEquivalenceClass, LeafNormalizer,
@@ -11,6 +12,7 @@ use crate::{
1112
use biome_css_syntax::{CssLanguage, CssSyntaxKind};
1213
use biome_rowan::{RawSyntaxKind, SyntaxKindSet};
1314
use constants::DISREGARDED_SNIPPET_SLOTS;
15+
use generated_mappings::kind_by_name;
1416

1517
const COMMENT_KINDS: SyntaxKindSet<CssLanguage> =
1618
SyntaxKindSet::from_raw(RawSyntaxKind(CssSyntaxKind::COMMENT as u16)).union(
@@ -30,12 +32,9 @@ impl GritTargetLanguageImpl for CssTargetLanguage {
3032

3133
/// Returns the syntax kind for a node by name.
3234
///
33-
/// For compatibility with existing Grit snippets (as well as the online
34-
/// Grit playground), node names should be aligned with TreeSitter's
35-
/// `ts_language_symbol_for_name()`.
36-
fn kind_by_name(&self, _node_name: &str) -> Option<CssSyntaxKind> {
37-
// TODO: See [super::JsTargetLanguage::kind_by_name()].
38-
None
35+
/// Supports native Biome AST patterns for full language coverage.
36+
fn kind_by_name(&self, node_name: &str) -> Option<CssSyntaxKind> {
37+
kind_by_name(node_name)
3938
}
4039

4140
/// Returns the node name for a given syntax kind.
Lines changed: 204 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,204 @@
1+
//! Generated file, do not edit by hand, see `xtask/codegen`
2+
3+
//! Maps GritQL pattern names to Biome's internal syntax kinds.
4+
use biome_css_syntax as lang;
5+
use biome_rowan::AstNode;
6+
use lang::CssSyntaxKind;
7+
8+
/// Returns the syntax kind for a legacy or native node name.
9+
pub fn kind_by_name(node_name: &str) -> Option<CssSyntaxKind> {
10+
match node_name {
11+
// Native Biome AST patterns
12+
"CssAtRule" => lang::CssAtRule::KIND_SET.iter().next(),
13+
"CssAttributeMatcher" => lang::CssAttributeMatcher::KIND_SET.iter().next(),
14+
"CssAttributeMatcherValue" => lang::CssAttributeMatcherValue::KIND_SET.iter().next(),
15+
"CssAttributeName" => lang::CssAttributeName::KIND_SET.iter().next(),
16+
"CssAttributeSelector" => lang::CssAttributeSelector::KIND_SET.iter().next(),
17+
"CssBinaryExpression" => lang::CssBinaryExpression::KIND_SET.iter().next(),
18+
"CssBracketedValue" => lang::CssBracketedValue::KIND_SET.iter().next(),
19+
"CssCharsetAtRule" => lang::CssCharsetAtRule::KIND_SET.iter().next(),
20+
"CssClassSelector" => lang::CssClassSelector::KIND_SET.iter().next(),
21+
"CssColor" => lang::CssColor::KIND_SET.iter().next(),
22+
"CssColorProfileAtRule" => lang::CssColorProfileAtRule::KIND_SET.iter().next(),
23+
"CssComplexSelector" => lang::CssComplexSelector::KIND_SET.iter().next(),
24+
"CssComposesImportSpecifier" => lang::CssComposesImportSpecifier::KIND_SET.iter().next(),
25+
"CssComposesProperty" => lang::CssComposesProperty::KIND_SET.iter().next(),
26+
"CssComposesPropertyValue" => lang::CssComposesPropertyValue::KIND_SET.iter().next(),
27+
"CssCompoundSelector" => lang::CssCompoundSelector::KIND_SET.iter().next(),
28+
"CssContainerAndQuery" => lang::CssContainerAndQuery::KIND_SET.iter().next(),
29+
"CssContainerAtRule" => lang::CssContainerAtRule::KIND_SET.iter().next(),
30+
"CssContainerNotQuery" => lang::CssContainerNotQuery::KIND_SET.iter().next(),
31+
"CssContainerOrQuery" => lang::CssContainerOrQuery::KIND_SET.iter().next(),
32+
"CssContainerQueryInParens" => lang::CssContainerQueryInParens::KIND_SET.iter().next(),
33+
"CssContainerSizeFeatureInParens" => lang::CssContainerSizeFeatureInParens::KIND_SET
34+
.iter()
35+
.next(),
36+
"CssContainerStyleAndQuery" => lang::CssContainerStyleAndQuery::KIND_SET.iter().next(),
37+
"CssContainerStyleInParens" => lang::CssContainerStyleInParens::KIND_SET.iter().next(),
38+
"CssContainerStyleNotQuery" => lang::CssContainerStyleNotQuery::KIND_SET.iter().next(),
39+
"CssContainerStyleOrQuery" => lang::CssContainerStyleOrQuery::KIND_SET.iter().next(),
40+
"CssContainerStyleQueryInParens" => {
41+
lang::CssContainerStyleQueryInParens::KIND_SET.iter().next()
42+
}
43+
"CssCounterStyleAtRule" => lang::CssCounterStyleAtRule::KIND_SET.iter().next(),
44+
"CssCustomIdentifier" => lang::CssCustomIdentifier::KIND_SET.iter().next(),
45+
"CssDashedIdentifier" => lang::CssDashedIdentifier::KIND_SET.iter().next(),
46+
"CssDeclaration" => lang::CssDeclaration::KIND_SET.iter().next(),
47+
"CssDeclarationBlock" => lang::CssDeclarationBlock::KIND_SET.iter().next(),
48+
"CssDeclarationImportant" => lang::CssDeclarationImportant::KIND_SET.iter().next(),
49+
"CssDeclarationOrAtRuleBlock" => lang::CssDeclarationOrAtRuleBlock::KIND_SET.iter().next(),
50+
"CssDeclarationOrRuleBlock" => lang::CssDeclarationOrRuleBlock::KIND_SET.iter().next(),
51+
"CssDeclarationWithSemicolon" => lang::CssDeclarationWithSemicolon::KIND_SET.iter().next(),
52+
"CssDocumentAtRule" => lang::CssDocumentAtRule::KIND_SET.iter().next(),
53+
"CssDocumentCustomMatcher" => lang::CssDocumentCustomMatcher::KIND_SET.iter().next(),
54+
"CssEmptyDeclaration" => lang::CssEmptyDeclaration::KIND_SET.iter().next(),
55+
"CssFontFaceAtRule" => lang::CssFontFaceAtRule::KIND_SET.iter().next(),
56+
"CssFontFamilyName" => lang::CssFontFamilyName::KIND_SET.iter().next(),
57+
"CssFontFeatureValuesAtRule" => lang::CssFontFeatureValuesAtRule::KIND_SET.iter().next(),
58+
"CssFontFeatureValuesBlock" => lang::CssFontFeatureValuesBlock::KIND_SET.iter().next(),
59+
"CssFontFeatureValuesItem" => lang::CssFontFeatureValuesItem::KIND_SET.iter().next(),
60+
"CssFontPaletteValuesAtRule" => lang::CssFontPaletteValuesAtRule::KIND_SET.iter().next(),
61+
"CssFunction" => lang::CssFunction::KIND_SET.iter().next(),
62+
"CssGenericDelimiter" => lang::CssGenericDelimiter::KIND_SET.iter().next(),
63+
"CssGenericProperty" => lang::CssGenericProperty::KIND_SET.iter().next(),
64+
"CssIdSelector" => lang::CssIdSelector::KIND_SET.iter().next(),
65+
"CssIdentifier" => lang::CssIdentifier::KIND_SET.iter().next(),
66+
"CssImportAnonymousLayer" => lang::CssImportAnonymousLayer::KIND_SET.iter().next(),
67+
"CssImportAtRule" => lang::CssImportAtRule::KIND_SET.iter().next(),
68+
"CssImportNamedLayer" => lang::CssImportNamedLayer::KIND_SET.iter().next(),
69+
"CssImportSupports" => lang::CssImportSupports::KIND_SET.iter().next(),
70+
"CssKeyframesAtRule" => lang::CssKeyframesAtRule::KIND_SET.iter().next(),
71+
"CssKeyframesBlock" => lang::CssKeyframesBlock::KIND_SET.iter().next(),
72+
"CssKeyframesIdentSelector" => lang::CssKeyframesIdentSelector::KIND_SET.iter().next(),
73+
"CssKeyframesItem" => lang::CssKeyframesItem::KIND_SET.iter().next(),
74+
"CssKeyframesPercentageSelector" => {
75+
lang::CssKeyframesPercentageSelector::KIND_SET.iter().next()
76+
}
77+
"CssKeyframesScopeFunction" => lang::CssKeyframesScopeFunction::KIND_SET.iter().next(),
78+
"CssKeyframesScopePrefix" => lang::CssKeyframesScopePrefix::KIND_SET.iter().next(),
79+
"CssKeyframesScopedName" => lang::CssKeyframesScopedName::KIND_SET.iter().next(),
80+
"CssLayerAtRule" => lang::CssLayerAtRule::KIND_SET.iter().next(),
81+
"CssLayerDeclaration" => lang::CssLayerDeclaration::KIND_SET.iter().next(),
82+
"CssLayerReference" => lang::CssLayerReference::KIND_SET.iter().next(),
83+
"CssMarginAtRule" => lang::CssMarginAtRule::KIND_SET.iter().next(),
84+
"CssMediaAndCondition" => lang::CssMediaAndCondition::KIND_SET.iter().next(),
85+
"CssMediaAndTypeQuery" => lang::CssMediaAndTypeQuery::KIND_SET.iter().next(),
86+
"CssMediaAtRule" => lang::CssMediaAtRule::KIND_SET.iter().next(),
87+
"CssMediaConditionInParens" => lang::CssMediaConditionInParens::KIND_SET.iter().next(),
88+
"CssMediaConditionQuery" => lang::CssMediaConditionQuery::KIND_SET.iter().next(),
89+
"CssMediaFeatureInParens" => lang::CssMediaFeatureInParens::KIND_SET.iter().next(),
90+
"CssMediaNotCondition" => lang::CssMediaNotCondition::KIND_SET.iter().next(),
91+
"CssMediaOrCondition" => lang::CssMediaOrCondition::KIND_SET.iter().next(),
92+
"CssMediaType" => lang::CssMediaType::KIND_SET.iter().next(),
93+
"CssMediaTypeQuery" => lang::CssMediaTypeQuery::KIND_SET.iter().next(),
94+
"CssMetavariable" => lang::CssMetavariable::KIND_SET.iter().next(),
95+
"CssNamedNamespacePrefix" => lang::CssNamedNamespacePrefix::KIND_SET.iter().next(),
96+
"CssNamespace" => lang::CssNamespace::KIND_SET.iter().next(),
97+
"CssNamespaceAtRule" => lang::CssNamespaceAtRule::KIND_SET.iter().next(),
98+
"CssNestedQualifiedRule" => lang::CssNestedQualifiedRule::KIND_SET.iter().next(),
99+
"CssNestedSelector" => lang::CssNestedSelector::KIND_SET.iter().next(),
100+
"CssNthOffset" => lang::CssNthOffset::KIND_SET.iter().next(),
101+
"CssNumber" => lang::CssNumber::KIND_SET.iter().next(),
102+
"CssPageAtRule" => lang::CssPageAtRule::KIND_SET.iter().next(),
103+
"CssPageAtRuleBlock" => lang::CssPageAtRuleBlock::KIND_SET.iter().next(),
104+
"CssPageSelector" => lang::CssPageSelector::KIND_SET.iter().next(),
105+
"CssPageSelectorPseudo" => lang::CssPageSelectorPseudo::KIND_SET.iter().next(),
106+
"CssParameter" => lang::CssParameter::KIND_SET.iter().next(),
107+
"CssParenthesizedExpression" => lang::CssParenthesizedExpression::KIND_SET.iter().next(),
108+
"CssPercentage" => lang::CssPercentage::KIND_SET.iter().next(),
109+
"CssPositionTryAtRule" => lang::CssPositionTryAtRule::KIND_SET.iter().next(),
110+
"CssPropertyAtRule" => lang::CssPropertyAtRule::KIND_SET.iter().next(),
111+
"CssPseudoClassFunctionCompoundSelector" => {
112+
lang::CssPseudoClassFunctionCompoundSelector::KIND_SET
113+
.iter()
114+
.next()
115+
}
116+
"CssPseudoClassFunctionIdentifier" => lang::CssPseudoClassFunctionIdentifier::KIND_SET
117+
.iter()
118+
.next(),
119+
"CssPseudoClassFunctionNth" => lang::CssPseudoClassFunctionNth::KIND_SET.iter().next(),
120+
"CssPseudoClassFunctionSelector" => {
121+
lang::CssPseudoClassFunctionSelector::KIND_SET.iter().next()
122+
}
123+
"CssPseudoClassIdentifier" => lang::CssPseudoClassIdentifier::KIND_SET.iter().next(),
124+
"CssPseudoClassNth" => lang::CssPseudoClassNth::KIND_SET.iter().next(),
125+
"CssPseudoClassNthIdentifier" => lang::CssPseudoClassNthIdentifier::KIND_SET.iter().next(),
126+
"CssPseudoClassNthNumber" => lang::CssPseudoClassNthNumber::KIND_SET.iter().next(),
127+
"CssPseudoClassNthSelector" => lang::CssPseudoClassNthSelector::KIND_SET.iter().next(),
128+
"CssPseudoClassOfNthSelector" => lang::CssPseudoClassOfNthSelector::KIND_SET.iter().next(),
129+
"CssPseudoClassSelector" => lang::CssPseudoClassSelector::KIND_SET.iter().next(),
130+
"CssPseudoElementFunction" => lang::CssPseudoElementFunction::KIND_SET.iter().next(),
131+
"CssPseudoElementFunctionCustomIdentifier" => {
132+
lang::CssPseudoElementFunctionCustomIdentifier::KIND_SET
133+
.iter()
134+
.next()
135+
}
136+
"CssPseudoElementFunctionSelector" => lang::CssPseudoElementFunctionSelector::KIND_SET
137+
.iter()
138+
.next(),
139+
"CssPseudoElementIdentifier" => lang::CssPseudoElementIdentifier::KIND_SET.iter().next(),
140+
"CssPseudoElementSelector" => lang::CssPseudoElementSelector::KIND_SET.iter().next(),
141+
"CssQualifiedRule" => lang::CssQualifiedRule::KIND_SET.iter().next(),
142+
"CssQueryFeatureBoolean" => lang::CssQueryFeatureBoolean::KIND_SET.iter().next(),
143+
"CssQueryFeaturePlain" => lang::CssQueryFeaturePlain::KIND_SET.iter().next(),
144+
"CssQueryFeatureRange" => lang::CssQueryFeatureRange::KIND_SET.iter().next(),
145+
"CssQueryFeatureRangeComparison" => {
146+
lang::CssQueryFeatureRangeComparison::KIND_SET.iter().next()
147+
}
148+
"CssQueryFeatureRangeInterval" => {
149+
lang::CssQueryFeatureRangeInterval::KIND_SET.iter().next()
150+
}
151+
"CssQueryFeatureReverseRange" => lang::CssQueryFeatureReverseRange::KIND_SET.iter().next(),
152+
"CssRatio" => lang::CssRatio::KIND_SET.iter().next(),
153+
"CssRegularDimension" => lang::CssRegularDimension::KIND_SET.iter().next(),
154+
"CssRelativeSelector" => lang::CssRelativeSelector::KIND_SET.iter().next(),
155+
"CssRoot" => lang::CssRoot::KIND_SET.iter().next(),
156+
"CssRuleBlock" => lang::CssRuleBlock::KIND_SET.iter().next(),
157+
"CssScopeAtRule" => lang::CssScopeAtRule::KIND_SET.iter().next(),
158+
"CssScopeEdge" => lang::CssScopeEdge::KIND_SET.iter().next(),
159+
"CssScopeRangeEnd" => lang::CssScopeRangeEnd::KIND_SET.iter().next(),
160+
"CssScopeRangeInterval" => lang::CssScopeRangeInterval::KIND_SET.iter().next(),
161+
"CssScopeRangeStart" => lang::CssScopeRangeStart::KIND_SET.iter().next(),
162+
"CssStartingStyleAtRule" => lang::CssStartingStyleAtRule::KIND_SET.iter().next(),
163+
"CssString" => lang::CssString::KIND_SET.iter().next(),
164+
"CssSupportsAndCondition" => lang::CssSupportsAndCondition::KIND_SET.iter().next(),
165+
"CssSupportsAtRule" => lang::CssSupportsAtRule::KIND_SET.iter().next(),
166+
"CssSupportsConditionInParens" => {
167+
lang::CssSupportsConditionInParens::KIND_SET.iter().next()
168+
}
169+
"CssSupportsFeatureDeclaration" => {
170+
lang::CssSupportsFeatureDeclaration::KIND_SET.iter().next()
171+
}
172+
"CssSupportsFeatureSelector" => lang::CssSupportsFeatureSelector::KIND_SET.iter().next(),
173+
"CssSupportsNotCondition" => lang::CssSupportsNotCondition::KIND_SET.iter().next(),
174+
"CssSupportsOrCondition" => lang::CssSupportsOrCondition::KIND_SET.iter().next(),
175+
"CssTypeSelector" => lang::CssTypeSelector::KIND_SET.iter().next(),
176+
"CssUnicodeCodepoint" => lang::CssUnicodeCodepoint::KIND_SET.iter().next(),
177+
"CssUnicodeRange" => lang::CssUnicodeRange::KIND_SET.iter().next(),
178+
"CssUnicodeRangeInterval" => lang::CssUnicodeRangeInterval::KIND_SET.iter().next(),
179+
"CssUnicodeRangeWildcard" => lang::CssUnicodeRangeWildcard::KIND_SET.iter().next(),
180+
"CssUniversalNamespacePrefix" => lang::CssUniversalNamespacePrefix::KIND_SET.iter().next(),
181+
"CssUniversalSelector" => lang::CssUniversalSelector::KIND_SET.iter().next(),
182+
"CssUnknownBlockAtRule" => lang::CssUnknownBlockAtRule::KIND_SET.iter().next(),
183+
"CssUnknownDimension" => lang::CssUnknownDimension::KIND_SET.iter().next(),
184+
"CssUnknownValueAtRule" => lang::CssUnknownValueAtRule::KIND_SET.iter().next(),
185+
"CssUrlFunction" => lang::CssUrlFunction::KIND_SET.iter().next(),
186+
"CssUrlValueRaw" => lang::CssUrlValueRaw::KIND_SET.iter().next(),
187+
"CssValueAtRule" => lang::CssValueAtRule::KIND_SET.iter().next(),
188+
"CssValueAtRuleDeclarationClause" => lang::CssValueAtRuleDeclarationClause::KIND_SET
189+
.iter()
190+
.next(),
191+
"CssValueAtRuleGenericProperty" => {
192+
lang::CssValueAtRuleGenericProperty::KIND_SET.iter().next()
193+
}
194+
"CssValueAtRuleImportClause" => lang::CssValueAtRuleImportClause::KIND_SET.iter().next(),
195+
"CssValueAtRuleImportSpecifier" => {
196+
lang::CssValueAtRuleImportSpecifier::KIND_SET.iter().next()
197+
}
198+
"CssValueAtRuleNamedImportSpecifier" => lang::CssValueAtRuleNamedImportSpecifier::KIND_SET
199+
.iter()
200+
.next(),
201+
"CssViewTransitionAtRule" => lang::CssViewTransitionAtRule::KIND_SET.iter().next(),
202+
_ => None,
203+
}
204+
}

0 commit comments

Comments
 (0)