Fix insertion of unqualified import when first

I previously missed a case and it causes qualified imports to be added at the end if they are lexicographically smaller than ALL other qualified imports. No big deal, but this is now fixed.
This commit is contained in:
KtorZ 2023-10-21 13:56:15 +02:00
parent c550b4766d
commit d965467a53
No known key found for this signature in database
GPG Key ID: 33173CB6F77F4277
1 changed files with 40 additions and 7 deletions

View File

@ -71,10 +71,14 @@ impl ParsedDocument {
// There's already a matching qualified import, so we have nothing to do. // There's already a matching qualified import, so we have nothing to do.
None => return None, None => return None,
Some(unqualified) => { Some(unqualified) => {
let mut last_unqualified = None;
// Insert lexicographically, assuming unqualified imports are already // Insert lexicographically, assuming unqualified imports are already
// ordered. If they are not, it doesn't really matter where we insert // ordered. If they are not, it doesn't really matter where we insert
// anyway. // anyway.
for existing_unqualified in unqualified_list { for existing_unqualified in unqualified_list {
last_unqualified = Some(existing_unqualified.location);
let existing_name = existing_unqualified let existing_name = existing_unqualified
.as_name .as_name
.as_ref() .as_ref()
@ -83,9 +87,9 @@ impl ParsedDocument {
// The unqualified import already exist, nothing to do. // The unqualified import already exist, nothing to do.
if unqualified == existing_name { if unqualified == existing_name {
return None; return None;
// Current import is lexicographically smaller, we can insert after. // Current import is lexicographically greater, we can insert before
} else if existing_name.as_str() < unqualified { } else if unqualified < existing_name.as_str() {
return Some(self.insert_into_qualified( return Some(self.insert_qualified_before(
import, import,
unqualified, unqualified,
existing_unqualified.location, existing_unqualified.location,
@ -95,9 +99,18 @@ impl ParsedDocument {
} }
} }
// Only happens if 'unqualified_list' is empty, in which case, we return match last_unqualified {
// simply create a new unqualified list of import. // Only happens if 'unqualified_list' is empty, in which case, we
return Some(self.add_new_qualified(import, unqualified, *location)); // simply create a new unqualified list of import.
None => {
Some(self.add_new_qualified(import, unqualified, *location))
}
// Happens if the new qualified import is lexicographically after
// all existing ones.
Some(location) => {
Some(self.insert_qualified_after(import, unqualified, location))
}
};
} }
} }
} }
@ -112,7 +125,27 @@ impl ParsedDocument {
Some(self.add_new_import_line(import, unqualified, last_import)) Some(self.add_new_import_line(import, unqualified, last_import))
} }
fn insert_into_qualified( fn insert_qualified_before(
&self,
import: &CheckedModule,
unqualified: &str,
location: Span,
) -> AnnotatedEdit {
let title = format!(
"Insert new unqualified import '{}' to {}",
unqualified, import.name
);
(
title,
insert_text(
location.start,
&self.line_numbers,
format!("{}, ", unqualified),
),
)
}
fn insert_qualified_after(
&self, &self,
import: &CheckedModule, import: &CheckedModule,
unqualified: &str, unqualified: &str,