Auto merge of #16477 - davidsemakula:trait-incorrect-case-diagnostic, r=Veykril

feat: Add incorrect case diagnostics for traits and their associated items

Updates incorrect case diagnostic to:
- Check traits and their associated items
- Ignore trait implementations except for patterns in associated function bodies

Also cleans up `hir-ty::diagnostics::decl_check` a bit (mostly to make it a bit more DRY and easier to maintain)

Also fixes: #8675 and fixes: #8225
This commit is contained in:
bors 2024-02-08 14:40:16 +00:00
commit 0e5766b0d8
5 changed files with 411 additions and 421 deletions

View file

@ -563,6 +563,11 @@ impl Module {
for diag in db.trait_data_with_diagnostics(t.id).1.iter() {
emit_def_diagnostic(db, acc, diag);
}
for item in t.items(db) {
item.diagnostics(db, acc);
}
acc.extend(def.diagnostics(db))
}
ModuleDef::Adt(adt) => {
@ -730,13 +735,7 @@ impl Module {
}
for &item in &db.impl_data(impl_def.id).items {
let def: DefWithBody = match AssocItem::from(item) {
AssocItem::Function(it) => it.into(),
AssocItem::Const(it) => it.into(),
AssocItem::TypeAlias(_) => continue,
};
def.diagnostics(db, acc);
AssocItem::from(item).diagnostics(db, acc);
}
}
}
@ -2651,6 +2650,22 @@ impl AssocItem {
_ => None,
}
}
pub fn diagnostics(self, db: &dyn HirDatabase, acc: &mut Vec<AnyDiagnostic>) {
match self {
AssocItem::Function(func) => {
DefWithBody::from(func).diagnostics(db, acc);
}
AssocItem::Const(const_) => {
DefWithBody::from(const_).diagnostics(db, acc);
}
AssocItem::TypeAlias(type_alias) => {
for diag in hir_ty::diagnostics::incorrect_case(db, type_alias.id.into()) {
acc.push(diag.into());
}
}
}
}
}
impl HasVisibility for AssocItem {