Unnamed repository; edit this file 'description' to name the repository.
internal: make sure macro test expand to valid syntax
Aleksey Kladov 2021-10-09
parent c41b7bb · commit c2e425d
-rw-r--r--crates/hir_def/src/macro_expansion_tests.rs5
-rw-r--r--crates/hir_def/src/macro_expansion_tests/mbe.rs28
-rw-r--r--crates/hir_def/src/macro_expansion_tests/mbe/matching.rs12
-rw-r--r--crates/hir_def/src/macro_expansion_tests/mbe/meta_syntax.rs6
-rw-r--r--crates/syntax/src/lib.rs7
5 files changed, 31 insertions, 27 deletions
diff --git a/crates/hir_def/src/macro_expansion_tests.rs b/crates/hir_def/src/macro_expansion_tests.rs
index 0a9ab93157..d96af5c407 100644
--- a/crates/hir_def/src/macro_expansion_tests.rs
+++ b/crates/hir_def/src/macro_expansion_tests.rs
@@ -65,6 +65,11 @@ fn check(ra_fixture: &str, mut expect: Expect) {
format_to!(expn_text, "/* error: {} */", err);
}
if let Some((parse, _token_map)) = exp.value {
+ assert!(
+ parse.errors().is_empty(),
+ "parse errors in expansion: \n{:#?}",
+ parse.errors()
+ );
let pp = pretty_print_macro_expansion(parse.syntax_node());
let indent = IndentLevel::from_node(call.syntax());
let pp = reindent(indent, pp);
diff --git a/crates/hir_def/src/macro_expansion_tests/mbe.rs b/crates/hir_def/src/macro_expansion_tests/mbe.rs
index 7c9a19613b..06ef8f3572 100644
--- a/crates/hir_def/src/macro_expansion_tests/mbe.rs
+++ b/crates/hir_def/src/macro_expansion_tests/mbe.rs
@@ -165,17 +165,17 @@ fn test_match_group_pattern_with_multiple_defs() {
check(
r#"
macro_rules! m {
- ($($i:ident),*) => ( impl Bar { $(fn $i {})* } );
+ ($($i:ident),*) => ( impl Bar { $(fn $i() {})* } );
}
m! { foo, bar }
"#,
expect![[r#"
macro_rules! m {
- ($($i:ident),*) => ( impl Bar { $(fn $i {})* } );
+ ($($i:ident),*) => ( impl Bar { $(fn $i() {})* } );
}
impl Bar {
- fn foo {}
- fn bar {}
+ fn foo() {}
+ fn bar() {}
}
"#]],
);
@@ -186,15 +186,15 @@ fn test_match_group_pattern_with_multiple_statement() {
check(
r#"
macro_rules! m {
- ($($i:ident),*) => ( fn baz { $($i ();)* } );
+ ($($i:ident),*) => ( fn baz() { $($i ();)* } );
}
m! { foo, bar }
"#,
expect![[r#"
macro_rules! m {
- ($($i:ident),*) => ( fn baz { $($i ();)* } );
+ ($($i:ident),*) => ( fn baz() { $($i ();)* } );
}
-fn baz {
+fn baz() {
foo();
bar();
}
@@ -207,15 +207,15 @@ fn test_match_group_pattern_with_multiple_statement_without_semi() {
check(
r#"
macro_rules! m {
- ($($i:ident),*) => ( fn baz { $($i() );* } );
+ ($($i:ident),*) => ( fn baz() { $($i() );* } );
}
m! { foo, bar }
"#,
expect![[r#"
macro_rules! m {
- ($($i:ident),*) => ( fn baz { $($i() );* } );
+ ($($i:ident),*) => ( fn baz() { $($i() );* } );
}
-fn baz {
+fn baz() {
foo();
bar()
}
@@ -228,15 +228,15 @@ fn test_match_group_empty_fixed_token() {
check(
r#"
macro_rules! m {
- ($($i:ident)* #abc) => ( fn baz { $($i ();)* } );
+ ($($i:ident)* #abc) => ( fn baz() { $($i ();)* } );
}
m!{#abc}
"#,
expect![[r##"
macro_rules! m {
- ($($i:ident)* #abc) => ( fn baz { $($i ();)* } );
+ ($($i:ident)* #abc) => ( fn baz() { $($i ();)* } );
}
-fn baz {}
+fn baz() {}
"##]],
)
}
@@ -248,7 +248,7 @@ fn test_match_group_in_subtree() {
macro_rules! m {
(fn $name:ident { $($i:ident)* } ) => ( fn $name() { $($i ();)* } );
}
-m! {fn baz { a b } }
+m! { fn baz { a b } }
"#,
expect![[r#"
macro_rules! m {
diff --git a/crates/hir_def/src/macro_expansion_tests/mbe/matching.rs b/crates/hir_def/src/macro_expansion_tests/mbe/matching.rs
index 11317cfa9d..5bdabfc598 100644
--- a/crates/hir_def/src/macro_expansion_tests/mbe/matching.rs
+++ b/crates/hir_def/src/macro_expansion_tests/mbe/matching.rs
@@ -8,18 +8,18 @@ use crate::macro_expansion_tests::check;
fn unary_minus_is_a_literal() {
check(
r#"
-macro_rules! m { ($x:literal) => (literal!()); ($x:tt) => (not_a_literal!()); }
+macro_rules! m { ($x:literal) => (literal!();); ($x:tt) => (not_a_literal!();); }
m!(92);
m!(-92);
m!(-9.2);
m!(--92);
"#,
expect![[r#"
-macro_rules! m { ($x:literal) => (literal!()); ($x:tt) => (not_a_literal!()); }
-literal!()
-literal!()
-literal!()
-/* error: leftover tokens */not_a_literal!()
+macro_rules! m { ($x:literal) => (literal!();); ($x:tt) => (not_a_literal!();); }
+literal!();
+literal!();
+literal!();
+/* error: leftover tokens */not_a_literal!();
"#]],
)
}
diff --git a/crates/hir_def/src/macro_expansion_tests/mbe/meta_syntax.rs b/crates/hir_def/src/macro_expansion_tests/mbe/meta_syntax.rs
index 4249c2507e..d434c88244 100644
--- a/crates/hir_def/src/macro_expansion_tests/mbe/meta_syntax.rs
+++ b/crates/hir_def/src/macro_expansion_tests/mbe/meta_syntax.rs
@@ -16,7 +16,7 @@ macro_rules! m {
($($i:ident)*) => ($_);
($($true:ident)*) => ($true);
($($false:ident)*) => ($false);
- ($) => ($);
+ ($) => (m!($););
}
m!($);
"#,
@@ -29,9 +29,9 @@ macro_rules! m {
($($i:ident)*) => ($_);
($($true:ident)*) => ($true);
($($false:ident)*) => ($false);
- ($) => ($);
+ ($) => (m!($););
}
-$
+m!($);
"#]],
)
}
diff --git a/crates/syntax/src/lib.rs b/crates/syntax/src/lib.rs
index 132d300674..24a099cb3c 100644
--- a/crates/syntax/src/lib.rs
+++ b/crates/syntax/src/lib.rs
@@ -89,6 +89,9 @@ impl<T> Parse<T> {
pub fn syntax_node(&self) -> SyntaxNode {
SyntaxNode::new_root(self.green.clone())
}
+ pub fn errors(&self) -> &[SyntaxError] {
+ &*self.errors
+ }
}
impl<T: AstNode> Parse<T> {
@@ -100,10 +103,6 @@ impl<T: AstNode> Parse<T> {
T::cast(self.syntax_node()).unwrap()
}
- pub fn errors(&self) -> &[SyntaxError] {
- &*self.errors
- }
-
pub fn ok(self) -> Result<T, Arc<Vec<SyntaxError>>> {
if self.errors.is_empty() {
Ok(self.tree())