Skip to content

Commit b26adf4

Browse files
committed
feat(generate): add an extra field for extra nodes in node-types.json
1 parent f941277 commit b26adf4

File tree

1 file changed

+48
-0
lines changed

1 file changed

+48
-0
lines changed

cli/generate/src/node_types.rs

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ pub struct NodeInfoJSON {
3939
named: bool,
4040
#[serde(skip_serializing_if = "std::ops::Not::not")]
4141
root: bool,
42+
#[serde(skip_serializing_if = "std::ops::Not::not")]
43+
extra: bool,
4244
#[serde(skip_serializing_if = "Option::is_none")]
4345
fields: Option<BTreeMap<String, FieldInfoJSON>>,
4446
#[serde(skip_serializing_if = "Option::is_none")]
@@ -517,6 +519,7 @@ pub fn generate_node_types_json(
517519
kind: variable.name.clone(),
518520
named: true,
519521
root: false,
522+
extra: false,
520523
fields: None,
521524
children: None,
522525
subtypes: None,
@@ -560,6 +563,7 @@ pub fn generate_node_types_json(
560563
kind: kind.clone(),
561564
named: is_named,
562565
root: i == 0,
566+
extra: false,
563567
fields: Some(BTreeMap::new()),
564568
children: None,
565569
subtypes: None,
@@ -664,6 +668,29 @@ pub fn generate_node_types_json(
664668
})
665669
})
666670
});
671+
let extra_names = syntax_grammar
672+
.extra_symbols
673+
.iter()
674+
.flat_map(|symbol| {
675+
aliases_by_symbol
676+
.get(symbol)
677+
.unwrap_or(&empty)
678+
.iter()
679+
.map(|alias| {
680+
alias.as_ref().map_or(
681+
match symbol.kind {
682+
SymbolType::NonTerminal => &syntax_grammar.variables[symbol.index].name,
683+
SymbolType::Terminal => &lexical_grammar.variables[symbol.index].name,
684+
SymbolType::External => {
685+
&syntax_grammar.external_tokens[symbol.index].name
686+
}
687+
_ => unreachable!(),
688+
},
689+
|alias| &alias.value,
690+
)
691+
})
692+
})
693+
.collect::<HashSet<_>>();
667694

668695
for (name, kind) in regular_tokens.chain(external_tokens) {
669696
match kind {
@@ -675,6 +702,7 @@ pub fn generate_node_types_json(
675702
kind: name.clone(),
676703
named: true,
677704
root: false,
705+
extra: extra_names.contains(&name),
678706
fields: None,
679707
children: None,
680708
subtypes: None,
@@ -692,6 +720,7 @@ pub fn generate_node_types_json(
692720
kind: name.clone(),
693721
named: false,
694722
root: false,
723+
extra: extra_names.contains(&name),
695724
fields: None,
696725
children: None,
697726
subtypes: None,
@@ -810,6 +839,7 @@ mod tests {
810839
kind: "v1".to_string(),
811840
named: true,
812841
root: true,
842+
extra: false,
813843
subtypes: None,
814844
children: None,
815845
fields: Some(
@@ -848,6 +878,7 @@ mod tests {
848878
kind: ";".to_string(),
849879
named: false,
850880
root: false,
881+
extra: false,
851882
subtypes: None,
852883
children: None,
853884
fields: None
@@ -859,6 +890,7 @@ mod tests {
859890
kind: "v2".to_string(),
860891
named: true,
861892
root: false,
893+
extra: false,
862894
subtypes: None,
863895
children: None,
864896
fields: None
@@ -904,6 +936,7 @@ mod tests {
904936
kind: "v1".to_string(),
905937
named: true,
906938
root: true,
939+
extra: false,
907940
subtypes: None,
908941
children: None,
909942
fields: Some(
@@ -942,6 +975,7 @@ mod tests {
942975
kind: ";".to_string(),
943976
named: false,
944977
root: false,
978+
extra: false,
945979
subtypes: None,
946980
children: None,
947981
fields: None
@@ -953,6 +987,7 @@ mod tests {
953987
kind: "v2".to_string(),
954988
named: true,
955989
root: false,
990+
extra: false,
956991
subtypes: None,
957992
children: None,
958993
fields: None
@@ -964,6 +999,7 @@ mod tests {
964999
kind: "v3".to_string(),
9651000
named: true,
9661001
root: false,
1002+
extra: true,
9671003
subtypes: None,
9681004
children: None,
9691005
fields: None
@@ -1010,6 +1046,7 @@ mod tests {
10101046
kind: "_v2".to_string(),
10111047
named: true,
10121048
root: false,
1049+
extra: false,
10131050
fields: None,
10141051
children: None,
10151052
subtypes: Some(vec![
@@ -1034,6 +1071,7 @@ mod tests {
10341071
kind: "v1".to_string(),
10351072
named: true,
10361073
root: true,
1074+
extra: false,
10371075
subtypes: None,
10381076
children: None,
10391077
fields: Some(
@@ -1097,6 +1135,7 @@ mod tests {
10971135
kind: "v1".to_string(),
10981136
named: true,
10991137
root: true,
1138+
extra: false,
11001139
subtypes: None,
11011140
children: Some(FieldInfoJSON {
11021141
multiple: true,
@@ -1135,6 +1174,7 @@ mod tests {
11351174
kind: "v2".to_string(),
11361175
named: true,
11371176
root: false,
1177+
extra: false,
11381178
subtypes: None,
11391179
children: Some(FieldInfoJSON {
11401180
multiple: false,
@@ -1180,6 +1220,7 @@ mod tests {
11801220
kind: "v1".to_string(),
11811221
named: true,
11821222
root: true,
1223+
extra: false,
11831224
subtypes: None,
11841225
children: Some(FieldInfoJSON {
11851226
multiple: true,
@@ -1254,6 +1295,7 @@ mod tests {
12541295
kind: "identifier".to_string(),
12551296
named: true,
12561297
root: false,
1298+
extra: false,
12571299
subtypes: None,
12581300
children: None,
12591301
fields: None,
@@ -1265,6 +1307,7 @@ mod tests {
12651307
kind: "type_identifier".to_string(),
12661308
named: true,
12671309
root: false,
1310+
extra: false,
12681311
subtypes: None,
12691312
children: None,
12701313
fields: None,
@@ -1307,6 +1350,7 @@ mod tests {
13071350
kind: "a".to_string(),
13081351
named: true,
13091352
root: true,
1353+
extra: false,
13101354
subtypes: None,
13111355
children: Some(FieldInfoJSON {
13121356
multiple: true,
@@ -1355,6 +1399,7 @@ mod tests {
13551399
kind: "script".to_string(),
13561400
named: true,
13571401
root: true,
1402+
extra: false,
13581403
fields: Some(BTreeMap::new()),
13591404
children: None,
13601405
subtypes: None
@@ -1412,6 +1457,7 @@ mod tests {
14121457
kind: "a".to_string(),
14131458
named: true,
14141459
root: false,
1460+
extra: false,
14151461
subtypes: None,
14161462
children: None,
14171463
fields: Some(
@@ -1468,6 +1514,7 @@ mod tests {
14681514
kind: "script".to_string(),
14691515
named: true,
14701516
root: true,
1517+
extra: false,
14711518
subtypes: None,
14721519
// Only one node
14731520
children: Some(FieldInfoJSON {
@@ -1523,6 +1570,7 @@ mod tests {
15231570
kind: "b".to_string(),
15241571
named: true,
15251572
root: false,
1573+
extra: false,
15261574
subtypes: None,
15271575
children: Some(FieldInfoJSON {
15281576
multiple: true,

0 commit comments

Comments
 (0)