From bb7b339ae24fb66ea382ff1ca2356ae655db3ab9 Mon Sep 17 00:00:00 2001 From: Antonin Delpeuch Date: Thu, 3 Jul 2025 16:13:35 +0200 Subject: [PATCH] Fix 'extra' field generation for node-types.json (cherry picked from commit 1a3b0375faf3ca5000cfe53f318dbb2cd609ea46) --- cli/generate/src/node_types.rs | 53 +++++++++++++++++----------------- 1 file changed, 27 insertions(+), 26 deletions(-) diff --git a/cli/generate/src/node_types.rs b/cli/generate/src/node_types.rs index 759af5a2..b5867c6e 100644 --- a/cli/generate/src/node_types.rs +++ b/cli/generate/src/node_types.rs @@ -507,6 +507,31 @@ pub fn generate_node_types_json( let aliases_by_symbol = get_aliases_by_symbol(syntax_grammar, default_aliases); + let empty = HashSet::new(); + let extra_names = syntax_grammar + .extra_symbols + .iter() + .flat_map(|symbol| { + aliases_by_symbol + .get(symbol) + .unwrap_or(&empty) + .iter() + .map(|alias| { + alias.as_ref().map_or( + match symbol.kind { + SymbolType::NonTerminal => &syntax_grammar.variables[symbol.index].name, + SymbolType::Terminal => &lexical_grammar.variables[symbol.index].name, + SymbolType::External => { + &syntax_grammar.external_tokens[symbol.index].name + } + _ => unreachable!(), + }, + |alias| &alias.value, + ) + }) + }) + .collect::>(); + let mut subtype_map = Vec::new(); for (i, info) in variable_info.iter().enumerate() { let symbol = Symbol::non_terminal(i); @@ -519,7 +544,7 @@ pub fn generate_node_types_json( kind: variable.name.clone(), named: true, root: false, - extra: false, + extra: extra_names.contains(&variable.name), fields: None, children: None, subtypes: None, @@ -563,7 +588,7 @@ pub fn generate_node_types_json( kind: kind.clone(), named: is_named, root: i == 0, - extra: false, + extra: extra_names.contains(&kind), fields: Some(BTreeMap::new()), children: None, subtypes: None, @@ -634,7 +659,6 @@ pub fn generate_node_types_json( let mut anonymous_node_types = Vec::new(); - let empty = HashSet::new(); let regular_tokens = lexical_grammar .variables .iter() @@ -668,29 +692,6 @@ pub fn generate_node_types_json( }) }) }); - let extra_names = syntax_grammar - .extra_symbols - .iter() - .flat_map(|symbol| { - aliases_by_symbol - .get(symbol) - .unwrap_or(&empty) - .iter() - .map(|alias| { - alias.as_ref().map_or( - match symbol.kind { - SymbolType::NonTerminal => &syntax_grammar.variables[symbol.index].name, - SymbolType::Terminal => &lexical_grammar.variables[symbol.index].name, - SymbolType::External => { - &syntax_grammar.external_tokens[symbol.index].name - } - _ => unreachable!(), - }, - |alias| &alias.value, - ) - }) - }) - .collect::>(); for (name, kind) in regular_tokens.chain(external_tokens) { match kind {