Skip to content

Commit

Permalink
Properly sort unnamed libraries (#3746)
Browse files Browse the repository at this point in the history
  • Loading branch information
srawlins committed Apr 12, 2024
1 parent ba77660 commit f339b09
Show file tree
Hide file tree
Showing 3 changed files with 66 additions and 6 deletions.
11 changes: 8 additions & 3 deletions lib/src/model/nameable.dart
Original file line number Diff line number Diff line change
Expand Up @@ -96,9 +96,14 @@ mixin Nameable implements Privacy {

/// Compares [a] with [b] by name.
int byName(Nameable a, Nameable b) {
if (a is Library && b is Library) {
return compareAsciiLowerCaseNatural(a.displayName, b.displayName);
}

var stringCompare = compareAsciiLowerCaseNatural(a.name, b.name);
if (stringCompare == 0) {
return a.hashCode.compareTo(b.hashCode);
if (stringCompare != 0) {
return stringCompare;
}
return stringCompare;

return a.hashCode.compareTo(b.hashCode);
}
51 changes: 51 additions & 0 deletions test/library_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,57 @@ A doc comment.
expect(library.oneLineDoc, 'A doc comment.');
});

test('Libraries are sorted properly', () async {
var packageMetaProvider = testPackageMetaProvider;
var resourceProvider =
packageMetaProvider.resourceProvider as MemoryResourceProvider;

var packagePath = await d.createPackage(
'test_package',
libFiles: [
d.dir('d', [d.file('a.dart', '')]),
d.dir('e', [d.file('a.dart', '')]),
// Unnamed library with library directive.
d.file('b.dart', 'library;'),
// Unnamed library without library directives.
d.file('c.dart', ''),
d.file('d.dart', 'library;'),
d.file('e.dart', ''),
],
resourceProvider: resourceProvider,
);
final packageConfigProvider =
getTestPackageConfigProvider(packageMetaProvider.defaultSdkDir.path);
packageConfigProvider.addPackageToConfigFor(
packagePath, 'library_test', Uri.file('$packagePath/'));

final packageGraph = await bootBasicPackage(
packagePath,
packageMetaProvider,
packageConfigProvider,
);
final daName = resourceProvider.convertPath('d/a');
final eaName = resourceProvider.convertPath('e/a');
final daLibrary = packageGraph.libraries.displayNamed(daName);
final eaLibrary = packageGraph.libraries.displayNamed(eaName);
final bLibrary = packageGraph.libraries.displayNamed('b');
final cLibrary = packageGraph.libraries.displayNamed('c');
final dLibrary = packageGraph.libraries.displayNamed('d');
final eLibrary = packageGraph.libraries.displayNamed('e');
var libraries = [
daLibrary,
eaLibrary,
bLibrary,
cLibrary,
dLibrary,
eLibrary,
]..sort(byName);
expect(
libraries.map((l) => l.displayName),
containsAllInOrder(['b', 'c', 'd', daName, 'e', eaName]),
);
});

test('libraries in SDK package have appropriate data', () async {
var packageMetaProvider = testPackageMetaProvider;
var sdkFolder = packageMetaProvider.defaultSdkDir;
Expand Down
10 changes: 7 additions & 3 deletions test/src/utils.dart
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import 'package:dartdoc/src/logging.dart';
import 'package:dartdoc/src/markdown_processor.dart';
import 'package:dartdoc/src/matching_link_result.dart';
import 'package:dartdoc/src/model/model.dart';
import 'package:dartdoc/src/model_utils.dart';
import 'package:dartdoc/src/package_config_provider.dart';
import 'package:dartdoc/src/package_meta.dart';
import 'package:dartdoc/src/warnings.dart';
Expand Down Expand Up @@ -355,7 +356,10 @@ bool get classModifiersAllowed =>
.allows(platformVersion);

extension ModelElementIterableExtension<T extends ModelElement> on Iterable<T> {
T named(String name) => firstWhere((e) => e.name == name);
T named(String name) => singleWhere((e) => e.name == name);

T displayNamed(String displayName) =>
singleWhere((e) => e.displayName == displayName);
}

extension IterableStringExtension on Iterable<String> {
Expand All @@ -377,11 +381,11 @@ extension IterableStringExtension on Iterable<String> {
extension PackageExtension on Package {
/// Gathers all extensions found across a package.
Iterable<Extension> get extensions =>
libraries.expand((library) => library.extensions);
libraries.expand((library) => library.extensions.whereDocumented);

/// Gathers all functions found across a package.
Iterable<ModelFunction> get functions =>
libraries.expand((library) => library.functions);
libraries.expand((library) => library.functions.whereDocumented);
}

/// Extension methods just for tests.
Expand Down

0 comments on commit f339b09

Please sign in to comment.