From f85e383b94376d55bb5ee6be375ef3dc0006590f Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sun, 13 Jun 2021 17:29:25 +0300 Subject: internal: refactor inactive code diagnostics --- crates/hir_def/src/body/tests.rs | 33 ------------------- crates/hir_def/src/nameres/tests/diagnostics.rs | 42 ------------------------- 2 files changed, 75 deletions(-) (limited to 'crates/hir_def') diff --git a/crates/hir_def/src/body/tests.rs b/crates/hir_def/src/body/tests.rs index d4fae05a6..075dcc6d2 100644 --- a/crates/hir_def/src/body/tests.rs +++ b/crates/hir_def/src/body/tests.rs @@ -88,39 +88,6 @@ mod m { ); } -#[test] -fn cfg_diagnostics() { - check_diagnostics( - r" -fn f() { - // The three g̶e̶n̶d̶e̶r̶s̶ statements: - - #[cfg(a)] fn f() {} // Item statement - //^^^^^^^^^^^^^^^^^^^ InactiveCode - #[cfg(a)] {} // Expression statement - //^^^^^^^^^^^^ InactiveCode - #[cfg(a)] let x = 0; // let statement - //^^^^^^^^^^^^^^^^^^^^ InactiveCode - - abc(#[cfg(a)] 0); - //^^^^^^^^^^^ InactiveCode - let x = Struct { - #[cfg(a)] f: 0, - //^^^^^^^^^^^^^^ InactiveCode - }; - match () { - () => (), - #[cfg(a)] () => (), - //^^^^^^^^^^^^^^^^^^ InactiveCode - } - - #[cfg(a)] 0 // Trailing expression of block - //^^^^^^^^^^^ InactiveCode -} - ", - ); -} - #[test] fn macro_diag_builtin() { check_diagnostics( diff --git a/crates/hir_def/src/nameres/tests/diagnostics.rs b/crates/hir_def/src/nameres/tests/diagnostics.rs index 5a088b6e5..f1ee03d4d 100644 --- a/crates/hir_def/src/nameres/tests/diagnostics.rs +++ b/crates/hir_def/src/nameres/tests/diagnostics.rs @@ -12,48 +12,6 @@ fn check_no_diagnostics(ra_fixture: &str) { db.check_no_diagnostics(); } -#[test] -fn inactive_item() { - // Additional tests in `cfg` crate. This only tests disabled cfgs. - - check_diagnostics( - r#" - //- /lib.rs - #[cfg(no)] pub fn f() {} - //^^^^^^^^^^^^^^^^^^^^^^^^ UnconfiguredCode - - #[cfg(no)] #[cfg(no2)] mod m; - //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ UnconfiguredCode - - #[cfg(all(not(a), b))] enum E {} - //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ UnconfiguredCode - - #[cfg(feature = "std")] use std; - //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ UnconfiguredCode - "#, - ); -} - -/// Tests that `cfg` attributes behind `cfg_attr` is handled properly. -#[test] -fn inactive_via_cfg_attr() { - cov_mark::check!(cfg_attr_active); - check_diagnostics( - r#" - //- /lib.rs - #[cfg_attr(not(never), cfg(no))] fn f() {} - //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ UnconfiguredCode - - #[cfg_attr(not(never), cfg(not(no)))] fn f() {} - - #[cfg_attr(never, cfg(no))] fn g() {} - - #[cfg_attr(not(never), inline, cfg(no))] fn h() {} - //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ UnconfiguredCode - "#, - ); -} - #[test] fn builtin_macro_fails_expansion() { check_diagnostics( -- cgit v1.2.3 From 00303284b5cc3a82e32dc3ecbbcfeb2f99de6818 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sun, 13 Jun 2021 18:41:04 +0300 Subject: internal: refactor macro error --- crates/hir_def/src/body/tests.rs | 88 ------------------------- crates/hir_def/src/nameres/tests.rs | 1 - crates/hir_def/src/nameres/tests/diagnostics.rs | 76 --------------------- 3 files changed, 165 deletions(-) delete mode 100644 crates/hir_def/src/nameres/tests/diagnostics.rs (limited to 'crates/hir_def') diff --git a/crates/hir_def/src/body/tests.rs b/crates/hir_def/src/body/tests.rs index 075dcc6d2..0dccabcfd 100644 --- a/crates/hir_def/src/body/tests.rs +++ b/crates/hir_def/src/body/tests.rs @@ -88,67 +88,6 @@ mod m { ); } -#[test] -fn macro_diag_builtin() { - check_diagnostics( - r#" -#[rustc_builtin_macro] -macro_rules! env {} - -#[rustc_builtin_macro] -macro_rules! include {} - -#[rustc_builtin_macro] -macro_rules! compile_error {} - -#[rustc_builtin_macro] -macro_rules! format_args { - () => {} -} - -fn f() { - // Test a handful of built-in (eager) macros: - - include!(invalid); - //^^^^^^^^^^^^^^^^^ could not convert tokens - include!("does not exist"); - //^^^^^^^^^^^^^^^^^^^^^^^^^^ failed to load file `does not exist` - - env!(invalid); - //^^^^^^^^^^^^^ could not convert tokens - - env!("OUT_DIR"); - //^^^^^^^^^^^^^^^ `OUT_DIR` not set, enable "run build scripts" to fix - - compile_error!("compile_error works"); - //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ compile_error works - - // Lazy: - - format_args!(); - //^^^^^^^^^^^^^^ no rule matches input tokens -} - "#, - ); -} - -#[test] -fn macro_rules_diag() { - check_diagnostics( - r#" -macro_rules! m { - () => {}; -} -fn f() { - m!(); - - m!(hi); - //^^^^^^ leftover tokens -} - "#, - ); -} - #[test] fn unresolved_macro_diag() { check_diagnostics( @@ -161,30 +100,3 @@ fn f() { ); } -#[test] -fn dollar_crate_in_builtin_macro() { - check_diagnostics( - r#" -#[macro_export] -#[rustc_builtin_macro] -macro_rules! format_args {} - -#[macro_export] -macro_rules! arg { - () => {} -} - -#[macro_export] -macro_rules! outer { - () => { - $crate::format_args!( "", $crate::arg!(1) ) - }; -} - -fn f() { - outer!(); - //^^^^^^^^ leftover tokens -} - "#, - ) -} diff --git a/crates/hir_def/src/nameres/tests.rs b/crates/hir_def/src/nameres/tests.rs index 58c01354a..cf43f2a96 100644 --- a/crates/hir_def/src/nameres/tests.rs +++ b/crates/hir_def/src/nameres/tests.rs @@ -2,7 +2,6 @@ mod globs; mod incremental; mod macros; mod mod_resolution; -mod diagnostics; mod primitives; use std::sync::Arc; diff --git a/crates/hir_def/src/nameres/tests/diagnostics.rs b/crates/hir_def/src/nameres/tests/diagnostics.rs deleted file mode 100644 index f1ee03d4d..000000000 --- a/crates/hir_def/src/nameres/tests/diagnostics.rs +++ /dev/null @@ -1,76 +0,0 @@ -use base_db::fixture::WithFixture; - -use crate::test_db::TestDB; - -fn check_diagnostics(ra_fixture: &str) { - let db: TestDB = TestDB::with_files(ra_fixture); - db.check_diagnostics(); -} - -fn check_no_diagnostics(ra_fixture: &str) { - let db: TestDB = TestDB::with_files(ra_fixture); - db.check_no_diagnostics(); -} - -#[test] -fn builtin_macro_fails_expansion() { - check_diagnostics( - r#" - //- /lib.rs - #[rustc_builtin_macro] - macro_rules! include { () => {} } - - include!("doesntexist"); - //^^^^^^^^^^^^^^^^^^^^^^^^ failed to load file `doesntexist` - "#, - ); -} - -#[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( - r#" - #[rustc_builtin_macro] - macro_rules! include { () => {} } - #[rustc_builtin_macro] - macro_rules! env { () => {} } - #[rustc_builtin_macro] - macro_rules! concat { () => {} } - - include!(concat!(env!("OUT_DIR"), "/out.rs")); - //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `OUT_DIR` not set, enable "run build scripts" to fix - "#, - ); -} - -#[test] -fn register_attr_and_tool() { - cov_mark::check!(register_attr); - cov_mark::check!(register_tool); - check_no_diagnostics( - r#" -#![register_tool(tool)] -#![register_attr(attr)] - -#[tool::path] -#[attr] -struct S; - "#, - ); - // NB: we don't currently emit diagnostics here -} -- cgit v1.2.3 From 4af7a35197a1cb159458694e69e17bd83dc9edff Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sun, 13 Jun 2021 18:45:38 +0300 Subject: internal: remove def-level diagnostics tests --- crates/hir_def/src/body/tests.rs | 28 ++------ crates/hir_def/src/test_db.rs | 152 ++------------------------------------- 2 files changed, 9 insertions(+), 171 deletions(-) (limited to 'crates/hir_def') diff --git a/crates/hir_def/src/body/tests.rs b/crates/hir_def/src/body/tests.rs index 0dccabcfd..27d837d47 100644 --- a/crates/hir_def/src/body/tests.rs +++ b/crates/hir_def/src/body/tests.rs @@ -3,7 +3,7 @@ mod block; use base_db::{fixture::WithFixture, SourceDatabase}; use expect_test::Expect; -use crate::{test_db::TestDB, ModuleDefId}; +use crate::ModuleDefId; use super::*; @@ -28,11 +28,6 @@ fn lower(ra_fixture: &str) -> Arc { db.body(fn_def.unwrap().into()) } -fn check_diagnostics(ra_fixture: &str) { - let db: TestDB = TestDB::with_files(ra_fixture); - db.check_diagnostics(); -} - fn block_def_map_at(ra_fixture: &str) -> String { let (db, position) = crate::test_db::TestDB::with_position(ra_fixture); @@ -57,7 +52,7 @@ fn check_at(ra_fixture: &str, expect: Expect) { fn your_stack_belongs_to_me() { cov_mark::check!(your_stack_belongs_to_me); lower( - " + r#" macro_rules! n_nuple { ($e:tt) => (); ($($rest:tt)*) => {{ @@ -65,7 +60,7 @@ macro_rules! n_nuple { }}; } fn main() { n_nuple!(1,2,3); } -", +"#, ); } @@ -73,7 +68,7 @@ fn main() { n_nuple!(1,2,3); } fn macro_resolve() { // Regression test for a path resolution bug introduced with inner item handling. lower( - r" + r#" macro_rules! vec { () => { () }; ($elem:expr; $n:expr) => { () }; @@ -84,19 +79,6 @@ mod m { let _ = vec![FileSet::default(); self.len()]; } } - ", +"#, ); } - -#[test] -fn unresolved_macro_diag() { - check_diagnostics( - r#" -fn f() { - m!(); - //^^^^ UnresolvedMacroCall -} - "#, - ); -} - diff --git a/crates/hir_def/src/test_db.rs b/crates/hir_def/src/test_db.rs index a16203fdb..2635b556e 100644 --- a/crates/hir_def/src/test_db.rs +++ b/crates/hir_def/src/test_db.rs @@ -6,19 +6,16 @@ use std::{ }; use base_db::{ - salsa, CrateId, FileId, FileLoader, FileLoaderDelegate, FilePosition, FileRange, Upcast, + salsa, AnchoredPath, CrateId, FileId, FileLoader, FileLoaderDelegate, FilePosition, + SourceDatabase, Upcast, }; -use base_db::{AnchoredPath, SourceDatabase}; use hir_expand::{db::AstDatabase, InFile}; -use rustc_hash::FxHashMap; use rustc_hash::FxHashSet; -use syntax::{algo, ast, AstNode, SyntaxNode, SyntaxNodePtr, TextRange, TextSize}; -use test_utils::extract_annotations; +use syntax::{algo, ast, AstNode}; use crate::{ - body::BodyDiagnostic, db::DefDatabase, - nameres::{diagnostics::DefDiagnosticKind, DefMap, ModuleSource}, + nameres::{DefMap, ModuleSource}, src::HasSource, LocalModuleId, Lookup, ModuleDefId, ModuleId, }; @@ -245,145 +242,4 @@ impl TestDB { }) .collect() } - - pub(crate) fn extract_annotations(&self) -> FxHashMap> { - let mut files = Vec::new(); - let crate_graph = self.crate_graph(); - for krate in crate_graph.iter() { - let crate_def_map = self.crate_def_map(krate); - for (module_id, _) in crate_def_map.modules() { - let file_id = crate_def_map[module_id].origin.file_id(); - files.extend(file_id) - } - } - assert!(!files.is_empty()); - files - .into_iter() - .filter_map(|file_id| { - let text = self.file_text(file_id); - let annotations = extract_annotations(&text); - if annotations.is_empty() { - return None; - } - Some((file_id, annotations)) - }) - .collect() - } - - pub(crate) fn diagnostics(&self, cb: &mut dyn FnMut(FileRange, String)) { - let crate_graph = self.crate_graph(); - for krate in crate_graph.iter() { - let crate_def_map = self.crate_def_map(krate); - - for diag in crate_def_map.diagnostics() { - let (node, message): (InFile, &str) = match &diag.kind { - DefDiagnosticKind::UnresolvedModule { ast, .. } => { - let node = ast.to_node(self.upcast()); - (InFile::new(ast.file_id, node.syntax().clone()), "UnresolvedModule") - } - DefDiagnosticKind::UnresolvedExternCrate { ast, .. } => { - let node = ast.to_node(self.upcast()); - (InFile::new(ast.file_id, node.syntax().clone()), "UnresolvedExternCrate") - } - DefDiagnosticKind::UnresolvedImport { id, .. } => { - let item_tree = id.item_tree(self.upcast()); - let import = &item_tree[id.value]; - let node = InFile::new(id.file_id(), import.ast_id).to_node(self.upcast()); - (InFile::new(id.file_id(), node.syntax().clone()), "UnresolvedImport") - } - DefDiagnosticKind::UnconfiguredCode { ast, .. } => { - let node = ast.to_node(self.upcast()); - (InFile::new(ast.file_id, node.syntax().clone()), "UnconfiguredCode") - } - DefDiagnosticKind::UnresolvedProcMacro { ast, .. } => { - (ast.to_node(self.upcast()), "UnresolvedProcMacro") - } - DefDiagnosticKind::UnresolvedMacroCall { ast, .. } => { - let node = ast.to_node(self.upcast()); - (InFile::new(ast.file_id, node.syntax().clone()), "UnresolvedMacroCall") - } - DefDiagnosticKind::MacroError { ast, message } => { - (ast.to_node(self.upcast()), message.as_str()) - } - DefDiagnosticKind::UnimplementedBuiltinMacro { ast } => { - let node = ast.to_node(self.upcast()); - ( - InFile::new(ast.file_id, node.syntax().clone()), - "UnimplementedBuiltinMacro", - ) - } - }; - - let frange = node.as_ref().original_file_range(self); - cb(frange, message.to_string()) - } - - for (_module_id, module) in crate_def_map.modules() { - for decl in module.scope.declarations() { - if let ModuleDefId::FunctionId(it) = decl { - let source_map = self.body_with_source_map(it.into()).1; - for diag in source_map.diagnostics() { - let (ptr, message): (InFile, &str) = match diag { - BodyDiagnostic::InactiveCode { node, .. } => { - (node.clone().map(|it| it), "InactiveCode") - } - BodyDiagnostic::MacroError { node, message } => { - (node.clone().map(|it| it.into()), message.as_str()) - } - BodyDiagnostic::UnresolvedProcMacro { node } => { - (node.clone().map(|it| it.into()), "UnresolvedProcMacro") - } - BodyDiagnostic::UnresolvedMacroCall { node, .. } => { - (node.clone().map(|it| it.into()), "UnresolvedMacroCall") - } - }; - - let root = self.parse_or_expand(ptr.file_id).unwrap(); - let node = ptr.map(|ptr| ptr.to_node(&root)); - let frange = node.as_ref().original_file_range(self); - cb(frange, message.to_string()) - } - } - } - } - } - } - - pub(crate) fn check_diagnostics(&self) { - let db: &TestDB = self; - let annotations = db.extract_annotations(); - assert!(!annotations.is_empty()); - - let mut actual: FxHashMap> = FxHashMap::default(); - db.diagnostics(&mut |frange, message| { - actual.entry(frange.file_id).or_default().push((frange.range, message)); - }); - - for (file_id, diags) in actual.iter_mut() { - diags.sort_by_key(|it| it.0.start()); - let text = db.file_text(*file_id); - // For multiline spans, place them on line start - for (range, content) in diags { - if text[*range].contains('\n') { - *range = TextRange::new(range.start(), range.start() + TextSize::from(1)); - *content = format!("... {}", content); - } - } - } - - 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(&mut |_, _| { - has_diagnostics = true; - }); - - assert!(!has_diagnostics); - } } -- cgit v1.2.3