X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=crates%2Fmbe%2Fsrc%2Fsyntax_bridge.rs;h=7e12647cd86230d4703d2d844744914f28f058cb;hb=0b53744f2d7e0694cd7207cca632fd6de1dc5bff;hp=da7fdb74ee832f820cf84e99954b23b52fddfa53;hpb=ecf3cff4a6c7c06d1fe30e636d69227ab6310ebb;p=rust.git diff --git a/crates/mbe/src/syntax_bridge.rs b/crates/mbe/src/syntax_bridge.rs index da7fdb74ee8..7e12647cd86 100644 --- a/crates/mbe/src/syntax_bridge.rs +++ b/crates/mbe/src/syntax_bridge.rs @@ -15,24 +15,32 @@ /// Convert the syntax node to a `TokenTree` (what macro /// will consume). pub fn syntax_node_to_token_tree(node: &SyntaxNode) -> (tt::Subtree, TokenMap) { - syntax_node_to_token_tree_censored(node, Default::default(), Default::default()) + let (subtree, token_map, _) = syntax_node_to_token_tree_with_modifications( + node, + Default::default(), + 0, + Default::default(), + Default::default(), + ); + (subtree, token_map) } -// TODO rename /// Convert the syntax node to a `TokenTree` (what macro will consume) /// with the censored range excluded. -pub fn syntax_node_to_token_tree_censored( +pub fn syntax_node_to_token_tree_with_modifications( node: &SyntaxNode, + existing_token_map: TokenMap, + next_id: u32, replace: FxHashMap>, append: FxHashMap>, -) -> (tt::Subtree, TokenMap) { +) -> (tt::Subtree, TokenMap, u32) { let global_offset = node.text_range().start(); - let mut c = Convertor::new(node, global_offset, replace, append); + let mut c = Convertor::new(node, global_offset, existing_token_map, next_id, replace, append); let subtree = convert_tokens(&mut c); c.id_alloc.map.shrink_to_fit(); always!(c.replace.is_empty(), "replace: {:?}", c.replace); always!(c.append.is_empty(), "append: {:?}", c.append); - (subtree, c.id_alloc.map) + (subtree, c.id_alloc.map, c.id_alloc.next_id) } #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)] @@ -184,7 +192,9 @@ struct StackEntry { continue; } let tt = if kind.is_punct() && kind != UNDERSCORE { - // assert_eq!(range.len(), TextSize::of('.')); + if synth_id.is_none() { + assert_eq!(range.len(), TextSize::of('.')); + } if let Some(delim) = subtree.delimiter { let expected = match delim.kind { @@ -511,6 +521,8 @@ impl Convertor { fn new( node: &SyntaxNode, global_offset: TextSize, + existing_token_map: TokenMap, + next_id: u32, mut replace: FxHashMap>, mut append: FxHashMap>, ) -> Convertor { @@ -518,7 +530,7 @@ fn new( let mut preorder = node.preorder_with_tokens(); let (first, synthetic) = Self::next_token(&mut preorder, &mut replace, &mut append); Convertor { - id_alloc: { TokenIdAlloc { map: TokenMap::default(), global_offset, next_id: 0 } }, + id_alloc: { TokenIdAlloc { map: existing_token_map, global_offset, next_id } }, current: first, current_synthetic: synthetic, preorder,