1 use hir::db::AstDatabase;
2 use ide_db::{assists::Assist, base_db::AnchoredPathBuf, source_change::FileSystemEdit};
3 use itertools::Itertools;
6 use crate::{fix, Diagnostic, DiagnosticsContext};
8 // Diagnostic: unresolved-module
10 // This diagnostic is triggered if rust-analyzer is unable to discover referred module.
11 pub(crate) fn unresolved_module(
12 ctx: &DiagnosticsContext<'_>,
13 d: &hir::UnresolvedModule,
17 match &*d.candidates {
18 [] => "unresolved module".to_string(),
19 [candidate] => format!("unresolved module, can't find module file: {}", candidate),
20 [candidates @ .., last] => {
22 "unresolved module, can't find module file: {}, or {}",
23 candidates.iter().format(", "),
28 ctx.sema.diagnostics_display_range(d.decl.clone().map(|it| it.into())).range,
30 .with_fixes(fixes(ctx, d))
33 fn fixes(ctx: &DiagnosticsContext<'_>, d: &hir::UnresolvedModule) -> Option<Vec<Assist>> {
34 let root = ctx.sema.db.parse_or_expand(d.decl.file_id)?;
35 let unresolved_module = d.decl.value.to_node(&root);
43 FileSystemEdit::CreateFile {
44 dst: AnchoredPathBuf {
45 anchor: d.decl.file_id.original_file(ctx.sema.db),
46 path: candidate.clone(),
48 initial_contents: "".to_string(),
51 unresolved_module.syntax().text_range(),
60 use expect_test::expect;
62 use crate::tests::{check_diagnostics, check_expect};
65 fn unresolved_module() {
71 //^^^^^^^^ 💡 error: unresolved module, can't find module file: bar.rs, or bar/mod.rs
79 fn test_unresolved_module_diagnostic() {
88 message: "unresolved module, can't find module file: foo.rs, or foo/mod.rs",
100 label: "Create module",
105 source_file_edits: {},
108 dst: AnchoredPathBuf {
114 initial_contents: "",
126 label: "Create module",
131 source_file_edits: {},
134 dst: AnchoredPathBuf {
140 initial_contents: "",