Factor out rules parsing

This commit is contained in:
Jeff Muizelaar 2019-02-03 15:06:59 -05:00
parent 998ed13d09
commit 1997797adc

View File

@ -161,6 +161,18 @@ impl_froms!(TokenTree: Leaf, Subtree);
)
}
fn create_rules(macro_definition: &str) -> MacroRules {
let source_file = ast::SourceFile::parse(macro_definition);
let macro_definition = source_file
.syntax()
.descendants()
.find_map(ast::MacroCall::cast)
.unwrap();
let definition_tt = ast_to_token_tree(macro_definition.token_tree().unwrap()).unwrap();
crate::MacroRules::parse(&definition_tt).unwrap()
}
fn assert_expansion(rules: &MacroRules, invocation: &str, expansion: &str) {
let source_file = ast::SourceFile::parse(invocation);
let macro_invocation = source_file
@ -177,7 +189,8 @@ impl_froms!(TokenTree: Leaf, Subtree);
#[test]
fn test_fail_match_pattern_by_first_token() {
let macro_definition = r#"
let rules = create_rules(
r#"
macro_rules! foo {
($ i:ident) => (
mod $ i {}
@ -189,17 +202,8 @@ impl_froms!(TokenTree: Leaf, Subtree);
struct $ i;
)
}
"#;
let source_file = ast::SourceFile::parse(macro_definition);
let macro_definition = source_file
.syntax()
.descendants()
.find_map(ast::MacroCall::cast)
.unwrap();
let definition_tt = ast_to_token_tree(macro_definition.token_tree().unwrap()).unwrap();
let rules = crate::MacroRules::parse(&definition_tt).unwrap();
"#,
);
assert_expansion(&rules, "foo! { foo }", "mod foo {}");
assert_expansion(&rules, "foo! { = bar }", "fn bar () {}");
@ -208,7 +212,8 @@ impl_froms!(TokenTree: Leaf, Subtree);
#[test]
fn test_fail_match_pattern_by_last_token() {
let macro_definition = r#"
let rules = create_rules(
r#"
macro_rules! foo {
($ i:ident) => (
mod $ i {}
@ -220,17 +225,8 @@ impl_froms!(TokenTree: Leaf, Subtree);
struct $ i;
)
}
"#;
let source_file = ast::SourceFile::parse(macro_definition);
let macro_definition = source_file
.syntax()
.descendants()
.find_map(ast::MacroCall::cast)
.unwrap();
let definition_tt = ast_to_token_tree(macro_definition.token_tree().unwrap()).unwrap();
let rules = crate::MacroRules::parse(&definition_tt).unwrap();
"#,
);
assert_expansion(&rules, "foo! { foo }", "mod foo {}");
assert_expansion(&rules, "foo! { bar = }", "fn bar () {}");