Skip to content

Commit d761d86

Browse files
committed
refactor hir-ty::diagnostics::decl_check for enum variants
1 parent 8e29104 commit d761d86

File tree

1 file changed

+43
-52
lines changed

1 file changed

+43
-52
lines changed

crates/hir-ty/src/diagnostics/decl_check.rs

Lines changed: 43 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -494,81 +494,72 @@ impl<'a> DeclValidator<'a> {
494494
IdentType::Enum,
495495
);
496496

497-
// Check the field names.
498-
let enum_variants_replacements = data
497+
// Check the variant names.
498+
self.validate_enum_variants(enum_id)
499+
}
500+
501+
/// Check incorrect names for enum variants.
502+
fn validate_enum_variants(&mut self, enum_id: EnumId) {
503+
let data = self.db.enum_data(enum_id);
504+
let mut enum_variants_replacements = data
499505
.variants
500506
.iter()
501507
.filter_map(|(_, name)| {
502-
Some(Replacement {
508+
to_camel_case(&name.to_smol_str()).map(|new_name| Replacement {
503509
current_name: name.clone(),
504-
suggested_text: to_camel_case(&name.to_smol_str())?,
510+
suggested_text: new_name,
505511
expected_case: CaseType::UpperCamelCase,
506512
})
507513
})
508-
.collect();
509-
510-
// If there is at least one element to spawn a warning on, go to the source map and generate a warning.
511-
self.create_incorrect_case_diagnostic_for_enum_variants(enum_id, enum_variants_replacements)
512-
}
514+
.peekable();
513515

514-
/// Given the information about incorrect names for enum variants,
515-
/// looks up into the source code for exact locations and adds diagnostics into the sink.
516-
fn create_incorrect_case_diagnostic_for_enum_variants(
517-
&mut self,
518-
enum_id: EnumId,
519-
enum_variants_replacements: Vec<Replacement>,
520-
) {
521516
// XXX: only look at sources if we do have incorrect names
522-
if enum_variants_replacements.is_empty() {
517+
if enum_variants_replacements.peek().is_none() {
523518
return;
524519
}
525520

526521
let enum_loc = enum_id.lookup(self.db.upcast());
527522
let enum_src = enum_loc.source(self.db.upcast());
528523

529-
let enum_variants_list = match enum_src.value.variant_list() {
530-
Some(variants) => variants,
531-
_ => {
532-
always!(
533-
enum_variants_replacements.is_empty(),
534-
"Replacements ({:?}) were generated for a enum variants which had no fields list: {:?}",
535-
enum_variants_replacements,
536-
enum_src
537-
);
538-
return;
539-
}
524+
let Some(enum_variants_list) = enum_src.value.variant_list() else {
525+
always!(
526+
enum_variants_replacements.peek().is_none(),
527+
"Replacements ({:?}) were generated for enum variants \
528+
which had no fields list: {:?}",
529+
enum_variants_replacements,
530+
enum_src
531+
);
532+
return;
540533
};
541534
let mut enum_variants_iter = enum_variants_list.variants();
542-
for variant_to_rename in enum_variants_replacements {
535+
for variant_replacement in enum_variants_replacements {
543536
// We assume that parameters in replacement are in the same order as in the
544537
// actual params list, but just some of them (ones that named correctly) are skipped.
545-
let ast_ptr = loop {
546-
match enum_variants_iter.next().and_then(|v| v.name()) {
547-
Some(variant_name) => {
548-
if variant_name.as_name() == variant_to_rename.current_name {
549-
break variant_name;
550-
}
551-
}
552-
None => {
553-
never!(
554-
"Replacement ({:?}) was generated for a enum variant which was not found: {:?}",
555-
variant_to_rename, enum_src
556-
);
557-
return;
538+
let variant = loop {
539+
if let Some(variant) = enum_variants_iter.next() {
540+
let Some(variant_name) = variant.name() else {
541+
continue;
542+
};
543+
if variant_name.as_name() == variant_replacement.current_name {
544+
break variant;
558545
}
546+
} else {
547+
never!(
548+
"Replacement ({:?}) was generated for an enum variant \
549+
which was not found: {:?}",
550+
variant_replacement,
551+
enum_src
552+
);
553+
return;
559554
}
560555
};
561556

562-
let diagnostic = IncorrectCase {
563-
file: enum_src.file_id,
564-
ident_type: IdentType::Variant,
565-
ident: AstPtr::new(&ast_ptr),
566-
expected_case: variant_to_rename.expected_case,
567-
ident_text: variant_to_rename.current_name.display(self.db.upcast()).to_string(),
568-
suggested_text: variant_to_rename.suggested_text,
569-
};
570-
571-
self.sink.push(diagnostic);
557+
self.create_incorrect_case_diagnostic_for_ast_node(
558+
variant_replacement,
559+
enum_src.file_id,
560+
&variant,
561+
IdentType::Variant,
562+
);
572563
}
573564
}
574565

0 commit comments

Comments
 (0)