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
This commit is contained in:
parent
b7d85668fe
commit
4519e2b8cc
2 changed files with 55 additions and 21 deletions
|
|
@ -296,6 +296,7 @@ where
|
|||
&lexical_grammar,
|
||||
&simple_aliases,
|
||||
&variable_info,
|
||||
&symbol_ids,
|
||||
)?;
|
||||
|
||||
write_file(
|
||||
|
|
|
|||
|
|
@ -45,6 +45,8 @@ pub struct NodeInfoJSON {
|
|||
children: Option<FieldInfoJSON>,
|
||||
#[serde(skip_serializing_if = "Option::is_none")]
|
||||
subtypes: Option<Vec<NodeTypeJSON>>,
|
||||
#[serde(skip_serializing_if = "Option::is_none")]
|
||||
symbol_id: Option<String>,
|
||||
}
|
||||
|
||||
#[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<Symbol, String>,
|
||||
) -> SuperTypeCycleResult<Vec<NodeInfoJSON>> {
|
||||
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(),
|
||||
)
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue