analysis_server: Fix OrganizeImports correction

Sort `a.dart` before `a/b.dart`

Fixes https://github.com/dart-lang/sdk/issues/45321

Change-Id: Ic16cf3dc1d0651e450cc476bf02d86afa9abf3fa
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/214310
Auto-Submit: Kevin Moore <kevmoo@google.com>
Commit-Queue: Kevin Moore <kevmoo@google.com>
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
Reviewed-by: Phil Quitslund <pquitslund@google.com>
This commit is contained in:
Kevin Moore 2021-09-24 15:57:17 +00:00
parent 1b3415b069
commit 22f1cee9d6
2 changed files with 44 additions and 16 deletions

View file

@ -350,23 +350,16 @@ class _DirectiveInfo implements Comparable<_DirectiveInfo> {
@override
String toString() => '(priority=$priority; text=$text)';
/// Should keep these in sync! Copied from
/// https://github.com/dart-lang/linter/blob/658f497eef/lib/src/rules/directives_ordering.dart#L380-L387
/// Consider finding a way to share this code!
static int _compareUri(String a, String b) {
var aList = _splitUri(a);
var bList = _splitUri(b);
int result;
if ((result = aList[0].compareTo(bList[0])) != 0) return result;
if ((result = aList[1].compareTo(bList[1])) != 0) return result;
return 0;
}
/// Split the given [uri] like `package:some.name/and/path.dart` into a list
/// like `[package:some.name, and/path.dart]`.
static List<String> _splitUri(String uri) {
var index = uri.indexOf('/');
if (index == -1) {
return <String>[uri, ''];
}
return <String>[uri.substring(0, index), uri.substring(index + 1)];
var indexA = a.indexOf('/');
var indexB = b.indexOf('/');
if (indexA == -1 || indexB == -1) return a.compareTo(b);
var result = a.substring(0, indexA).compareTo(b.substring(0, indexB));
if (result != 0) return result;
return a.substring(indexA + 1).compareTo(b.substring(indexB + 1));
}
}

View file

@ -38,6 +38,41 @@ import 'dart:async';
import 'dart:io';
void f(Stream<String> args) { }
''');
}
Future<void> test_organizePathImports() async {
newFile('/home/test/lib/a.dart', content: '''
class A {
static void m() {}
}
''');
newFile('/home/test/lib/a/b.dart', content: '''
class B {
static void m() {}
}
''');
await resolveTestCode('''
import 'dart:async';
import 'a/b.dart';
import 'a.dart';
void f(Stream<String> args) {
A.m();
B.m();
}
''');
await assertHasFix('''
import 'dart:async';
import 'a.dart';
import 'a/b.dart';
void f(Stream<String> args) {
A.m();
B.m();
}
''');
}
}