mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-09-30 22:01:37 +00:00
Auto merge of #15736 - rmehri01:15678_module_incorrect_case_diagnostics, r=HKalbasi
fix: add incorrect case diagnostics for module names Adds diagnostics for checking both inline and file module names are snake case. Closes #15678
This commit is contained in:
commit
bd38871a98
4 changed files with 123 additions and 10 deletions
|
@ -9,6 +9,7 @@
|
|||
//! - constants (e.g. `const FOO: u8 = 10;`)
|
||||
//! - static items (e.g. `static FOO: u8 = 10;`)
|
||||
//! - match arm bindings (e.g. `foo @ Some(_)`)
|
||||
//! - modules (e.g. `mod foo { ... }` or `mod foo;`)
|
||||
|
||||
mod case_conv;
|
||||
|
||||
|
@ -19,7 +20,7 @@ use hir_def::{
|
|||
hir::{Pat, PatId},
|
||||
src::HasSource,
|
||||
AdtId, AttrDefId, ConstId, DefWithBodyId, EnumId, EnumVariantId, FunctionId, ItemContainerId,
|
||||
Lookup, ModuleDefId, StaticId, StructId,
|
||||
Lookup, ModuleDefId, ModuleId, StaticId, StructId,
|
||||
};
|
||||
use hir_expand::{
|
||||
name::{AsName, Name},
|
||||
|
@ -83,6 +84,7 @@ pub enum IdentType {
|
|||
Structure,
|
||||
Variable,
|
||||
Variant,
|
||||
Module,
|
||||
}
|
||||
|
||||
impl fmt::Display for IdentType {
|
||||
|
@ -97,6 +99,7 @@ impl fmt::Display for IdentType {
|
|||
IdentType::Structure => "Structure",
|
||||
IdentType::Variable => "Variable",
|
||||
IdentType::Variant => "Variant",
|
||||
IdentType::Module => "Module",
|
||||
};
|
||||
|
||||
repr.fmt(f)
|
||||
|
@ -132,6 +135,7 @@ impl<'a> DeclValidator<'a> {
|
|||
|
||||
pub(super) fn validate_item(&mut self, item: ModuleDefId) {
|
||||
match item {
|
||||
ModuleDefId::ModuleId(module_id) => self.validate_module(module_id),
|
||||
ModuleDefId::FunctionId(func) => self.validate_func(func),
|
||||
ModuleDefId::AdtId(adt) => self.validate_adt(adt),
|
||||
ModuleDefId::ConstId(const_id) => self.validate_const(const_id),
|
||||
|
@ -230,6 +234,55 @@ impl<'a> DeclValidator<'a> {
|
|||
|| parent()
|
||||
}
|
||||
|
||||
fn validate_module(&mut self, module_id: ModuleId) {
|
||||
// Check whether non-snake case identifiers are allowed for this module.
|
||||
if self.allowed(module_id.into(), allow::NON_SNAKE_CASE, false) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Check the module name.
|
||||
let Some(module_name) = module_id.name(self.db.upcast()) else { return };
|
||||
let module_name_replacement =
|
||||
module_name.as_str().and_then(to_lower_snake_case).map(|new_name| Replacement {
|
||||
current_name: module_name,
|
||||
suggested_text: new_name,
|
||||
expected_case: CaseType::LowerSnakeCase,
|
||||
});
|
||||
|
||||
if let Some(module_name_replacement) = module_name_replacement {
|
||||
let module_data = &module_id.def_map(self.db.upcast())[module_id.local_id];
|
||||
let module_src = module_data.declaration_source(self.db.upcast());
|
||||
|
||||
if let Some(module_src) = module_src {
|
||||
let ast_ptr = match module_src.value.name() {
|
||||
Some(name) => name,
|
||||
None => {
|
||||
never!(
|
||||
"Replacement ({:?}) was generated for a module without a name: {:?}",
|
||||
module_name_replacement,
|
||||
module_src
|
||||
);
|
||||
return;
|
||||
}
|
||||
};
|
||||
|
||||
let diagnostic = IncorrectCase {
|
||||
file: module_src.file_id,
|
||||
ident_type: IdentType::Module,
|
||||
ident: AstPtr::new(&ast_ptr),
|
||||
expected_case: module_name_replacement.expected_case,
|
||||
ident_text: module_name_replacement
|
||||
.current_name
|
||||
.display(self.db.upcast())
|
||||
.to_string(),
|
||||
suggested_text: module_name_replacement.suggested_text,
|
||||
};
|
||||
|
||||
self.sink.push(diagnostic);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn validate_func(&mut self, func: FunctionId) {
|
||||
let data = self.db.function_data(func);
|
||||
if matches!(func.lookup(self.db.upcast()).container, ItemContainerId::ExternBlockId(_)) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue