| 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;
|
| }
|
|
|