Skip to content

Commit 4401976

Browse files
authored
[v2] move terminal versioning to parent items instead of child definitions (#1461)
- Promoted `TokenDefinition::enabled` to `TokenItem::enabled`, as the new lexer doesn't version individual definitions (all of them are matched in all versions). We can decide on whether to keep or remove the additional `TokenDefinition` structure after we consider how to handle post-lexing processing (e.g. `DecimalLiteral` and `YulIdentifier` version breaks). - Promoted `KeywordDefinition::enabled` to `KeywordItem::enabled`, as the new lexer doesn't version individual definitions (all of them are matched in all versions). We can decide on whether to keep or remove the additional `KeywordDefinition` structure after we consider how to handle variations in `reserved` status between them (mainly the four `*fixed*` keywords). > NOTE: this is a set of PRs to add the lexer v2, to make reviewing smaller chunks easier: > > 1. #1457 > 2. #1458 > 3. #1459 > 4. #1460 > 5. #1461 > 6. #1462
1 parent 64ab2a9 commit 4401976

File tree

25 files changed

+446
-720
lines changed

25 files changed

+446
-720
lines changed

crates/language-v2/definition/src/compiler/analysis/p1_definitions.rs

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -224,14 +224,10 @@ fn calculate_defined_in(analysis: &mut Analysis, item: &SpannedItem) -> VersionS
224224
try_add_specifier(&None);
225225
}
226226
SpannedItem::Keyword { item } => {
227-
for definition in &item.definitions {
228-
try_add_specifier(&definition.enabled);
229-
}
227+
try_add_specifier(&item.enabled);
230228
}
231229
SpannedItem::Token { item } => {
232-
for definition in &item.definitions {
233-
try_add_specifier(&definition.enabled);
234-
}
230+
try_add_specifier(&item.enabled);
235231
}
236232
SpannedItem::Fragment { item } => {
237233
try_add_specifier(&item.enabled);

crates/language-v2/definition/src/compiler/analysis/p2_version_specifiers.rs

Lines changed: 9 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ use crate::model::{
1111
SpannedEnumItem, SpannedEnumVariant, SpannedField, SpannedFragmentItem, SpannedItem,
1212
SpannedKeywordDefinition, SpannedKeywordItem, SpannedPrecedenceExpression,
1313
SpannedPrecedenceItem, SpannedPrecedenceOperator, SpannedPrimaryExpression,
14-
SpannedRepeatedItem, SpannedSeparatedItem, SpannedStructItem, SpannedTokenDefinition,
15-
SpannedTokenItem, SpannedVersionSpecifier,
14+
SpannedRepeatedItem, SpannedSeparatedItem, SpannedStructItem, SpannedTokenItem,
15+
SpannedVersionSpecifier,
1616
};
1717

1818
pub(crate) fn run(analysis: &mut Analysis) {
@@ -169,35 +169,27 @@ fn check_keyword(analysis: &mut Analysis, item: &SpannedKeywordItem) {
169169
let SpannedKeywordItem {
170170
name: _,
171171
identifier: _,
172+
enabled,
172173
definitions,
173174
} = item;
174175

176+
check_version_specifier(analysis, enabled.as_ref());
177+
175178
for definition in definitions {
176-
let SpannedKeywordDefinition {
177-
enabled,
178-
reserved,
179-
value: _,
180-
} = definition;
179+
let SpannedKeywordDefinition { reserved, value: _ } = definition;
181180

182-
check_version_specifier(analysis, enabled.as_ref());
183181
check_version_specifier(analysis, reserved.as_ref());
184182
}
185183
}
186184

187185
fn check_token(analysis: &mut Analysis, item: &SpannedTokenItem) {
188186
let SpannedTokenItem {
189187
name: _,
190-
definitions,
188+
enabled,
189+
definitions: _,
191190
} = item;
192191

193-
for definition in definitions {
194-
let SpannedTokenDefinition {
195-
enabled,
196-
scanner: _,
197-
} = definition;
198-
199-
check_version_specifier(analysis, enabled.as_ref());
200-
}
192+
check_version_specifier(analysis, enabled.as_ref());
201193
}
202194

203195
fn check_fragment(analysis: &mut Analysis, item: &SpannedFragmentItem) {

crates/language-v2/definition/src/compiler/analysis/p3_references.rs

Lines changed: 16 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,10 @@ use crate::model::SpannedItemDiscriminants::{
1212
use crate::model::{
1313
Identifier, SpannedBuiltIn, SpannedBuiltInField, SpannedBuiltInFunction, SpannedBuiltInType,
1414
SpannedEnumItem, SpannedEnumVariant, SpannedField, SpannedFragmentItem, SpannedItem,
15-
SpannedKeywordDefinition, SpannedKeywordItem, SpannedPrecedenceExpression,
16-
SpannedPrecedenceItem, SpannedPrecedenceOperator, SpannedPrimaryExpression,
17-
SpannedRepeatedItem, SpannedScanner, SpannedSeparatedItem, SpannedStructItem,
18-
SpannedTokenDefinition, SpannedTokenItem, SpannedTriviaItem, SpannedTriviaParser,
19-
SpannedVersionSpecifier,
15+
SpannedKeywordItem, SpannedPrecedenceExpression, SpannedPrecedenceItem,
16+
SpannedPrecedenceOperator, SpannedPrimaryExpression, SpannedRepeatedItem, SpannedScanner,
17+
SpannedSeparatedItem, SpannedStructItem, SpannedTokenDefinition, SpannedTokenItem,
18+
SpannedTriviaItem, SpannedTriviaParser, SpannedVersionSpecifier,
2019
};
2120

2221
pub(crate) fn run(analysis: &mut Analysis) {
@@ -299,29 +298,26 @@ fn check_keyword(analysis: &mut Analysis, item: &SpannedKeywordItem, enablement:
299298
let SpannedKeywordItem {
300299
name,
301300
identifier,
302-
definitions,
301+
enabled,
302+
definitions: _,
303303
} = item;
304304

305-
check_reference(analysis, Some(name), identifier, enablement, &[Token]);
306-
307-
for definition in definitions {
308-
let SpannedKeywordDefinition {
309-
enabled,
310-
reserved: _,
311-
value: _,
312-
} = definition;
305+
let enablement = update_enablement(analysis, enablement, enabled.as_ref());
313306

314-
let _ = update_enablement(analysis, enablement, enabled.as_ref());
315-
}
307+
check_reference(analysis, Some(name), identifier, &enablement, &[Token]);
316308
}
317309

318310
fn check_token(analysis: &mut Analysis, item: &SpannedTokenItem, enablement: &VersionSet) {
319-
let SpannedTokenItem { name, definitions } = item;
311+
let SpannedTokenItem {
312+
name,
313+
enabled,
314+
definitions,
315+
} = item;
320316

321-
for definition in definitions {
322-
let SpannedTokenDefinition { enabled, scanner } = definition;
317+
let enablement = update_enablement(analysis, enablement, enabled.as_ref());
323318

324-
let enablement = update_enablement(analysis, enablement, enabled.as_ref());
319+
for definition in definitions {
320+
let SpannedTokenDefinition { scanner } = definition;
325321

326322
check_scanner(analysis, Some(name), scanner, &enablement);
327323
}

crates/language-v2/definition/src/model/manifest.rs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -88,15 +88,13 @@ impl Language {
8888
}
8989
}
9090
Item::Keyword { item } => {
91+
add_spec(&item.enabled);
9192
for definition in &item.definitions {
92-
add_spec(&definition.enabled);
9393
add_spec(&definition.reserved);
9494
}
9595
}
9696
Item::Token { item } => {
97-
for definition in &item.definitions {
98-
add_spec(&definition.enabled);
99-
}
97+
add_spec(&item.enabled);
10098
}
10199
Item::Fragment { item } => add_spec(&item.enabled),
102100
Item::Trivia { .. } => {}

crates/language-v2/definition/src/model/terminals/keyword.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@ pub struct KeywordItem {
1010
pub name: Identifier,
1111
pub identifier: Identifier,
1212

13+
#[serde(skip_serializing_if = "Option::is_none")]
14+
pub enabled: Option<VersionSpecifier>,
15+
1316
pub definitions: Vec<KeywordDefinition>,
1417
}
1518

@@ -24,9 +27,6 @@ impl KeywordItem {
2427
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
2528
#[derive_spanned_type(Clone, Debug, ParseInputTokens, WriteOutputTokens)]
2629
pub struct KeywordDefinition {
27-
#[serde(skip_serializing_if = "Option::is_none")]
28-
pub enabled: Option<VersionSpecifier>,
29-
3030
/// When the keyword is reserved, i.e. can't be used in other position (e.g. as a name)
3131
#[serde(skip_serializing_if = "Option::is_none")]
3232
pub reserved: Option<VersionSpecifier>,

crates/language-v2/definition/src/model/terminals/token.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@ use crate::model::{Identifier, Scanner, VersionSpecifier};
88
pub struct TokenItem {
99
pub name: Identifier,
1010

11+
#[serde(skip_serializing_if = "Option::is_none")]
12+
pub enabled: Option<VersionSpecifier>,
13+
1114
pub definitions: Vec<TokenDefinition>,
1215
}
1316

@@ -22,9 +25,6 @@ impl TokenItem {
2225
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
2326
#[derive_spanned_type(Clone, Debug, ParseInputTokens, WriteOutputTokens)]
2427
pub struct TokenDefinition {
25-
#[serde(skip_serializing_if = "Option::is_none")]
26-
pub enabled: Option<VersionSpecifier>,
27-
2828
pub scanner: Scanner,
2929
}
3030

crates/language-v2/tests/src/fail/p0_parsing/duplicate_map_key/test.rs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,7 @@ language_v2_macros::compile!(Language(
2121
field_3 = Required(Baz)
2222
)
2323
),
24-
Token(
25-
name = Baz,
26-
definitions = [TokenDefinition(scanner = Atom("baz"))]
27-
)
24+
Token(name = Baz, definitions = [TokenDefinition(Atom("baz"))])
2825
]
2926
)]
3027
)],

crates/language-v2/tests/src/fail/p0_parsing/duplicate_set_entry/test.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ language_v2_macros::compile!(Language(
1414
lexical_context = Foo,
1515
items = [Token(
1616
name = Bar,
17-
definitions = [TokenDefinition(scanner = Atom("bar"))]
17+
definitions = [TokenDefinition(Atom("bar"))]
1818
)]
1919
)]
2020
)],

crates/language-v2/tests/src/fail/p0_parsing/empty_string/test.rs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,7 @@ language_v2_macros::compile!(Language(
1212
topics = [Topic(
1313
title = "Topic One",
1414
lexical_context = Foo,
15-
items = [Token(
16-
name = Bar,
17-
definitions = [TokenDefinition(scanner = Atom(""))]
18-
)]
15+
items = [Token(name = Bar, definitions = [TokenDefinition(Atom(""))])]
1916
)]
2017
)],
2118
built_ins = []
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
error: Expected a non-empty string.
2-
--> src/fail/p0_parsing/empty_string/test.rs:17:63
2+
--> src/fail/p0_parsing/empty_string/test.rs:15:76
33
|
4-
17 | definitions = [TokenDefinition(scanner = Atom(""))]
5-
| ^^
4+
15 | items = [Token(name = Bar, definitions = [TokenDefinition(Atom(""))])]
5+
| ^^

0 commit comments

Comments
 (0)