From 4519e2b8ccb27d80c1eaf2ba5a726f44e1b0edc5 Mon Sep 17 00:00:00 2001 From: bglgwyng Date: Fri, 7 Nov 2025 16:46:52 +0900 Subject: [PATCH] feat: add symbol_id field to node type JSON output - Added symbol_id as optional field in NodeTypeJSON struct for tracking grammar symbols - Threaded symbol_ids HashMap through generate_node_types_json function to populate symbol IDs - Updated all test assertions to include symbol_id: None for backward compatibility --- crates/generate/src/generate.rs | 1 + crates/generate/src/node_types.rs | 75 ++++++++++++++++++++++--------- 2 files changed, 55 insertions(+), 21 deletions(-) diff --git a/crates/generate/src/generate.rs b/crates/generate/src/generate.rs index 3223ddd3..e432b9fe 100644 --- a/crates/generate/src/generate.rs +++ b/crates/generate/src/generate.rs @@ -296,6 +296,7 @@ where &lexical_grammar, &simple_aliases, &variable_info, + &symbol_ids, )?; write_file( diff --git a/crates/generate/src/node_types.rs b/crates/generate/src/node_types.rs index 0a964105..aaf57ccd 100644 --- a/crates/generate/src/node_types.rs +++ b/crates/generate/src/node_types.rs @@ -45,6 +45,8 @@ pub struct NodeInfoJSON { children: Option, #[serde(skip_serializing_if = "Option::is_none")] subtypes: Option>, + #[serde(skip_serializing_if = "Option::is_none")] + symbol_id: Option, } #[derive(Clone, Debug, Serialize, PartialEq, Eq, PartialOrd, Ord, Hash)] @@ -473,6 +475,7 @@ pub fn generate_node_types_json( lexical_grammar: &LexicalGrammar, default_aliases: &AliasMap, variable_info: &[VariableInfo], + symbol_ids: &HashMap, ) -> SuperTypeCycleResult> { let mut node_types_json = BTreeMap::new(); @@ -572,6 +575,7 @@ pub fn generate_node_types_json( fields: None, children: None, subtypes: None, + symbol_id: symbol_ids.get(&symbol).cloned(), }); let mut subtypes = info .children @@ -616,6 +620,7 @@ pub fn generate_node_types_json( fields: Some(BTreeMap::new()), children: None, subtypes: None, + symbol_id: symbol_ids.get(&symbol).cloned(), } }); @@ -706,15 +711,16 @@ pub fn generate_node_types_json( .iter() .enumerate() .flat_map(|(i, variable)| { + let symbol = Symbol::terminal(i); aliases_by_symbol - .get(&Symbol::terminal(i)) + .get(&symbol) .unwrap_or(&empty) .iter() .map(move |alias| { alias .as_ref() - .map_or((&variable.name, variable.kind), |alias| { - (&alias.value, alias.kind()) + .map_or((&variable.name, variable.kind, symbol), |alias| { + (&alias.value, alias.kind(), symbol) }) }) }); @@ -724,18 +730,19 @@ pub fn generate_node_types_json( .iter() .enumerate() .flat_map(|(i, token)| { + let symbol = Symbol::external(i); aliases_by_symbol - .get(&Symbol::external(i)) + .get(&symbol) .unwrap_or(&empty) .iter() .map(move |alias| { - alias.as_ref().map_or((&token.name, token.kind), |alias| { - (&alias.value, alias.kind()) + alias.as_ref().map_or((&token.name, token.kind, symbol), |alias| { + (&alias.value, alias.kind(), symbol) }) }) }); - for (name, kind) in regular_tokens.chain(external_tokens) { + for (name, kind, symbol) in regular_tokens.chain(external_tokens) { match kind { VariableType::Named => { let node_type_json = @@ -749,6 +756,7 @@ pub fn generate_node_types_json( fields: None, children: None, subtypes: None, + symbol_id: symbol_ids.get(&symbol).cloned(), }); if let Some(children) = &mut node_type_json.children { children.required = false; @@ -767,6 +775,7 @@ pub fn generate_node_types_json( fields: None, children: None, subtypes: None, + symbol_id: symbol_ids.get(&symbol).cloned(), }), _ => {} } @@ -917,7 +926,8 @@ mod tests { ] .into_iter() .collect() - ) + ), + symbol_id: None, } ); assert_eq!( @@ -929,7 +939,8 @@ mod tests { extra: false, subtypes: None, children: None, - fields: None + fields: None, + symbol_id: None, } ); assert_eq!( @@ -941,7 +952,8 @@ mod tests { extra: false, subtypes: None, children: None, - fields: None + fields: None, + symbol_id: None, } ); } @@ -1017,7 +1029,8 @@ mod tests { ] .into_iter() .collect() - ) + ), + symbol_id: None, } ); assert_eq!( @@ -1029,7 +1042,8 @@ mod tests { extra: false, subtypes: None, children: None, - fields: None + fields: None, + symbol_id: None, } ); assert_eq!( @@ -1041,7 +1055,8 @@ mod tests { extra: false, subtypes: None, children: None, - fields: None + fields: None, + symbol_id: None, } ); assert_eq!( @@ -1053,7 +1068,8 @@ mod tests { extra: true, subtypes: None, children: None, - fields: None + fields: None, + symbol_id: None, } ); } @@ -1129,7 +1145,8 @@ mod tests { ] .into_iter() .collect() - ) + ), + symbol_id: None, } ); assert_eq!( @@ -1141,7 +1158,8 @@ mod tests { extra: true, subtypes: None, children: None, - fields: Some(BTreeMap::default()) + fields: Some(BTreeMap::default()), + symbol_id: None, } ); assert_eq!( @@ -1153,7 +1171,8 @@ mod tests { extra: false, subtypes: None, children: None, - fields: None + fields: None, + symbol_id: None, } ); assert_eq!( @@ -1165,7 +1184,8 @@ mod tests { extra: false, subtypes: None, children: None, - fields: None + fields: None, + symbol_id: None, } ); } @@ -1227,6 +1247,7 @@ mod tests { named: true, }, ]), + symbol_id: None, } ); assert_eq!( @@ -1252,7 +1273,8 @@ mod tests { ),] .into_iter() .collect() - ) + ), + symbol_id: None, } ); } @@ -1330,7 +1352,8 @@ mod tests { ),] .into_iter() .collect() - ) + ), + symbol_id: None, } ); assert_eq!( @@ -1350,6 +1373,7 @@ mod tests { },] }), fields: Some(BTreeMap::new()), + symbol_id: None, } ); } @@ -1403,6 +1427,7 @@ mod tests { ] }), fields: Some(BTreeMap::new()), + symbol_id: None, } ); } @@ -1466,6 +1491,7 @@ mod tests { subtypes: None, children: None, fields: None, + symbol_id: None, }) ); assert_eq!( @@ -1478,6 +1504,7 @@ mod tests { subtypes: None, children: None, fields: None, + symbol_id: None, }) ); } @@ -1543,6 +1570,7 @@ mod tests { .into_iter() .collect() ), + symbol_id: None, } ); } @@ -1571,7 +1599,8 @@ mod tests { extra: false, fields: Some(BTreeMap::new()), children: None, - subtypes: None + subtypes: None, + symbol_id: None, }] ); } @@ -1679,6 +1708,7 @@ mod tests { .into_iter() .collect() ), + symbol_id: None, }, NodeInfoJSON { kind: "script".to_string(), @@ -1696,6 +1726,7 @@ mod tests { }] }), fields: Some(BTreeMap::new()), + symbol_id: None, } ] ); @@ -1752,6 +1783,7 @@ mod tests { }] }), fields: Some(BTreeMap::new()), + symbol_id: None, } ); } @@ -2066,6 +2098,7 @@ mod tests { &lexical_grammar, &default_aliases, &variable_info, + &HashMap::new(), ) }