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.rs54
1 files changed, 38 insertions, 16 deletions
diff --git a/crates/ide-diagnostics/src/lib.rs b/crates/ide-diagnostics/src/lib.rs
index e2e465e26c..f77c20b085 100644
--- a/crates/ide-diagnostics/src/lib.rs
+++ b/crates/ide-diagnostics/src/lib.rs
@@ -113,9 +113,11 @@ use ide_db::{
rename::RenameConfig,
source_change::SourceChange,
};
+use smallvec::{SmallVec, smallvec};
use syntax::{
AstPtr, Edition, SmolStr, SyntaxNode, SyntaxNodePtr, TextRange,
ast::{self, AstNode},
+ format_smolstr,
};
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
@@ -125,6 +127,7 @@ pub enum DiagnosticCode {
RustcLint(&'static str),
Clippy(&'static str),
Ra(&'static str, Severity),
+ RaLint(&'static str, Severity),
}
impl DiagnosticCode {
@@ -142,7 +145,7 @@ impl DiagnosticCode {
DiagnosticCode::Clippy(e) => {
format!("https://rust-lang.github.io/rust-clippy/master/#/{e}")
}
- DiagnosticCode::Ra(e, _) => {
+ DiagnosticCode::Ra(e, _) | DiagnosticCode::RaLint(e, _) => {
format!("https://rust-analyzer.github.io/book/diagnostics.html#{e}")
}
}
@@ -153,7 +156,8 @@ impl DiagnosticCode {
DiagnosticCode::RustcHardError(r)
| DiagnosticCode::RustcLint(r)
| DiagnosticCode::Clippy(r)
- | DiagnosticCode::Ra(r, _) => r,
+ | DiagnosticCode::Ra(r, _)
+ | DiagnosticCode::RaLint(r, _) => r,
DiagnosticCode::SyntaxError => "syntax-error",
}
}
@@ -190,7 +194,7 @@ impl Diagnostic {
// FIXME: We can make this configurable, and if the user uses `cargo clippy` on flycheck, we can
// make it normal warning.
DiagnosticCode::Clippy(_) => Severity::WeakWarning,
- DiagnosticCode::Ra(_, s) => s,
+ DiagnosticCode::Ra(_, s) | DiagnosticCode::RaLint(_, s) => s,
},
unused: false,
experimental: true,
@@ -529,7 +533,14 @@ pub fn semantic_diagnostics(
let mut lints = res
.iter_mut()
- .filter(|it| matches!(it.code, DiagnosticCode::Clippy(_) | DiagnosticCode::RustcLint(_)))
+ .filter(|it| {
+ matches!(
+ it.code,
+ DiagnosticCode::Clippy(_)
+ | DiagnosticCode::RustcLint(_)
+ | DiagnosticCode::RaLint(..)
+ )
+ })
.filter_map(|it| Some((it.main_node(&ctx.sema)?, it)))
.collect::<Vec<_>>();
@@ -602,7 +613,7 @@ fn handle_diag_from_macros(
struct BuiltLint {
lint: &'static Lint,
- groups: Vec<&'static str>,
+ groups: SmallVec<[SmolStr; 5]>,
}
static RUSTC_LINTS: LazyLock<FxHashMap<&str, BuiltLint>> =
@@ -623,12 +634,17 @@ fn build_lints_map(
) -> FxHashMap<&'static str, BuiltLint> {
let mut map_with_prefixes: FxHashMap<_, _> = lints
.iter()
- .map(|lint| (lint.label, BuiltLint { lint, groups: vec![lint.label, "__RA_EVERY_LINT"] }))
+ .map(|lint| {
+ (
+ lint.label,
+ BuiltLint { lint, groups: smallvec![lint.label.into(), "__RA_EVERY_LINT".into()] },
+ )
+ })
.collect();
for g in lint_group {
let mut add_children = |label: &'static str| {
for child in g.children {
- map_with_prefixes.get_mut(child).unwrap().groups.push(label);
+ map_with_prefixes.get_mut(child).unwrap().groups.push(label.into());
}
};
add_children(g.lint.label);
@@ -649,12 +665,15 @@ fn handle_lints(
edition: Edition,
) {
for (node, diag) in diagnostics {
- let lint = match diag.code {
- DiagnosticCode::RustcLint(lint) => RUSTC_LINTS[lint].lint,
- DiagnosticCode::Clippy(lint) => CLIPPY_LINTS[lint].lint,
- _ => panic!("non-lint passed to `handle_lints()`"),
+ let default_severity = 'find_severity: {
+ let lint = match diag.code {
+ DiagnosticCode::RustcLint(lint) => RUSTC_LINTS[lint].lint,
+ DiagnosticCode::Clippy(lint) => CLIPPY_LINTS[lint].lint,
+ DiagnosticCode::RaLint(_, severity) => break 'find_severity severity,
+ _ => panic!("non-lint passed to `handle_lints()`"),
+ };
+ default_lint_severity(lint, edition)
};
- let default_severity = default_lint_severity(lint, edition);
if !(default_severity == Severity::Allow && diag.severity == Severity::WeakWarning) {
diag.severity = default_severity;
}
@@ -754,13 +773,13 @@ fn lint_attrs(
#[derive(Debug)]
struct LintGroups {
- groups: &'static [&'static str],
+ groups: SmallVec<[SmolStr; 5]>,
inside_warnings: bool,
}
impl LintGroups {
fn contains(&self, group: &str) -> bool {
- self.groups.contains(&group) || (self.inside_warnings && group == "warnings")
+ self.groups.iter().any(|g| g == group) || (self.inside_warnings && group == "warnings")
}
}
@@ -769,12 +788,15 @@ fn lint_groups(lint: &DiagnosticCode, edition: Edition) -> LintGroups {
DiagnosticCode::RustcLint(name) => {
let lint = &RUSTC_LINTS[name];
let inside_warnings = default_lint_severity(lint.lint, edition) == Severity::Warning;
- (&lint.groups, inside_warnings)
+ (lint.groups.clone(), inside_warnings)
}
DiagnosticCode::Clippy(name) => {
let lint = &CLIPPY_LINTS[name];
let inside_warnings = default_lint_severity(lint.lint, edition) == Severity::Warning;
- (&lint.groups, inside_warnings)
+ (lint.groups.clone(), inside_warnings)
+ }
+ DiagnosticCode::RaLint(name, severity) => {
+ (smallvec![format_smolstr!("rust_analyzer::{name}")], *severity == Severity::Warning)
}
_ => panic!("non-lint passed to `handle_lints()`"),
};