Report incorrect case for fn inner items
This commit is contained in:
parent
cc2f0ec32c
commit
b53a07835b
@ -14,13 +14,12 @@
|
||||
|
||||
use std::fmt;
|
||||
|
||||
use base_db::CrateId;
|
||||
use hir_def::{
|
||||
data::adt::VariantData,
|
||||
hir::{Pat, PatId},
|
||||
src::HasSource,
|
||||
AdtId, AttrDefId, ConstId, EnumId, FunctionId, ItemContainerId, Lookup, ModuleDefId, StaticId,
|
||||
StructId,
|
||||
AdtId, AttrDefId, ConstId, DefWithBodyId, EnumId, FunctionId, ItemContainerId, Lookup,
|
||||
ModuleDefId, StaticId, StructId,
|
||||
};
|
||||
use hir_expand::{
|
||||
name::{AsName, Name},
|
||||
@ -44,13 +43,9 @@ mod allow {
|
||||
pub(super) const NON_CAMEL_CASE_TYPES: &str = "non_camel_case_types";
|
||||
}
|
||||
|
||||
pub fn incorrect_case(
|
||||
db: &dyn HirDatabase,
|
||||
krate: CrateId,
|
||||
owner: ModuleDefId,
|
||||
) -> Vec<IncorrectCase> {
|
||||
pub fn incorrect_case(db: &dyn HirDatabase, owner: ModuleDefId) -> Vec<IncorrectCase> {
|
||||
let _p = profile::span("validate_module_item");
|
||||
let mut validator = DeclValidator::new(db, krate);
|
||||
let mut validator = DeclValidator::new(db);
|
||||
validator.validate_item(owner);
|
||||
validator.sink
|
||||
}
|
||||
@ -120,7 +115,6 @@ pub struct IncorrectCase {
|
||||
|
||||
pub(super) struct DeclValidator<'a> {
|
||||
db: &'a dyn HirDatabase,
|
||||
krate: CrateId,
|
||||
pub(super) sink: Vec<IncorrectCase>,
|
||||
}
|
||||
|
||||
@ -132,8 +126,8 @@ struct Replacement {
|
||||
}
|
||||
|
||||
impl<'a> DeclValidator<'a> {
|
||||
pub(super) fn new(db: &'a dyn HirDatabase, krate: CrateId) -> DeclValidator<'a> {
|
||||
DeclValidator { db, krate, sink: Vec::new() }
|
||||
pub(super) fn new(db: &'a dyn HirDatabase) -> DeclValidator<'a> {
|
||||
DeclValidator { db, sink: Vec::new() }
|
||||
}
|
||||
|
||||
pub(super) fn validate_item(&mut self, item: ModuleDefId) {
|
||||
@ -206,17 +200,7 @@ fn validate_func(&mut self, func: FunctionId) {
|
||||
return;
|
||||
}
|
||||
|
||||
let body = self.db.body(func.into());
|
||||
|
||||
// Recursively validate inner scope items, such as static variables and constants.
|
||||
for (_, block_def_map) in body.blocks(self.db.upcast()) {
|
||||
for (_, module) in block_def_map.modules() {
|
||||
for def_id in module.scope.declarations() {
|
||||
let mut validator = DeclValidator::new(self.db, self.krate);
|
||||
validator.validate_item(def_id);
|
||||
}
|
||||
}
|
||||
}
|
||||
self.validate_body_inner_items(func.into());
|
||||
|
||||
// Check whether non-snake case identifiers are allowed for this function.
|
||||
if self.allowed(func.into(), allow::NON_SNAKE_CASE, false) {
|
||||
@ -231,6 +215,8 @@ fn validate_func(&mut self, func: FunctionId) {
|
||||
expected_case: CaseType::LowerSnakeCase,
|
||||
});
|
||||
|
||||
let body = self.db.body(func.into());
|
||||
|
||||
// Check the patterns inside the function body.
|
||||
// This includes function parameters.
|
||||
let pats_replacements = body
|
||||
@ -707,4 +693,16 @@ fn validate_static(&mut self, static_id: StaticId) {
|
||||
|
||||
self.sink.push(diagnostic);
|
||||
}
|
||||
|
||||
/// Recursively validates inner scope items, such as static variables and constants.
|
||||
fn validate_body_inner_items(&mut self, body_id: DefWithBodyId) {
|
||||
let body = self.db.body(body_id);
|
||||
for (_, block_def_map) in body.blocks(self.db.upcast()) {
|
||||
for (_, module) in block_def_map.modules() {
|
||||
for def_id in module.scope.declarations() {
|
||||
self.validate_item(def_id);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -378,11 +378,6 @@ pub fn diagnostics(self, db: &dyn HirDatabase) -> Vec<AnyDiagnostic> {
|
||||
ModuleDef::BuiltinType(_) | ModuleDef::Macro(_) => return Vec::new(),
|
||||
};
|
||||
|
||||
let module = match self.module(db) {
|
||||
Some(it) => it,
|
||||
None => return Vec::new(),
|
||||
};
|
||||
|
||||
let mut acc = Vec::new();
|
||||
|
||||
match self.as_def_with_body() {
|
||||
@ -390,7 +385,7 @@ pub fn diagnostics(self, db: &dyn HirDatabase) -> Vec<AnyDiagnostic> {
|
||||
def.diagnostics(db, &mut acc);
|
||||
}
|
||||
None => {
|
||||
for diag in hir_ty::diagnostics::incorrect_case(db, module.id.krate(), id) {
|
||||
for diag in hir_ty::diagnostics::incorrect_case(db, id) {
|
||||
acc.push(diag.into())
|
||||
}
|
||||
}
|
||||
@ -1820,7 +1815,7 @@ pub fn diagnostics(self, db: &dyn HirDatabase, acc: &mut Vec<AnyDiagnostic>) {
|
||||
// FIXME: don't ignore diagnostics for in type const
|
||||
DefWithBody::InTypeConst(_) => return,
|
||||
};
|
||||
for diag in hir_ty::diagnostics::incorrect_case(db, krate, def.into()) {
|
||||
for diag in hir_ty::diagnostics::incorrect_case(db, def.into()) {
|
||||
acc.push(diag.into())
|
||||
}
|
||||
}
|
||||
|
@ -545,4 +545,33 @@ pub struct some_type {
|
||||
"#,
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn fn_inner_items() {
|
||||
check_diagnostics(
|
||||
r#"
|
||||
fn main() {
|
||||
const foo: bool = true;
|
||||
//^^^ 💡 warn: Constant `foo` should have UPPER_SNAKE_CASE name, e.g. `FOO`
|
||||
static bar: bool = true;
|
||||
//^^^ 💡 warn: Static variable `bar` should have UPPER_SNAKE_CASE name, e.g. `BAR`
|
||||
fn BAZ() {
|
||||
//^^^ 💡 warn: Function `BAZ` should have snake_case name, e.g. `baz`
|
||||
const foo: bool = true;
|
||||
//^^^ 💡 warn: Constant `foo` should have UPPER_SNAKE_CASE name, e.g. `FOO`
|
||||
static bar: bool = true;
|
||||
//^^^ 💡 warn: Static variable `bar` should have UPPER_SNAKE_CASE name, e.g. `BAR`
|
||||
fn BAZ() {
|
||||
//^^^ 💡 warn: Function `BAZ` should have snake_case name, e.g. `baz`
|
||||
let INNER_INNER = 42;
|
||||
//^^^^^^^^^^^ 💡 warn: Variable `INNER_INNER` should have snake_case name, e.g. `inner_inner`
|
||||
}
|
||||
|
||||
let INNER_LOCAL = 42;
|
||||
//^^^^^^^^^^^ 💡 warn: Variable `INNER_LOCAL` should have snake_case name, e.g. `inner_local`
|
||||
}
|
||||
}
|
||||
"#,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user