Skip to content

Commit 9d014ff

Browse files
authored
Use new package_config APIs. (#2325)
Use new package_config APIs. The new package_config APIs are async, requiring some breaking restructuring: * Delete public getter, `PackageBuilder.packageMap`. * Delete public method, `PackageBuilder.getFiles`. * `PackageBuilder.findFilesToDocumentInPackage` used to return an `Iterable<String>`, and now returns a `Stream<String>`. * PackageBuilder's package map (now private) is eagerly computed.
1 parent 2803425 commit 9d014ff

File tree

3 files changed

+56
-57
lines changed

3 files changed

+56
-57
lines changed

lib/src/model/library.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -545,7 +545,7 @@ class Library extends ModelElement with Categorization, TopLevelContainer {
545545
hidePackage = package.packageGraph.packageMeta;
546546
}
547547
// restoreUri must not result in another file URI.
548-
assert(!name.startsWith('file:'));
548+
assert(!name.startsWith('file:'), '"$name" must not start with "file:"');
549549

550550
var defaultPackagePrefix = 'package:$hidePackage/';
551551
if (name.startsWith(defaultPackagePrefix)) {

lib/src/model/package_builder.dart

Lines changed: 53 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,8 @@ import 'package:dartdoc/src/package_meta.dart'
3131
show PackageMeta, PackageMetaProvider;
3232
import 'package:dartdoc/src/render/renderer_factory.dart';
3333
import 'package:dartdoc/src/special_elements.dart';
34-
import 'package:package_config/discovery.dart' as package_config;
34+
import 'package:meta/meta.dart';
35+
import 'package:package_config/package_config.dart' show findPackageConfig;
3536
import 'package:path/path.dart' as path;
3637

3738
/// Everything you need to instantiate a PackageGraph object for documenting.
@@ -63,6 +64,8 @@ class PubPackageBuilder implements PackageBuilder {
6364

6465
var rendererFactory = RendererFactory.forFormat(config.format);
6566

67+
await _calculatePackageMap();
68+
6669
var newGraph = PackageGraph.UninitializedPackageGraph(
6770
config,
6871
sdk,
@@ -88,38 +91,29 @@ class PubPackageBuilder implements PackageBuilder {
8891
EmbedderSdk get embedderSdk {
8992
if (_embedderSdk == null && !config.topLevelPackageMeta.isSdk) {
9093
_embedderSdk = EmbedderSdk(PhysicalResourceProvider.INSTANCE,
91-
EmbedderYamlLocator(packageMap).embedderYamls);
94+
EmbedderYamlLocator(_packageMap).embedderYamls);
9295
}
9396
return _embedderSdk;
9497
}
9598

96-
static Map<String, List<file_system.Folder>> _calculatePackageMap(
97-
file_system.Folder dir) {
98-
var map = <String, List<file_system.Folder>>{};
99-
var info = package_config.findPackagesFromFile(dir.toUri());
99+
Future<void> _calculatePackageMap() async {
100+
assert(_packageMap == null);
101+
_packageMap = <String, List<file_system.Folder>>{};
102+
file_system.Folder cwd =
103+
PhysicalResourceProvider.INSTANCE.getResource(config.inputDir);
104+
var info = await findPackageConfig(Directory(cwd.path));
105+
if (info == null) return;
100106

101-
for (var name in info.packages) {
102-
var uri = info.asMap()[name];
103-
var packagePath = path.normalize(path.fromUri(uri));
107+
for (var package in info.packages) {
108+
var packagePath = path.normalize(path.fromUri(package.packageUriRoot));
104109
var resource = PhysicalResourceProvider.INSTANCE.getResource(packagePath);
105110
if (resource is file_system.Folder) {
106-
map[name] = [resource];
111+
_packageMap[package.name] = [resource];
107112
}
108113
}
109-
110-
return map;
111114
}
112115

113-
Map<String, List<file_system.Folder>> _packageMap;
114-
115-
Map<String, List<file_system.Folder>> get packageMap {
116-
if (_packageMap == null) {
117-
file_system.Folder cwd =
118-
PhysicalResourceProvider.INSTANCE.getResource(config.inputDir);
119-
_packageMap = _calculatePackageMap(cwd);
120-
}
121-
return _packageMap;
122-
}
116+
/*late final*/ Map<String, List<file_system.Folder>> _packageMap;
123117

124118
DartUriResolver _embedderResolver;
125119

@@ -131,7 +125,7 @@ class PubPackageBuilder implements PackageBuilder {
131125
SourceFactory get sourceFactory {
132126
var resolvers = <UriResolver>[];
133127
final UriResolver packageResolver =
134-
PackageMapUriResolver(PhysicalResourceProvider.INSTANCE, packageMap);
128+
PackageMapUriResolver(PhysicalResourceProvider.INSTANCE, _packageMap);
135129
UriResolver sdkResolver;
136130
if (embedderSdk == null || embedderSdk.urlMappings.isEmpty) {
137131
// The embedder uri resolver has no mappings. Use the default Dart SDK
@@ -295,34 +289,32 @@ class PubPackageBuilder implements PackageBuilder {
295289
if (meta.isSdk) {
296290
files.addAll(getSdkFilesToDocument());
297291
} else {
298-
files.addAll(
299-
findFilesToDocumentInPackage(meta.dir.path, false, false));
292+
files.addAll(await findFilesToDocumentInPackage(meta.dir.path,
293+
autoIncludeDependencies: false, filterExcludes: false)
294+
.toList());
300295
}
301296
}
302297
} while (!lastPass.containsAll(current));
303298
}
304299

305300
/// Given a package name, explore the directory and pull out all top level
306301
/// library files in the "lib" directory to document.
307-
Iterable<String> findFilesToDocumentInPackage(
308-
String basePackageDir, bool autoIncludeDependencies,
309-
[bool filterExcludes = true]) sync* {
310-
var sep = path.separator;
311-
302+
Stream<String> findFilesToDocumentInPackage(String basePackageDir,
303+
{@required bool autoIncludeDependencies,
304+
bool filterExcludes = true}) async* {
312305
var packageDirs = {basePackageDir};
313306

314307
if (autoIncludeDependencies) {
315-
var info = package_config
316-
.findPackagesFromFile(
317-
Uri.file(path.join(basePackageDir, 'pubspec.yaml')))
318-
.asMap();
319-
for (var packageName in info.keys) {
320-
if (!filterExcludes || !config.exclude.contains(packageName)) {
321-
packageDirs.add(path.dirname(info[packageName].toFilePath()));
308+
var info = await findPackageConfig(Directory(basePackageDir));
309+
for (var package in info.packages) {
310+
if (!filterExcludes || !config.exclude.contains(package.name)) {
311+
packageDirs.add(
312+
path.dirname(path.fromUri(info[package.name].packageUriRoot)));
322313
}
323314
}
324315
}
325316

317+
var sep = path.separator;
326318
for (var packageDir in packageDirs) {
327319
var packageLibDir = path.join(packageDir, 'lib');
328320
var packageLibSrcDir = path.join(packageLibDir, 'src');
@@ -334,15 +326,15 @@ class PubPackageBuilder implements PackageBuilder {
334326
if (lib.endsWith('.dart') &&
335327
(!lib.contains('${sep}packages${sep}') ||
336328
packageDir.contains('${sep}packages${sep}'))) {
337-
// Only include libraries within the lib dir that are not in lib/src
329+
// Only include libraries within the lib dir that are not in 'lib/src'.
338330
if (path.isWithin(packageLibDir, lib) &&
339331
!path.isWithin(packageLibSrcDir, lib)) {
340-
// Only add the file if it does not contain 'part of'
332+
// Only add the file if it does not contain 'part of'.
341333
var contents = File(lib).readAsStringSync();
342334

343335
if (contents.startsWith('part of ') ||
344336
contents.contains('\npart of ')) {
345-
// NOOP: it's a part file
337+
// NOOP: it's a part file.
346338
} else {
347339
yield lib;
348340
}
@@ -366,38 +358,43 @@ class PubPackageBuilder implements PackageBuilder {
366358
}
367359
}
368360

369-
Set<String> getFiles() {
361+
Future<Set<String>> _getFiles() async {
370362
Iterable<String> files;
371363
if (config.topLevelPackageMeta.isSdk) {
372364
files = getSdkFilesToDocument();
373365
} else {
374-
files = findFilesToDocumentInPackage(
375-
config.inputDir, config.autoIncludeDependencies);
366+
files = await findFilesToDocumentInPackage(config.inputDir,
367+
autoIncludeDependencies: config.autoIncludeDependencies)
368+
.toList();
376369
}
377370
files = quiver.concat([files, _includeExternalsFrom(files)]);
378-
return Set.from(files.map<String>((s) => File(s).absolute.path));
371+
return {
372+
...files.map((s) => File(s).absolute.path),
373+
...getEmbedderSdkFiles(),
374+
};
379375
}
380376

381-
Iterable<String> getEmbedderSdkFiles() sync* {
382-
if (embedderSdk != null &&
383-
embedderSdk.urlMappings.isNotEmpty &&
384-
!config.topLevelPackageMeta.isSdk) {
385-
for (var dartUri in embedderSdk.urlMappings.keys) {
386-
var source = embedderSdk.mapDartUri(dartUri);
387-
yield (File(source.fullName)).absolute.path;
388-
}
389-
}
377+
Iterable<String> getEmbedderSdkFiles() {
378+
return [
379+
for (var dartUri in _embedderSdkUris)
380+
File(embedderSdk.mapDartUri(dartUri).fullName).absolute.path
381+
];
390382
}
391383

392-
bool get hasEmbedderSdkFiles =>
393-
embedderSdk != null && getEmbedderSdkFiles().isNotEmpty;
384+
bool get hasEmbedderSdkFiles => _embedderSdkUris.isNotEmpty;
385+
386+
Iterable<String> get _embedderSdkUris {
387+
if (config.topLevelPackageMeta.isSdk) return [];
388+
389+
return embedderSdk?.urlMappings?.keys ?? [];
390+
}
394391

395392
Future<void> getLibraries(PackageGraph uninitializedPackageGraph) async {
396393
DartSdk findSpecialsSdk = sdk;
397394
if (embedderSdk != null && embedderSdk.urlMappings.isNotEmpty) {
398395
findSpecialsSdk = embedderSdk;
399396
}
400-
var files = getFiles()..addAll(getEmbedderSdkFiles());
397+
var files = await _getFiles();
401398
var specialFiles = specialLibraryFiles(findSpecialsSdk).toSet();
402399

403400
/// Returns true if this library element should be included according

testing/test_package/pubspec.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,5 @@ dependencies:
77
args: ^1.5.0
88
test_package_imported:
99
path: "../test_package_imported"
10+
environment:
11+
sdk: '>=2.7.0 <3.0.0'

0 commit comments

Comments
 (0)