Check structure fields to be snake_case
This commit is contained in:
parent
329626124f
commit
21dd704b6b
@ -23,7 +23,10 @@
|
||||
src::HasSource,
|
||||
AdtId, EnumId, FunctionId, Lookup, ModuleDefId, StructId,
|
||||
};
|
||||
use hir_expand::{diagnostics::DiagnosticSink, name::Name};
|
||||
use hir_expand::{
|
||||
diagnostics::DiagnosticSink,
|
||||
name::{AsName, Name},
|
||||
};
|
||||
use syntax::{
|
||||
ast::{self, NameOwner},
|
||||
AstPtr,
|
||||
@ -288,51 +291,49 @@ fn create_incorrect_case_diagnostic_for_struct(
|
||||
self.sink.push(diagnostic);
|
||||
}
|
||||
|
||||
// let fn_params_list = match fn_src.value.param_list() {
|
||||
// Some(params) => params,
|
||||
// None => {
|
||||
// if !fn_param_replacements.is_empty() {
|
||||
// log::error!(
|
||||
// "Replacements ({:?}) were generated for a function parameters which had no parameters list: {:?}",
|
||||
// fn_param_replacements, fn_src
|
||||
// );
|
||||
// }
|
||||
// return;
|
||||
// }
|
||||
// };
|
||||
// let mut fn_params_iter = fn_params_list.params();
|
||||
// for param_to_rename in fn_param_replacements {
|
||||
// // We assume that parameters in replacement are in the same order as in the
|
||||
// // actual params list, but just some of them (ones that named correctly) are skipped.
|
||||
// let ast_ptr = loop {
|
||||
// match fn_params_iter.next() {
|
||||
// Some(element)
|
||||
// if pat_equals_to_name(element.pat(), ¶m_to_rename.current_name) =>
|
||||
// {
|
||||
// break element.pat().unwrap()
|
||||
// }
|
||||
// Some(_) => {}
|
||||
// None => {
|
||||
// log::error!(
|
||||
// "Replacement ({:?}) was generated for a function parameter which was not found: {:?}",
|
||||
// param_to_rename, fn_src
|
||||
// );
|
||||
// return;
|
||||
// }
|
||||
// }
|
||||
// };
|
||||
let struct_fields_list = match struct_src.value.field_list() {
|
||||
Some(ast::FieldList::RecordFieldList(fields)) => fields,
|
||||
_ => {
|
||||
if !struct_fields_replacements.is_empty() {
|
||||
log::error!(
|
||||
"Replacements ({:?}) were generated for a structure fields which had no fields list: {:?}",
|
||||
struct_fields_replacements, struct_src
|
||||
);
|
||||
}
|
||||
return;
|
||||
}
|
||||
};
|
||||
let mut struct_fields_iter = struct_fields_list.fields();
|
||||
for field_to_rename in struct_fields_replacements {
|
||||
// We assume that parameters in replacement are in the same order as in the
|
||||
// actual params list, but just some of them (ones that named correctly) are skipped.
|
||||
let ast_ptr = loop {
|
||||
match struct_fields_iter.next() {
|
||||
Some(element) if names_equal(element.name(), &field_to_rename.current_name) => {
|
||||
break element.name().unwrap()
|
||||
}
|
||||
Some(_) => {}
|
||||
None => {
|
||||
log::error!(
|
||||
"Replacement ({:?}) was generated for a function parameter which was not found: {:?}",
|
||||
field_to_rename, struct_src
|
||||
);
|
||||
return;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// let diagnostic = IncorrectCase {
|
||||
// file: fn_src.file_id,
|
||||
// ident_type: "Argument".to_string(),
|
||||
// ident: AstPtr::new(&ast_ptr).into(),
|
||||
// expected_case: param_to_rename.expected_case,
|
||||
// ident_text: param_to_rename.current_name.to_string(),
|
||||
// suggested_text: param_to_rename.suggested_text,
|
||||
// };
|
||||
let diagnostic = IncorrectCase {
|
||||
file: struct_src.file_id,
|
||||
ident_type: "Field".to_string(),
|
||||
ident: AstPtr::new(&ast_ptr).into(),
|
||||
expected_case: field_to_rename.expected_case,
|
||||
ident_text: field_to_rename.current_name.to_string(),
|
||||
suggested_text: field_to_rename.suggested_text,
|
||||
};
|
||||
|
||||
// self.sink.push(diagnostic);
|
||||
// }
|
||||
self.sink.push(diagnostic);
|
||||
}
|
||||
}
|
||||
|
||||
fn validate_enum(&mut self, db: &dyn HirDatabase, enum_id: EnumId) {
|
||||
@ -340,6 +341,14 @@ fn validate_enum(&mut self, db: &dyn HirDatabase, enum_id: EnumId) {
|
||||
}
|
||||
}
|
||||
|
||||
fn names_equal(left: Option<ast::Name>, right: &Name) -> bool {
|
||||
if let Some(left) = left {
|
||||
&left.as_name() == right
|
||||
} else {
|
||||
false
|
||||
}
|
||||
}
|
||||
|
||||
fn pat_equals_to_name(pat: Option<ast::Pat>, name: &Name) -> bool {
|
||||
if let Some(ast::Pat::IdentPat(ident)) = pat {
|
||||
ident.to_string() == name.to_string()
|
||||
@ -381,6 +390,16 @@ fn incorrect_struct_name() {
|
||||
r#"
|
||||
struct non_camel_case_name {}
|
||||
// ^^^^^^^^^^^^^^^^^^^ Structure `non_camel_case_name` should have a CamelCase name, e.g. `NonCamelCaseName`
|
||||
"#,
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn incorrect_struct_field() {
|
||||
check_diagnostics(
|
||||
r#"
|
||||
struct SomeStruct { SomeField: u8 }
|
||||
// ^^^^^^^^^ Field `SomeField` should have a snake_case name, e.g. `some_field`
|
||||
"#,
|
||||
);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user