Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-ty/src/diagnostics/decl_check.rs')
-rw-r--r--crates/hir-ty/src/diagnostics/decl_check.rs99
1 files changed, 49 insertions, 50 deletions
diff --git a/crates/hir-ty/src/diagnostics/decl_check.rs b/crates/hir-ty/src/diagnostics/decl_check.rs
index 774991560e..099100a732 100644
--- a/crates/hir-ty/src/diagnostics/decl_check.rs
+++ b/crates/hir-ty/src/diagnostics/decl_check.rs
@@ -16,20 +16,20 @@ mod case_conv;
use std::fmt;
use hir_def::{
- data::adt::VariantData, db::DefDatabase, hir::Pat, src::HasSource, AdtId, ConstId, EnumId,
- EnumVariantId, FunctionId, HasModule, ItemContainerId, Lookup, ModuleDefId, ModuleId, StaticId,
- StructId, TraitId, TypeAliasId,
+ AdtId, ConstId, EnumId, EnumVariantId, FunctionId, HasModule, ItemContainerId, Lookup,
+ ModuleDefId, ModuleId, StaticId, StructId, TraitId, TypeAliasId, db::DefDatabase, hir::Pat,
+ item_tree::FieldsShape, signatures::StaticFlags, src::HasSource,
};
use hir_expand::{
+ HirFileId,
name::{AsName, Name},
- HirFileId, HirFileIdExt,
};
use intern::sym;
use stdx::{always, never};
use syntax::{
+ AstNode, AstPtr, ToSmolStr,
ast::{self, HasName},
utils::is_raw_identifier,
- AstNode, AstPtr, ToSmolStr,
};
use crate::db::HirDatabase;
@@ -154,7 +154,7 @@ impl<'a> DeclValidator<'a> {
fn validate_module(&mut self, module_id: ModuleId) {
// Check the module name.
- let Some(module_name) = module_id.name(self.db.upcast()) else { return };
+ let Some(module_name) = module_id.name(self.db) else { return };
let Some(module_name_replacement) =
to_lower_snake_case(module_name.as_str()).map(|new_name| Replacement {
current_name: module_name,
@@ -164,8 +164,8 @@ impl<'a> DeclValidator<'a> {
else {
return;
};
- let module_data = &module_id.def_map(self.db.upcast())[module_id.local_id];
- let Some(module_src) = module_data.declaration_source(self.db.upcast()) else {
+ let module_data = &module_id.def_map(self.db)[module_id.local_id];
+ let Some(module_src) = module_data.declaration_source(self.db) else {
return;
};
self.create_incorrect_case_diagnostic_for_ast_node(
@@ -178,7 +178,7 @@ impl<'a> DeclValidator<'a> {
fn validate_trait(&mut self, trait_id: TraitId) {
// Check the trait name.
- let data = self.db.trait_data(trait_id);
+ let data = self.db.trait_signature(trait_id);
self.create_incorrect_case_diagnostic_for_item_name(
trait_id,
&data.name,
@@ -188,7 +188,7 @@ impl<'a> DeclValidator<'a> {
}
fn validate_func(&mut self, func: FunctionId) {
- let container = func.lookup(self.db.upcast()).container;
+ let container = func.lookup(self.db).container;
if matches!(container, ItemContainerId::ExternBlockId(_)) {
cov_mark::hit!(extern_func_incorrect_case_ignored);
return;
@@ -197,11 +197,11 @@ impl<'a> DeclValidator<'a> {
// Check the function name.
// Skipped if function is an associated item of a trait implementation.
if !self.is_trait_impl_container(container) {
- let data = self.db.function_data(func);
+ let data = self.db.function_signature(func);
// Don't run the lint on extern "[not Rust]" fn items with the
// #[no_mangle] attribute.
- let no_mangle = self.db.attrs(func.into()).by_key(&sym::no_mangle).exists();
+ let no_mangle = self.db.attrs(func.into()).by_key(sym::no_mangle).exists();
if no_mangle && data.abi.as_ref().is_some_and(|abi| *abi != sym::Rust) {
cov_mark::hit!(extern_func_no_mangle_ignored);
} else {
@@ -251,7 +251,7 @@ impl<'a> DeclValidator<'a> {
return;
}
- let (_, source_map) = self.db.body_with_source_map(func.into());
+ let source_map = self.db.body_with_source_map(func.into()).1;
for (id, replacement) in pats_replacements {
let Ok(source_ptr) = source_map.pat_syntax(id) else {
continue;
@@ -259,7 +259,7 @@ impl<'a> DeclValidator<'a> {
let Some(ptr) = source_ptr.value.cast::<ast::IdentPat>() else {
continue;
};
- let root = source_ptr.file_syntax(self.db.upcast());
+ let root = source_ptr.file_syntax(self.db);
let ident_pat = ptr.to_node(&root);
let Some(parent) = ident_pat.syntax().parent() else {
continue;
@@ -287,13 +287,13 @@ impl<'a> DeclValidator<'a> {
}
fn edition(&self, id: impl HasModule) -> span::Edition {
- let krate = id.krate(self.db.upcast());
- self.db.crate_graph()[krate].edition
+ let krate = id.krate(self.db);
+ krate.data(self.db).edition
}
fn validate_struct(&mut self, struct_id: StructId) {
// Check the structure name.
- let data = self.db.struct_data(struct_id);
+ let data = self.db.struct_signature(struct_id);
self.create_incorrect_case_diagnostic_for_item_name(
struct_id,
&data.name,
@@ -307,12 +307,13 @@ impl<'a> DeclValidator<'a> {
/// Check incorrect names for struct fields.
fn validate_struct_fields(&mut self, struct_id: StructId) {
- let data = self.db.struct_data(struct_id);
- let VariantData::Record { fields, .. } = data.variant_data.as_ref() else {
+ let data = self.db.variant_fields(struct_id.into());
+ if data.shape != FieldsShape::Record {
return;
};
let edition = self.edition(struct_id);
- let mut struct_fields_replacements = fields
+ let mut struct_fields_replacements = data
+ .fields()
.iter()
.filter_map(|(_, field)| {
to_lower_snake_case(&field.name.display_no_db(edition).to_smolstr()).map(
@@ -330,8 +331,8 @@ impl<'a> DeclValidator<'a> {
return;
}
- let struct_loc = struct_id.lookup(self.db.upcast());
- let struct_src = struct_loc.source(self.db.upcast());
+ let struct_loc = struct_id.lookup(self.db);
+ let struct_src = struct_loc.source(self.db);
let Some(ast::FieldList::RecordFieldList(struct_fields_list)) =
struct_src.value.field_list()
@@ -378,7 +379,7 @@ impl<'a> DeclValidator<'a> {
}
fn validate_enum(&mut self, enum_id: EnumId) {
- let data = self.db.enum_data(enum_id);
+ let data = self.db.enum_signature(enum_id);
// Check the enum name.
self.create_incorrect_case_diagnostic_for_item_name(
@@ -394,7 +395,7 @@ impl<'a> DeclValidator<'a> {
/// Check incorrect names for enum variants.
fn validate_enum_variants(&mut self, enum_id: EnumId) {
- let data = self.db.enum_data(enum_id);
+ let data = self.db.enum_variants(enum_id);
for (variant_id, _) in data.variants.iter() {
self.validate_enum_variant_fields(*variant_id);
@@ -420,8 +421,8 @@ impl<'a> DeclValidator<'a> {
return;
}
- let enum_loc = enum_id.lookup(self.db.upcast());
- let enum_src = enum_loc.source(self.db.upcast());
+ let enum_loc = enum_id.lookup(self.db);
+ let enum_src = enum_loc.source(self.db);
let Some(enum_variants_list) = enum_src.value.variant_list() else {
always!(
@@ -467,12 +468,13 @@ impl<'a> DeclValidator<'a> {
/// Check incorrect names for fields of enum variant.
fn validate_enum_variant_fields(&mut self, variant_id: EnumVariantId) {
- let variant_data = self.db.enum_variant_data(variant_id);
- let VariantData::Record { fields, .. } = variant_data.variant_data.as_ref() else {
+ let variant_data = self.db.variant_fields(variant_id.into());
+ if variant_data.shape != FieldsShape::Record {
return;
};
let edition = self.edition(variant_id);
- let mut variant_field_replacements = fields
+ let mut variant_field_replacements = variant_data
+ .fields()
.iter()
.filter_map(|(_, field)| {
to_lower_snake_case(&field.name.display_no_db(edition).to_smolstr()).map(
@@ -490,8 +492,8 @@ impl<'a> DeclValidator<'a> {
return;
}
- let variant_loc = variant_id.lookup(self.db.upcast());
- let variant_src = variant_loc.source(self.db.upcast());
+ let variant_loc = variant_id.lookup(self.db);
+ let variant_src = variant_loc.source(self.db);
let Some(ast::FieldList::RecordFieldList(variant_fields_list)) =
variant_src.value.field_list()
@@ -538,13 +540,13 @@ impl<'a> DeclValidator<'a> {
}
fn validate_const(&mut self, const_id: ConstId) {
- let container = const_id.lookup(self.db.upcast()).container;
+ let container = const_id.lookup(self.db).container;
if self.is_trait_impl_container(container) {
cov_mark::hit!(trait_impl_assoc_const_incorrect_case_ignored);
return;
}
- let data = self.db.const_data(const_id);
+ let data = self.db.const_signature(const_id);
let Some(name) = &data.name else {
return;
};
@@ -557,8 +559,8 @@ impl<'a> DeclValidator<'a> {
}
fn validate_static(&mut self, static_id: StaticId) {
- let data = self.db.static_data(static_id);
- if data.is_extern {
+ let data = self.db.static_signature(static_id);
+ if data.flags.contains(StaticFlags::EXTERN) {
cov_mark::hit!(extern_static_incorrect_case_ignored);
return;
}
@@ -572,14 +574,14 @@ impl<'a> DeclValidator<'a> {
}
fn validate_type_alias(&mut self, type_alias_id: TypeAliasId) {
- let container = type_alias_id.lookup(self.db.upcast()).container;
+ let container = type_alias_id.lookup(self.db).container;
if self.is_trait_impl_container(container) {
cov_mark::hit!(trait_impl_assoc_type_incorrect_case_ignored);
return;
}
// Check the type alias name.
- let data = self.db.type_alias_data(type_alias_id);
+ let data = self.db.type_alias_signature(type_alias_id);
self.create_incorrect_case_diagnostic_for_item_name(
type_alias_id,
&data.name,
@@ -597,7 +599,7 @@ impl<'a> DeclValidator<'a> {
) where
N: AstNode + HasName + fmt::Debug,
S: HasSource<Value = N>,
- L: Lookup<Data = S, Database<'a> = dyn DefDatabase + 'a> + HasModule + Copy,
+ L: Lookup<Data = S, Database = dyn DefDatabase> + HasModule + Copy,
{
let to_expected_case_type = match expected_case {
CaseType::LowerSnakeCase => to_lower_snake_case,
@@ -605,19 +607,16 @@ impl<'a> DeclValidator<'a> {
CaseType::UpperCamelCase => to_camel_case,
};
let edition = self.edition(item_id);
- let Some(replacement) = to_expected_case_type(
- &name.display(self.db.upcast(), edition).to_smolstr(),
- )
- .map(|new_name| Replacement {
- current_name: name.clone(),
- suggested_text: new_name,
- expected_case,
- }) else {
+ let Some(replacement) =
+ to_expected_case_type(&name.display(self.db, edition).to_smolstr()).map(|new_name| {
+ Replacement { current_name: name.clone(), suggested_text: new_name, expected_case }
+ })
+ else {
return;
};
- let item_loc = item_id.lookup(self.db.upcast());
- let item_src = item_loc.source(self.db.upcast());
+ let item_loc = item_id.lookup(self.db);
+ let item_src = item_loc.source(self.db);
self.create_incorrect_case_diagnostic_for_ast_node(
replacement,
item_src.file_id,
@@ -645,13 +644,13 @@ impl<'a> DeclValidator<'a> {
return;
};
- let edition = file_id.original_file(self.db.upcast()).edition();
+ let edition = file_id.original_file(self.db).edition(self.db);
let diagnostic = IncorrectCase {
file: file_id,
ident_type,
ident: AstPtr::new(&name_ast),
expected_case: replacement.expected_case,
- ident_text: replacement.current_name.display(self.db.upcast(), edition).to_string(),
+ ident_text: replacement.current_name.display(self.db, edition).to_string(),
suggested_text: replacement.suggested_text,
};