From 22f1cee9d61eea059d49fbd261e8aea9132635dd Mon Sep 17 00:00:00 2001 From: Kevin Moore Date: Fri, 24 Sep 2021 15:57:17 +0000 Subject: [PATCH] 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 Commit-Queue: Kevin Moore Reviewed-by: Konstantin Shcheglov Reviewed-by: Phil Quitslund --- .../services/correction/organize_imports.dart | 25 +++++-------- .../correction/fix/organize_imports_test.dart | 35 +++++++++++++++++++ 2 files changed, 44 insertions(+), 16 deletions(-) diff --git a/pkg/analysis_server/lib/src/services/correction/organize_imports.dart b/pkg/analysis_server/lib/src/services/correction/organize_imports.dart index aacc03d39f4..3708b48425b 100644 --- a/pkg/analysis_server/lib/src/services/correction/organize_imports.dart +++ b/pkg/analysis_server/lib/src/services/correction/organize_imports.dart @@ -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 _splitUri(String uri) { - var index = uri.indexOf('/'); - if (index == -1) { - return [uri, '']; - } - return [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)); } } diff --git a/pkg/analysis_server/test/src/services/correction/fix/organize_imports_test.dart b/pkg/analysis_server/test/src/services/correction/fix/organize_imports_test.dart index 093dddd2c12..4a54aa0fb19 100644 --- a/pkg/analysis_server/test/src/services/correction/fix/organize_imports_test.dart +++ b/pkg/analysis_server/test/src/services/correction/fix/organize_imports_test.dart @@ -38,6 +38,41 @@ import 'dart:async'; import 'dart:io'; void f(Stream args) { } +'''); + } + + Future 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 args) { + A.m(); + B.m(); +} +'''); + await assertHasFix(''' +import 'dart:async'; + +import 'a.dart'; +import 'a/b.dart'; + +void f(Stream args) { + A.m(); + B.m(); +} '''); } }