diff --git a/crates/hir_def/src/nameres/tests/diagnostics.rs b/crates/hir_def/src/nameres/tests/diagnostics.rs index a89061c2e80..fefdadb225d 100644 --- a/crates/hir_def/src/nameres/tests/diagnostics.rs +++ b/crates/hir_def/src/nameres/tests/diagnostics.rs @@ -7,6 +7,11 @@ fn check_diagnostics(ra_fixture: &str) { db.check_diagnostics(); } +fn check_no_diagnostics(ra_fixture: &str) { + let db: TestDB = TestDB::with_files(ra_fixture); + db.check_no_diagnostics(); +} + #[test] fn unresolved_import() { check_diagnostics( @@ -201,6 +206,21 @@ macro_rules! include { () => {} } ); } +#[test] +fn include_macro_should_allow_empty_content() { + check_no_diagnostics( + r#" + //- /lib.rs + #[rustc_builtin_macro] + macro_rules! include { () => {} } + + include!("bar.rs"); + //- /bar.rs + // empty + "#, + ); +} + #[test] fn good_out_dir_diagnostic() { check_diagnostics( diff --git a/crates/hir_def/src/test_db.rs b/crates/hir_def/src/test_db.rs index 10977761c93..dd36106f8d2 100644 --- a/crates/hir_def/src/test_db.rs +++ b/crates/hir_def/src/test_db.rs @@ -265,4 +265,17 @@ pub(crate) fn check_diagnostics(&self) { assert_eq!(annotations, actual); } + + pub(crate) fn check_no_diagnostics(&self) { + let db: &TestDB = self; + let annotations = db.extract_annotations(); + assert!(annotations.is_empty()); + + let mut has_diagnostics = false; + db.diagnostics(|_| { + has_diagnostics = true; + }); + + assert!(!has_diagnostics); + } } diff --git a/crates/mbe/src/syntax_bridge.rs b/crates/mbe/src/syntax_bridge.rs index 9d433b3b0bd..ae0780072a5 100644 --- a/crates/mbe/src/syntax_bridge.rs +++ b/crates/mbe/src/syntax_bridge.rs @@ -325,9 +325,6 @@ fn go(&mut self) -> Option { while self.peek().is_some() { self.collect_leaf(&mut subtree.token_trees); } - if subtree.token_trees.is_empty() { - return None; - } if subtree.token_trees.len() == 1 { if let tt::TokenTree::Subtree(first) = &subtree.token_trees[0] { return Some(first.clone());