/// Convert the syntax tree (what user has written) to a `TokenTree` (what macro
/// will consume).
-pub fn ast_to_token_tree(ast: &impl ast::AstNode) -> Option<(tt::Subtree, TokenMap)> {
+pub fn ast_to_token_tree(ast: &impl ast::AstNode) -> (tt::Subtree, TokenMap) {
syntax_node_to_token_tree(ast.syntax())
}
/// Convert the syntax node to a `TokenTree` (what macro
/// will consume).
-pub fn syntax_node_to_token_tree(node: &SyntaxNode) -> Option<(tt::Subtree, TokenMap)> {
+pub fn syntax_node_to_token_tree(node: &SyntaxNode) -> (tt::Subtree, TokenMap) {
let global_offset = node.text_range().start();
let mut c = Convertor::new(node, global_offset);
- let subtree = c.go()?;
+ let subtree = c.go();
c.id_alloc.map.entries.shrink_to_fit();
- Some((subtree, c.id_alloc.map))
+ (subtree, c.id_alloc.map)
}
// The following items are what `rustc` macro can be parsed into :
},
};
- let subtree = conv.go()?;
+ let subtree = conv.go();
Some((subtree, conv.id_alloc.map))
}
trait TokenConvertor {
type Token: SrcToken;
- fn go(&mut self) -> Option<tt::Subtree> {
+ fn go(&mut self) -> tt::Subtree {
let mut subtree = tt::Subtree::default();
subtree.delimiter = None;
while self.peek().is_some() {
}
if subtree.token_trees.len() == 1 {
if let tt::TokenTree::Subtree(first) = &subtree.token_trees[0] {
- return Some(first.clone());
+ return first.clone();
}
}
- Some(subtree)
+ subtree
}
fn collect_leaf(&mut self, result: &mut Vec<tt::TokenTree>) {
// - T!['}']
// - WHITE_SPACE
let token_tree = ast::TokenTree::cast(token_tree).unwrap();
- let tt = ast_to_token_tree(&token_tree).unwrap().0;
+ let tt = ast_to_token_tree(&token_tree).0;
assert_eq!(tt.delimiter_kind(), Some(tt::DelimiterKind::Brace));
}
fn test_token_tree_multi_char_punct() {
let source_file = ast::SourceFile::parse("struct Foo { a: x::Y }").ok().unwrap();
let struct_def = source_file.syntax().descendants().find_map(ast::Struct::cast).unwrap();
- let tt = ast_to_token_tree(&struct_def).unwrap().0;
+ let tt = ast_to_token_tree(&struct_def).0;
token_tree_to_syntax_node(&tt, FragmentKind::Item).unwrap();
}
}