Index: pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart |
diff --git a/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart b/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart |
index 22e0495705fc53f4eb07c0a3748adadad7c4f9bb..c0e7ae08b602c7c36ce67a2f546616a36af670f3 100644 |
--- a/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart |
+++ b/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart |
@@ -1081,32 +1081,94 @@ class DartFileEditBuilderImpl extends FileEditBuilderImpl |
// Insert imports: between existing imports. |
if (importDirectives.isNotEmpty) { |
- bool isFirstPackage = true; |
for (String importUri in uriList) { |
- bool inserted = false; |
+ bool isDart = importUri.startsWith('dart:'); |
bool isPackage = importUri.startsWith('package:'); |
- bool isAfterDart = false; |
- for (ImportDirective existingImport in importDirectives) { |
- if (existingImport.uriContent.startsWith('dart:')) { |
- isAfterDart = true; |
- } |
- if (existingImport.uriContent.startsWith('package:')) { |
- isFirstPackage = false; |
- } |
- if (importUri.compareTo(existingImport.uriContent) < 0) { |
- addInsertion(existingImport.offset, (EditBuilder builder) { |
+ bool inserted = false; |
+ |
+ void insert( |
+ {ImportDirective prev, |
+ ImportDirective next, |
+ String uri, |
+ bool trailingNewLine: false}) { |
+ if (prev != null) { |
+ addInsertion(prev.end, (EditBuilder builder) { |
+ builder.writeln(); |
+ builder.write("import '"); |
+ builder.write(uri); |
+ builder.write("';"); |
+ }); |
+ } else { |
+ addInsertion(next.offset, (EditBuilder builder) { |
builder.write("import '"); |
- builder.write(importUri); |
+ builder.write(uri); |
builder.writeln("';"); |
+ if (trailingNewLine) { |
+ builder.writeln(); |
+ } |
}); |
- inserted = true; |
- break; |
} |
+ inserted = true; |
+ } |
+ |
+ ImportDirective lastExisting; |
+ ImportDirective lastExistingDart; |
+ ImportDirective lastExistingPackage; |
+ bool isLastExistingDart = false; |
+ bool isLastExistingPackage = false; |
+ for (ImportDirective existingImport in importDirectives) { |
+ String existingUri = existingImport.uriContent; |
+ |
+ bool isExistingDart = existingUri.startsWith('dart:'); |
+ bool isExistingPackage = existingUri.startsWith('package:'); |
+ bool isExistingRelative = !existingUri.contains(':'); |
+ |
+ bool isNewBeforeExisting = importUri.compareTo(existingUri) < 0; |
+ |
+ if (isDart) { |
+ if (!isExistingDart || isNewBeforeExisting) { |
+ insert( |
+ prev: lastExistingDart, |
+ next: existingImport, |
+ uri: importUri, |
+ trailingNewLine: !isExistingDart); |
+ break; |
+ } |
+ } else if (isPackage) { |
+ if (isExistingRelative || isNewBeforeExisting) { |
+ insert( |
+ prev: lastExistingPackage, |
+ next: existingImport, |
+ uri: importUri, |
+ trailingNewLine: isExistingRelative); |
+ break; |
+ } |
+ } else { |
+ if (!isExistingDart && !isExistingPackage && isNewBeforeExisting) { |
+ insert(next: existingImport, uri: importUri); |
+ break; |
+ } |
+ } |
+ |
+ lastExisting = existingImport; |
+ if (isExistingDart) { |
+ lastExistingDart = existingImport; |
+ } else if (isExistingPackage) { |
+ lastExistingPackage = existingImport; |
+ } |
+ isLastExistingDart = isExistingDart; |
+ isLastExistingPackage = isExistingPackage; |
} |
if (!inserted) { |
- addInsertion(importDirectives.last.end, (EditBuilder builder) { |
- if (isPackage && isFirstPackage && isAfterDart) { |
- builder.writeln(); |
+ addInsertion(lastExisting.end, (EditBuilder builder) { |
+ if (isPackage) { |
+ if (isLastExistingDart) { |
+ builder.writeln(); |
+ } |
+ } else { |
+ if (isLastExistingDart || isLastExistingPackage) { |
+ builder.writeln(); |
+ } |
} |
builder.writeln(); |
builder.write("import '"); |
@@ -1114,9 +1176,6 @@ class DartFileEditBuilderImpl extends FileEditBuilderImpl |
builder.write("';"); |
}); |
} |
- if (isPackage) { |
- isFirstPackage = false; |
- } |
} |
return; |
} |