Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide-diagnostics/src/lib.rs')
| -rw-r--r-- | crates/ide-diagnostics/src/lib.rs | 20 |
1 files changed, 17 insertions, 3 deletions
diff --git a/crates/ide-diagnostics/src/lib.rs b/crates/ide-diagnostics/src/lib.rs index daf9b16886..41abaa836f 100644 --- a/crates/ide-diagnostics/src/lib.rs +++ b/crates/ide-diagnostics/src/lib.rs @@ -55,15 +55,15 @@ mod handlers { #[cfg(test)] mod tests; -use hir::{diagnostics::AnyDiagnostic, Semantics}; +use hir::{diagnostics::AnyDiagnostic, InFile, Semantics}; use ide_db::{ assists::{Assist, AssistId, AssistKind, AssistResolveStrategy}, - base_db::{FileId, SourceDatabase}, + base_db::{FileId, FileRange, SourceDatabase}, label::Label, source_change::SourceChange, FxHashSet, RootDatabase, }; -use syntax::{ast::AstNode, TextRange}; +use syntax::{algo::find_node_at_range, ast::AstNode, SyntaxNodePtr, TextRange}; #[derive(Copy, Clone, Debug, PartialEq)] pub struct DiagnosticCode(pub &'static str); @@ -244,3 +244,17 @@ fn unresolved_fix(id: &'static str, label: &str, target: TextRange) -> Assist { trigger_signature_help: false, } } + +fn adjusted_display_range<N: AstNode>( + ctx: &DiagnosticsContext<'_>, + diag_ptr: InFile<SyntaxNodePtr>, + adj: &dyn Fn(N) -> Option<TextRange>, +) -> TextRange { + let FileRange { file_id, range } = ctx.sema.diagnostics_display_range(diag_ptr); + + let source_file = ctx.sema.db.parse(file_id); + find_node_at_range::<N>(&source_file.syntax_node(), range) + .filter(|it| it.syntax().text_range() == range) + .and_then(adj) + .unwrap_or(range) +} |