@@ -617,14 +617,12 @@ impl<'a, 'b:'a> ImportResolver<'a, 'b> {
617
617
_ => format!("{}", ident),
618
618
};
619
619
620
- // Assume this is the easy case of `use issue_59764::foo::makro;` and just remove
621
- // intermediate segments.
622
- let (mut span, mut correction) = (directive.span,
623
- format!("{}::{}", module_name, import));
624
-
625
- if directive.is_nested() {
626
- span = directive.use_span;
627
-
620
+ let mut corrections: Vec<(Span, String)> = Vec::new();
621
+ if !directive.is_nested() {
622
+ // Assume this is the easy case of `use issue_59764::foo::makro;` and just remove
623
+ // intermediate segments.
624
+ corrections.push((directive.span, format!("{}::{}", module_name, import)));
625
+ } else {
628
626
// Find the binding span (and any trailing commas and spaces).
629
627
// ie. `use a::b::{c, d, e};`
630
628
// ^^^
@@ -652,6 +650,9 @@ impl<'a, 'b:'a> ImportResolver<'a, 'b> {
652
650
}
653
651
debug!("check_for_module_export_macro: removal_span={:?}", removal_span);
654
652
653
+ // Remove the `removal_span`.
654
+ corrections.push((removal_span, "".to_string()));
655
+
655
656
// Find the span after the crate name and if it has nested imports immediatately
656
657
// after the crate name already.
657
658
// ie. `use a::b::{c, d};`
@@ -666,34 +667,32 @@ impl<'a, 'b:'a> ImportResolver<'a, 'b> {
666
667
667
668
let source_map = self.resolver.session.source_map();
668
669
669
- // Remove two bytes at the end to keep all but the `};` characters.
670
- // ie. `{b::{c, d}, e::{f, g}};`
671
- // ^^^^^^^^^^^^^^^^^^^^^
672
- let end_bytes = BytePos(if has_nested { 2 } else { 1 });
673
- let mut remaining_span = after_crate_name.with_hi(
674
- after_crate_name.hi() - end_bytes);
675
- if has_nested {
676
- // Remove two bytes at the start to keep all but the initial `{` character.
677
- // ie. `{b::{c, d}, e::{f, g}`
678
- // ^^^^^^^^^^^^^^^^^^^^
679
- remaining_span = remaining_span.with_lo(after_crate_name.lo() + BytePos(1));
670
+ // Add the import to the start, with a `{` if required.
671
+ let start_point = source_map.start_point(after_crate_name);
672
+ if let Ok(start_snippet) = source_map.span_to_snippet(start_point) {
673
+ corrections.push((
674
+ start_point,
675
+ if has_nested {
676
+ // In this case, `start_snippet` must equal '{'.
677
+ format!("{}{}, ", start_snippet, import)
678
+ } else {
679
+ // In this case, add a `{`, then the moved import, then whatever
680
+ // was there before.
681
+ format!("{{{}, {}", import, start_snippet)
682
+ }
683
+ ));
680
684
}
681
685
682
- // Calculate the number of characters into a snippet to remove the removal
683
- // span.
684
- let lo = removal_span.lo() - remaining_span.lo();
685
- let hi = lo + (removal_span.hi() - removal_span.lo());
686
- if let Ok(mut remaining) = source_map.span_to_snippet(remaining_span) {
687
- // Remove the original location of the binding.
688
- remaining.replace_range((lo.0 as usize)..(hi.0 as usize), "");
689
- correction = format!("use {}::{{{}, {}}};", module_name, import, remaining);
686
+ // Add a `};` to the end if nested, matching the `{` added at the start.
687
+ if !has_nested {
688
+ corrections.push((source_map.end_point(after_crate_name),
689
+ "};".to_string()));
690
690
}
691
691
}
692
692
693
693
let suggestion = Some((
694
- span ,
694
+ corrections ,
695
695
String::from("a macro with this name exists at the root of the crate"),
696
- correction,
697
696
Applicability::MaybeIncorrect,
698
697
));
699
698
let note = vec![
0 commit comments