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.rs49
1 files changed, 10 insertions, 39 deletions
diff --git a/crates/ide-diagnostics/src/lib.rs b/crates/ide-diagnostics/src/lib.rs
index 1530e64652..41ae854455 100644
--- a/crates/ide-diagnostics/src/lib.rs
+++ b/crates/ide-diagnostics/src/lib.rs
@@ -90,7 +90,7 @@ use hir::{
Crate, DisplayTarget, InFile, Semantics, db::ExpandDatabase, diagnostics::AnyDiagnostic,
};
use ide_db::{
- EditionedFileId, FileId, FileRange, FxHashMap, FxHashSet, RootDatabase, Severity, SnippetCap,
+ FileId, FileRange, FxHashMap, FxHashSet, RootDatabase, Severity, SnippetCap,
assists::{Assist, AssistId, AssistResolveStrategy, ExprFillDefaultMode},
base_db::{ReleaseChannel, RootQueryDb as _},
generated::lints::{CLIPPY_LINT_GROUPS, DEFAULT_LINT_GROUPS, DEFAULT_LINTS, Lint, LintGroup},
@@ -102,7 +102,7 @@ use ide_db::{
use itertools::Itertools;
use syntax::{
AstPtr, Edition, NodeOrToken, SmolStr, SyntaxKind, SyntaxNode, SyntaxNodePtr, T, TextRange,
- ast::{self, AstNode, HasAttrs},
+ ast::{self, AstNode},
};
// FIXME: Make this an enum
@@ -277,31 +277,6 @@ struct DiagnosticsContext<'a> {
is_nightly: bool,
}
-impl DiagnosticsContext<'_> {
- fn resolve_precise_location(
- &self,
- node: &InFile<SyntaxNodePtr>,
- precise_location: Option<TextRange>,
- ) -> FileRange {
- 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)
- }
- }
- })()
- .map(|frange| ide_db::FileRange {
- file_id: frange.file_id.file_id(self.sema.db),
- range: frange.range,
- })
- .unwrap_or_else(|| sema.diagnostics_display_range(*node))
- }
-}
-
/// Request parser level diagnostics for the given [`FileId`].
pub fn syntax_diagnostics(
db: &RootDatabase,
@@ -315,9 +290,7 @@ pub fn syntax_diagnostics(
}
let sema = Semantics::new(db);
- let editioned_file_id = sema
- .attach_first_edition(file_id)
- .unwrap_or_else(|| EditionedFileId::current_edition(db, file_id));
+ let editioned_file_id = sema.attach_first_edition(file_id);
let (file_id, _) = editioned_file_id.unpack(db);
@@ -346,9 +319,7 @@ pub fn semantic_diagnostics(
) -> Vec<Diagnostic> {
let _p = tracing::info_span!("semantic_diagnostics").entered();
let sema = Semantics::new(db);
- let editioned_file_id = sema
- .attach_first_edition(file_id)
- .unwrap_or_else(|| EditionedFileId::current_edition(db, file_id));
+ let editioned_file_id = sema.attach_first_edition(file_id);
let (file_id, edition) = editioned_file_id.unpack(db);
let mut res = Vec::new();
@@ -426,7 +397,7 @@ pub fn semantic_diagnostics(
Diagnostic::new(
DiagnosticCode::SyntaxError,
format!("Syntax Error in Expansion: {err}"),
- ctx.resolve_precise_location(&d.node.clone(), d.precise_location),
+ ctx.sema.diagnostics_display_range_for_range(d.range),
)
}));
continue;
@@ -677,7 +648,7 @@ fn find_outline_mod_lint_severity(
let lint_groups = lint_groups(&diag.code, edition);
lint_attrs(
sema,
- ast::AnyHasAttrs::cast(module_source_file.value).expect("SourceFile always has attrs"),
+ &ast::AnyHasAttrs::cast(module_source_file.value).expect("SourceFile always has attrs"),
edition,
)
.for_each(|(lint, severity)| {
@@ -698,7 +669,7 @@ fn lint_severity_at(
.ancestors()
.filter_map(ast::AnyHasAttrs::cast)
.find_map(|ancestor| {
- lint_attrs(sema, ancestor, edition)
+ lint_attrs(sema, &ancestor, edition)
.find_map(|(lint, severity)| lint_groups.contains(&lint).then_some(severity))
})
.or_else(|| {
@@ -706,13 +677,13 @@ fn lint_severity_at(
})
}
+// FIXME: Switch this to analysis' `expand_cfg_attr`.
fn lint_attrs<'a>(
sema: &'a Semantics<'a, RootDatabase>,
- ancestor: ast::AnyHasAttrs,
+ ancestor: &'a ast::AnyHasAttrs,
edition: Edition,
) -> impl Iterator<Item = (SmolStr, Severity)> + 'a {
- ancestor
- .attrs_including_inner()
+ ast::attrs_including_inner(ancestor)
.filter_map(|attr| {
attr.as_simple_call().and_then(|(name, value)| match &*name {
"allow" | "expect" => Some(Either::Left(iter::once((Severity::Allow, value)))),