diff options
Diffstat (limited to 'crates/ra_mbe/src/lib.rs')
-rw-r--r-- | crates/ra_mbe/src/lib.rs | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/crates/ra_mbe/src/lib.rs b/crates/ra_mbe/src/lib.rs index 93246f54a..3b127526d 100644 --- a/crates/ra_mbe/src/lib.rs +++ b/crates/ra_mbe/src/lib.rs | |||
@@ -337,4 +337,45 @@ SOURCE_FILE@[0; 40) | |||
337 | ); | 337 | ); |
338 | } | 338 | } |
339 | 339 | ||
340 | #[test] | ||
341 | fn expand_literals_to_item_list() { | ||
342 | fn to_subtree(tt: &tt::TokenTree) -> &tt::Subtree { | ||
343 | if let tt::TokenTree::Subtree(subtree) = tt { | ||
344 | return &subtree; | ||
345 | } | ||
346 | assert!(false, "It is not a subtree"); | ||
347 | unreachable!(); | ||
348 | } | ||
349 | |||
350 | fn to_literal(tt: &tt::TokenTree) -> &tt::Literal { | ||
351 | if let tt::TokenTree::Leaf(tt::Leaf::Literal(lit)) = tt { | ||
352 | return lit; | ||
353 | } | ||
354 | assert!(false, "It is not a literal"); | ||
355 | unreachable!(); | ||
356 | } | ||
357 | |||
358 | let rules = create_rules( | ||
359 | r#" | ||
360 | macro_rules! literals { | ||
361 | ($i:ident) => { | ||
362 | { | ||
363 | let a = 'c'; | ||
364 | let c = 1000; | ||
365 | let f = 12E+99_f64; | ||
366 | } | ||
367 | } | ||
368 | } | ||
369 | "#, | ||
370 | ); | ||
371 | let expansion = expand(&rules, "literals!(foo)"); | ||
372 | let stm_tokens = &to_subtree(&expansion.token_trees[0]).token_trees; | ||
373 | |||
374 | // [let] [a] [=] ['c'] [;] | ||
375 | assert_eq!(to_literal(&stm_tokens[3]).text, "'c'"); | ||
376 | // [let] [c] [=] [1000] [;] | ||
377 | assert_eq!(to_literal(&stm_tokens[5 + 3]).text, "1000"); | ||
378 | // [let] [f] [=] [12E+99_f64] [;] | ||
379 | assert_eq!(to_literal(&stm_tokens[10 + 3]).text, "12E+99_f64"); | ||
380 | } | ||
340 | } | 381 | } |