@@ -31,7 +31,8 @@ import 'package:dartdoc/src/package_meta.dart'
31
31
show PackageMeta, PackageMetaProvider;
32
32
import 'package:dartdoc/src/render/renderer_factory.dart' ;
33
33
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;
35
36
import 'package:path/path.dart' as path;
36
37
37
38
/// Everything you need to instantiate a PackageGraph object for documenting.
@@ -63,6 +64,8 @@ class PubPackageBuilder implements PackageBuilder {
63
64
64
65
var rendererFactory = RendererFactory .forFormat (config.format);
65
66
67
+ await _calculatePackageMap ();
68
+
66
69
var newGraph = PackageGraph .UninitializedPackageGraph (
67
70
config,
68
71
sdk,
@@ -88,38 +91,29 @@ class PubPackageBuilder implements PackageBuilder {
88
91
EmbedderSdk get embedderSdk {
89
92
if (_embedderSdk == null && ! config.topLevelPackageMeta.isSdk) {
90
93
_embedderSdk = EmbedderSdk (PhysicalResourceProvider .INSTANCE ,
91
- EmbedderYamlLocator (packageMap ).embedderYamls);
94
+ EmbedderYamlLocator (_packageMap ).embedderYamls);
92
95
}
93
96
return _embedderSdk;
94
97
}
95
98
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 ;
100
106
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));
104
109
var resource = PhysicalResourceProvider .INSTANCE .getResource (packagePath);
105
110
if (resource is file_system.Folder ) {
106
- map[ name] = [resource];
111
+ _packageMap[package. name] = [resource];
107
112
}
108
113
}
109
-
110
- return map;
111
114
}
112
115
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;
123
117
124
118
DartUriResolver _embedderResolver;
125
119
@@ -131,7 +125,7 @@ class PubPackageBuilder implements PackageBuilder {
131
125
SourceFactory get sourceFactory {
132
126
var resolvers = < UriResolver > [];
133
127
final UriResolver packageResolver =
134
- PackageMapUriResolver (PhysicalResourceProvider .INSTANCE , packageMap );
128
+ PackageMapUriResolver (PhysicalResourceProvider .INSTANCE , _packageMap );
135
129
UriResolver sdkResolver;
136
130
if (embedderSdk == null || embedderSdk.urlMappings.isEmpty) {
137
131
// The embedder uri resolver has no mappings. Use the default Dart SDK
@@ -295,34 +289,32 @@ class PubPackageBuilder implements PackageBuilder {
295
289
if (meta.isSdk) {
296
290
files.addAll (getSdkFilesToDocument ());
297
291
} 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 ());
300
295
}
301
296
}
302
297
} while (! lastPass.containsAll (current));
303
298
}
304
299
305
300
/// Given a package name, explore the directory and pull out all top level
306
301
/// 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 * {
312
305
var packageDirs = {basePackageDir};
313
306
314
307
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)));
322
313
}
323
314
}
324
315
}
325
316
317
+ var sep = path.separator;
326
318
for (var packageDir in packageDirs) {
327
319
var packageLibDir = path.join (packageDir, 'lib' );
328
320
var packageLibSrcDir = path.join (packageLibDir, 'src' );
@@ -334,15 +326,15 @@ class PubPackageBuilder implements PackageBuilder {
334
326
if (lib.endsWith ('.dart' ) &&
335
327
(! lib.contains ('${sep }packages${sep }' ) ||
336
328
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'.
338
330
if (path.isWithin (packageLibDir, lib) &&
339
331
! 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'.
341
333
var contents = File (lib).readAsStringSync ();
342
334
343
335
if (contents.startsWith ('part of ' ) ||
344
336
contents.contains ('\n part of ' )) {
345
- // NOOP: it's a part file
337
+ // NOOP: it's a part file.
346
338
} else {
347
339
yield lib;
348
340
}
@@ -366,38 +358,43 @@ class PubPackageBuilder implements PackageBuilder {
366
358
}
367
359
}
368
360
369
- Set <String > getFiles () {
361
+ Future < Set <String >> _getFiles () async {
370
362
Iterable <String > files;
371
363
if (config.topLevelPackageMeta.isSdk) {
372
364
files = getSdkFilesToDocument ();
373
365
} else {
374
- files = findFilesToDocumentInPackage (
375
- config.inputDir, config.autoIncludeDependencies);
366
+ files = await findFilesToDocumentInPackage (config.inputDir,
367
+ autoIncludeDependencies: config.autoIncludeDependencies)
368
+ .toList ();
376
369
}
377
370
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
+ };
379
375
}
380
376
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
+ ];
390
382
}
391
383
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
+ }
394
391
395
392
Future <void > getLibraries (PackageGraph uninitializedPackageGraph) async {
396
393
DartSdk findSpecialsSdk = sdk;
397
394
if (embedderSdk != null && embedderSdk.urlMappings.isNotEmpty) {
398
395
findSpecialsSdk = embedderSdk;
399
396
}
400
- var files = getFiles ().. addAll ( getEmbedderSdkFiles () );
397
+ var files = await _getFiles ( );
401
398
var specialFiles = specialLibraryFiles (findSpecialsSdk).toSet ();
402
399
403
400
/// Returns true if this library element should be included according
0 commit comments