mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-10-02 06:41:48 +00:00
internal: document diagnostics crate
This commit is contained in:
parent
94f7b63522
commit
4768e5fb23
20 changed files with 85 additions and 63 deletions
110
crates/ide_diagnostics/src/handlers/unresolved_module.rs
Normal file
110
crates/ide_diagnostics/src/handlers/unresolved_module.rs
Normal file
|
@ -0,0 +1,110 @@
|
|||
use hir::db::AstDatabase;
|
||||
use ide_db::{assists::Assist, base_db::AnchoredPathBuf, source_change::FileSystemEdit};
|
||||
use syntax::AstNode;
|
||||
|
||||
use crate::{fix, Diagnostic, DiagnosticsContext};
|
||||
|
||||
// Diagnostic: unresolved-module
|
||||
//
|
||||
// This diagnostic is triggered if rust-analyzer is unable to discover referred module.
|
||||
pub(crate) fn unresolved_module(
|
||||
ctx: &DiagnosticsContext<'_>,
|
||||
d: &hir::UnresolvedModule,
|
||||
) -> Diagnostic {
|
||||
Diagnostic::new(
|
||||
"unresolved-module",
|
||||
"unresolved module",
|
||||
ctx.sema.diagnostics_display_range(d.decl.clone().map(|it| it.into())).range,
|
||||
)
|
||||
.with_fixes(fixes(ctx, d))
|
||||
}
|
||||
|
||||
fn fixes(ctx: &DiagnosticsContext<'_>, d: &hir::UnresolvedModule) -> Option<Vec<Assist>> {
|
||||
let root = ctx.sema.db.parse_or_expand(d.decl.file_id)?;
|
||||
let unresolved_module = d.decl.value.to_node(&root);
|
||||
Some(vec![fix(
|
||||
"create_module",
|
||||
"Create module",
|
||||
FileSystemEdit::CreateFile {
|
||||
dst: AnchoredPathBuf {
|
||||
anchor: d.decl.file_id.original_file(ctx.sema.db),
|
||||
path: d.candidate.clone(),
|
||||
},
|
||||
initial_contents: "".to_string(),
|
||||
}
|
||||
.into(),
|
||||
unresolved_module.syntax().text_range(),
|
||||
)])
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use expect_test::expect;
|
||||
|
||||
use crate::tests::{check_diagnostics, check_expect};
|
||||
|
||||
#[test]
|
||||
fn unresolved_module() {
|
||||
check_diagnostics(
|
||||
r#"
|
||||
//- /lib.rs
|
||||
mod foo;
|
||||
mod bar;
|
||||
//^^^^^^^^ unresolved module
|
||||
mod baz {}
|
||||
//- /foo.rs
|
||||
"#,
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_unresolved_module_diagnostic() {
|
||||
check_expect(
|
||||
r#"mod foo;"#,
|
||||
expect![[r#"
|
||||
[
|
||||
Diagnostic {
|
||||
code: DiagnosticCode(
|
||||
"unresolved-module",
|
||||
),
|
||||
message: "unresolved module",
|
||||
range: 0..8,
|
||||
severity: Error,
|
||||
unused: false,
|
||||
experimental: false,
|
||||
fixes: Some(
|
||||
[
|
||||
Assist {
|
||||
id: AssistId(
|
||||
"create_module",
|
||||
QuickFix,
|
||||
),
|
||||
label: "Create module",
|
||||
group: None,
|
||||
target: 0..8,
|
||||
source_change: Some(
|
||||
SourceChange {
|
||||
source_file_edits: {},
|
||||
file_system_edits: [
|
||||
CreateFile {
|
||||
dst: AnchoredPathBuf {
|
||||
anchor: FileId(
|
||||
0,
|
||||
),
|
||||
path: "foo.rs",
|
||||
},
|
||||
initial_contents: "",
|
||||
},
|
||||
],
|
||||
is_snippet: false,
|
||||
},
|
||||
),
|
||||
},
|
||||
],
|
||||
),
|
||||
},
|
||||
]
|
||||
"#]],
|
||||
);
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue