From e16f3a5ee2f7df3f42827f3f279b5ed6774bde8e Mon Sep 17 00:00:00 2001 From: Edwin Cheng Date: Sat, 14 Dec 2019 03:39:15 +0800 Subject: Add test for token map --- crates/ra_mbe/src/tests.rs | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) (limited to 'crates/ra_mbe') diff --git a/crates/ra_mbe/src/tests.rs b/crates/ra_mbe/src/tests.rs index 6bcfedcac..ae7f3dfd4 100644 --- a/crates/ra_mbe/src/tests.rs +++ b/crates/ra_mbe/src/tests.rs @@ -88,6 +88,32 @@ macro_rules! foobar { assert_eq!(get_id(&expansion.token_trees[2]), Some(14)); } +#[test] +fn test_token_map() { + use ra_parser::SyntaxKind::*; + use ra_syntax::T; + + let macro_definition = r#" +macro_rules! foobar { + ($e:ident) => { fn $e() {} } +} +"#; + let rules = create_rules(macro_definition); + let (expansion, (token_map, content)) = expand_and_map(&rules, "foobar!(baz);"); + + let get_text = |id, kind| -> String { + content[token_map.range_by_token(id).unwrap().range(kind).unwrap()].to_string() + }; + + assert_eq!(expansion.token_trees.len(), 4); + // {($e:ident) => { fn $e() {} }} + // 012345 67 8 9 T12 3 + + assert_eq!(get_text(tt::TokenId(9), IDENT), "fn"); + assert_eq!(get_text(tt::TokenId(12), T!['(']), "("); + assert_eq!(get_text(tt::TokenId(13), T!['{']), "{"); +} + #[test] fn test_convert_tt() { let macro_definition = r#" @@ -1443,6 +1469,23 @@ pub(crate) fn expand(rules: &MacroRules, invocation: &str) -> tt::Subtree { rules.expand(&invocation_tt).unwrap() } +pub(crate) fn expand_and_map( + rules: &MacroRules, + invocation: &str, +) -> (tt::Subtree, (TokenMap, String)) { + let source_file = ast::SourceFile::parse(invocation).ok().unwrap(); + let macro_invocation = + source_file.syntax().descendants().find_map(ast::MacroCall::cast).unwrap(); + + let (invocation_tt, _) = ast_to_token_tree(¯o_invocation.token_tree().unwrap()).unwrap(); + let expanded = rules.expand(&invocation_tt).unwrap(); + + let (node, expanded_token_tree) = + token_tree_to_syntax_node(&expanded, FragmentKind::Items).unwrap(); + + (expanded, (expanded_token_tree, node.syntax_node().to_string())) +} + pub(crate) enum MacroKind { Items, Stmts, -- cgit v1.2.3