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.rs22
1 files changed, 22 insertions, 0 deletions
diff --git a/crates/ide-diagnostics/src/lib.rs b/crates/ide-diagnostics/src/lib.rs
index ae299f0584..d81e36a1f8 100644
--- a/crates/ide-diagnostics/src/lib.rs
+++ b/crates/ide-diagnostics/src/lib.rs
@@ -182,6 +182,28 @@ struct DiagnosticsContext<'a> {
resolve: &'a AssistResolveStrategy,
}
+impl<'a> DiagnosticsContext<'a> {
+ fn resolve_precise_location(
+ &self,
+ node: &InFile<SyntaxNodePtr>,
+ precise_location: Option<TextRange>,
+ ) -> TextRange {
+ let sema = &self.sema;
+ (|| {
+ let precise_location = precise_location?;
+ let root = sema.parse_or_expand(node.file_id)?;
+ match root.covering_element(precise_location) {
+ syntax::NodeOrToken::Node(it) => Some(sema.original_range(&it)),
+ syntax::NodeOrToken::Token(it) => {
+ node.with_value(it).original_file_range_opt(sema.db)
+ }
+ }
+ })()
+ .unwrap_or_else(|| sema.diagnostics_display_range(node.clone()))
+ .range
+ }
+}
+
pub fn diagnostics(
db: &RootDatabase,
config: &DiagnosticsConfig,