Unnamed repository; edit this file 'description' to name the repository.
Diagnose cfged-out crate
Chayim Refael Friedman 6 weeks ago
parent 49094db · commit 98d64d2
-rw-r--r--crates/hir-def/src/nameres/collector.rs11
-rw-r--r--crates/ide-diagnostics/src/handlers/inactive_code.rs42
2 files changed, 50 insertions, 3 deletions
diff --git a/crates/hir-def/src/nameres/collector.rs b/crates/hir-def/src/nameres/collector.rs
index 9c101c127b..703f070dba 100644
--- a/crates/hir-def/src/nameres/collector.rs
+++ b/crates/hir-def/src/nameres/collector.rs
@@ -22,7 +22,7 @@ use itertools::izip;
use la_arena::Idx;
use rustc_hash::{FxHashMap, FxHashSet};
use smallvec::SmallVec;
-use span::{Edition, FileAstId, SyntaxContext};
+use span::{Edition, FileAstId, ROOT_ERASED_FILE_AST_ID, SyntaxContext};
use stdx::always;
use syntax::ast;
use triomphe::Arc;
@@ -369,7 +369,14 @@ impl<'db> DefCollector<'db> {
self.inject_prelude();
- if matches!(item_tree.top_level_attrs(), AttrsOrCfg::CfgDisabled(_)) {
+ if let AttrsOrCfg::CfgDisabled(attrs) = item_tree.top_level_attrs() {
+ let (cfg_expr, _) = &**attrs;
+ self.def_map.diagnostics.push(DefDiagnostic::unconfigured_code(
+ self.def_map.root,
+ InFile::new(file_id.into(), ROOT_ERASED_FILE_AST_ID),
+ cfg_expr.clone(),
+ self.cfg_options.clone(),
+ ));
return;
}
diff --git a/crates/ide-diagnostics/src/handlers/inactive_code.rs b/crates/ide-diagnostics/src/handlers/inactive_code.rs
index dfa9639f6e..9bfbeeebf7 100644
--- a/crates/ide-diagnostics/src/handlers/inactive_code.rs
+++ b/crates/ide-diagnostics/src/handlers/inactive_code.rs
@@ -40,7 +40,10 @@ pub(crate) fn inactive_code(
#[cfg(test)]
mod tests {
- use crate::{DiagnosticsConfig, tests::check_diagnostics_with_config};
+ use ide_db::RootDatabase;
+ use test_fixture::WithFixture;
+
+ use crate::{DiagnosticCode, DiagnosticsConfig, tests::check_diagnostics_with_config};
#[track_caller]
pub(crate) fn check(#[rust_analyzer::rust_fixture] ra_fixture: &str) {
@@ -212,4 +215,41 @@ union FooBar {
"#,
);
}
+
+ #[test]
+ fn inactive_crate() {
+ let db = RootDatabase::with_files(
+ r#"
+#![cfg(false)]
+
+fn foo() {}
+ "#,
+ );
+ let file_id = db.test_crate().root_file_id(&db);
+ let diagnostics = hir::attach_db(&db, || {
+ crate::full_diagnostics(
+ &db,
+ &DiagnosticsConfig::test_sample(),
+ &ide_db::assists::AssistResolveStrategy::All,
+ file_id.file_id(&db),
+ )
+ });
+ let [inactive_code] = &*diagnostics else {
+ panic!("expected one inactive_code diagnostic, found {diagnostics:#?}");
+ };
+ assert_eq!(
+ inactive_code.code,
+ DiagnosticCode::Ra("inactive-code", ide_db::Severity::WeakWarning)
+ );
+ assert_eq!(
+ inactive_code.message,
+ "code is inactive due to #[cfg] directives: false is disabled",
+ );
+ assert!(inactive_code.fixes.is_none());
+ let full_file_range = file_id.parse(&db).syntax_node().text_range();
+ assert_eq!(
+ inactive_code.range,
+ ide_db::FileRange { file_id: file_id.file_id(&db), range: full_file_range },
+ );
+ }
}