Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(593)

Unified Diff: pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart

Issue 2955913002: Fixes and tests for adding library imports. (Closed)
Patch Set: Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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;
}

Powered by Google App Engine
This is Rietveld 408576698