diff options
Diffstat (limited to 'crates/ra_mbe/src/tests.rs')
-rw-r--r-- | crates/ra_mbe/src/tests.rs | 57 |
1 files changed, 51 insertions, 6 deletions
diff --git a/crates/ra_mbe/src/tests.rs b/crates/ra_mbe/src/tests.rs index 148cc2625..ff225f0db 100644 --- a/crates/ra_mbe/src/tests.rs +++ b/crates/ra_mbe/src/tests.rs | |||
@@ -77,13 +77,41 @@ macro_rules! foobar { | |||
77 | } | 77 | } |
78 | 78 | ||
79 | assert_eq!(expansion.token_trees.len(), 3); | 79 | assert_eq!(expansion.token_trees.len(), 3); |
80 | // ($e:ident) => { foo bar $e } | 80 | // {($e:ident) => { foo bar $e }} |
81 | // 0 1 2 3 4 | 81 | // 012345 67 8 9 T 12 |
82 | assert_eq!(get_id(&expansion.token_trees[0]), Some(2)); | 82 | assert_eq!(get_id(&expansion.token_trees[0]), Some(9)); |
83 | assert_eq!(get_id(&expansion.token_trees[1]), Some(3)); | 83 | assert_eq!(get_id(&expansion.token_trees[1]), Some(10)); |
84 | 84 | ||
85 | // So baz should be 5 | 85 | // The input args of macro call include parentheses: |
86 | assert_eq!(get_id(&expansion.token_trees[2]), Some(5)); | 86 | // (baz) |
87 | // So baz should be 12+1+1 | ||
88 | assert_eq!(get_id(&expansion.token_trees[2]), Some(14)); | ||
89 | } | ||
90 | |||
91 | #[test] | ||
92 | fn test_token_map() { | ||
93 | use ra_parser::SyntaxKind::*; | ||
94 | use ra_syntax::T; | ||
95 | |||
96 | let macro_definition = r#" | ||
97 | macro_rules! foobar { | ||
98 | ($e:ident) => { fn $e() {} } | ||
99 | } | ||
100 | "#; | ||
101 | let rules = create_rules(macro_definition); | ||
102 | let (expansion, (token_map, content)) = expand_and_map(&rules, "foobar!(baz);"); | ||
103 | |||
104 | let get_text = |id, kind| -> String { | ||
105 | content[token_map.range_by_token(id).unwrap().by_kind(kind).unwrap()].to_string() | ||
106 | }; | ||
107 | |||
108 | assert_eq!(expansion.token_trees.len(), 4); | ||
109 | // {($e:ident) => { fn $e() {} }} | ||
110 | // 012345 67 8 9 T12 3 | ||
111 | |||
112 | assert_eq!(get_text(tt::TokenId(9), IDENT), "fn"); | ||
113 | assert_eq!(get_text(tt::TokenId(12), T!['(']), "("); | ||
114 | assert_eq!(get_text(tt::TokenId(13), T!['{']), "{"); | ||
87 | } | 115 | } |
88 | 116 | ||
89 | #[test] | 117 | #[test] |
@@ -1441,6 +1469,23 @@ pub(crate) fn expand(rules: &MacroRules, invocation: &str) -> tt::Subtree { | |||
1441 | rules.expand(&invocation_tt).unwrap() | 1469 | rules.expand(&invocation_tt).unwrap() |
1442 | } | 1470 | } |
1443 | 1471 | ||
1472 | pub(crate) fn expand_and_map( | ||
1473 | rules: &MacroRules, | ||
1474 | invocation: &str, | ||
1475 | ) -> (tt::Subtree, (TokenMap, String)) { | ||
1476 | let source_file = ast::SourceFile::parse(invocation).ok().unwrap(); | ||
1477 | let macro_invocation = | ||
1478 | source_file.syntax().descendants().find_map(ast::MacroCall::cast).unwrap(); | ||
1479 | |||
1480 | let (invocation_tt, _) = ast_to_token_tree(¯o_invocation.token_tree().unwrap()).unwrap(); | ||
1481 | let expanded = rules.expand(&invocation_tt).unwrap(); | ||
1482 | |||
1483 | let (node, expanded_token_tree) = | ||
1484 | token_tree_to_syntax_node(&expanded, FragmentKind::Items).unwrap(); | ||
1485 | |||
1486 | (expanded, (expanded_token_tree, node.syntax_node().to_string())) | ||
1487 | } | ||
1488 | |||
1444 | pub(crate) enum MacroKind { | 1489 | pub(crate) enum MacroKind { |
1445 | Items, | 1490 | Items, |
1446 | Stmts, | 1491 | Stmts, |