Fix builtin macros split exprs on comma

This commit is contained in:
Edwin Cheng
2021-02-28 13:06:17 +08:00
parent f682627da4
commit f5bf1a9650
5 changed files with 144 additions and 89 deletions

View File

@@ -10,8 +10,8 @@ use syntax::{
};
use tt::buffer::{Cursor, TokenBuffer};
use crate::subtree_source::SubtreeTokenSource;
use crate::ExpandError;
use crate::{subtree_source::SubtreeTokenSource, tt_iter::TtIter};
#[derive(Debug, PartialEq, Eq, Clone, Copy)]
pub enum TokenTextRange {
@@ -112,6 +112,43 @@ pub fn parse_to_token_tree(text: &str) -> Option<(tt::Subtree, TokenMap)> {
Some((subtree, conv.id_alloc.map))
}
/// Split token tree with seperate expr: $($e:expr)SEP*
pub fn parse_exprs_with_sep(tt: &tt::Subtree, sep: char) -> Vec<tt::Subtree> {
if tt.token_trees.is_empty() {
return Vec::new();
}
let mut iter = TtIter::new(tt);
let mut res = Vec::new();
while iter.peek_n(0).is_some() {
let expanded = iter.expect_fragment(FragmentKind::Expr);
if expanded.err.is_some() {
break;
}
res.push(match expanded.value {
None => break,
Some(tt @ tt::TokenTree::Leaf(_)) => {
tt::Subtree { delimiter: None, token_trees: vec![tt.into()] }
}
Some(tt::TokenTree::Subtree(tt)) => tt,
});
let mut fork = iter.clone();
if fork.expect_char(sep).is_err() {
break;
}
iter = fork;
}
if iter.peek_n(0).is_some() {
res.push(tt::Subtree { delimiter: None, token_trees: iter.into_iter().cloned().collect() });
}
res
}
impl TokenMap {
pub fn token_by_range(&self, relative_range: TextRange) -> Option<tt::TokenId> {
let &(token_id, _) = self.entries.iter().find(|(_, range)| match range {