From 28bdb654074f63d6ce1a2a3fe328b1a2a1867954 Mon Sep 17 00:00:00 2001 From: Veetaha Date: Thu, 20 Feb 2020 23:42:24 +0200 Subject: ra_mbe: added test for malformed token in macro invokation There was a panic where lexer returned None on malformed tokens. But now we just ignore tokenization errors in mbe. --- crates/ra_mbe/src/tests.rs | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) (limited to 'crates/ra_mbe/src') diff --git a/crates/ra_mbe/src/tests.rs b/crates/ra_mbe/src/tests.rs index e0d689704..ef34dde5c 100644 --- a/crates/ra_mbe/src/tests.rs +++ b/crates/ra_mbe/src/tests.rs @@ -1374,14 +1374,22 @@ pub(crate) struct MacroFixture { impl MacroFixture { pub(crate) fn expand_tt(&self, invocation: &str) -> tt::Subtree { - let source_file = ast::SourceFile::parse(invocation).ok().unwrap(); + self.try_expand_tt(invocation).unwrap() + } + + fn try_expand_tt(&self, invocation: &str) -> Result { + let source_file = ast::SourceFile::parse(invocation).tree(); 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(); - self.rules.expand(&invocation_tt).unwrap() + self.rules.expand(&invocation_tt) + } + + fn assert_expand_err(&self, invocation: &str, err: &ExpandError) { + assert_eq!(self.try_expand_tt(invocation).as_ref(), Err(err)); } fn expand_items(&self, invocation: &str) -> SyntaxNode { @@ -1448,7 +1456,7 @@ impl MacroFixture { pub(crate) fn parse_macro(macro_definition: &str) -> MacroFixture { let source_file = ast::SourceFile::parse(macro_definition).ok().unwrap(); - let macro_definition = + let macro_definition: ast::MacroCall = source_file.syntax().descendants().find_map(ast::MacroCall::cast).unwrap(); let (definition_tt, _) = ast_to_token_tree(¯o_definition.token_tree().unwrap()).unwrap(); @@ -1539,3 +1547,13 @@ fn test_repeat_bad_var() { ) .assert_expand_items("foo!(b0 b1);", "b0 b1"); } + +#[test] +fn test_expand_bad_literal() { + parse_macro( + r#" + macro_rules! foo { ($i:literal) => {}; } + "#, + ) + .assert_expand_err(r#"foo!(&k");"#, &ExpandError::NoMatchingRule); +} -- cgit v1.2.3