@@ -31,7 +31,8 @@ import 'package:dartdoc/src/package_meta.dart'
3131 show PackageMeta, PackageMetaProvider;
3232import 'package:dartdoc/src/render/renderer_factory.dart' ;
3333import '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;
3536import '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 ('\n part 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
0 commit comments