4
4
5
5
import 'dart:async' ;
6
6
7
+ import 'package:analyzer/dart/analysis/analysis_context.dart' ;
7
8
import 'package:analyzer/dart/analysis/context_root.dart' ;
8
9
import 'package:analyzer/dart/analysis/results.dart' ;
9
10
import 'package:analyzer/dart/ast/ast.dart' ;
@@ -36,6 +37,8 @@ import 'package:path/path.dart' as p show Context;
36
37
abstract class PackageBuilder {
37
38
// Builds package graph to be used by documentation generator.
38
39
Future <PackageGraph > buildPackageGraph ();
40
+
41
+ Future <void > dispose ();
39
42
}
40
43
41
44
/// A package builder that understands pub package format.
@@ -44,12 +47,49 @@ class PubPackageBuilder implements PackageBuilder {
44
47
final PackageMetaProvider _packageMetaProvider;
45
48
final PackageConfigProvider _packageConfigProvider;
46
49
47
- PubPackageBuilder (
50
+ final AnalysisContextCollectionImpl _contextCollection;
51
+ final AnalysisContext _analysisContext;
52
+
53
+ factory PubPackageBuilder (
54
+ DartdocOptionContext config,
55
+ PackageMetaProvider packageMetaProvider,
56
+ PackageConfigProvider packageConfigProvider, {
57
+ @visibleForTesting bool skipUnreachableSdkLibraries = false ,
58
+ }) {
59
+ var contextCollection = AnalysisContextCollectionImpl (
60
+ includedPaths: [config.inputDir],
61
+ // TODO(jcollins-g): should we pass excluded directories here instead
62
+ // of handling it ourselves?
63
+ resourceProvider: packageMetaProvider.resourceProvider,
64
+ sdkPath: config.sdkDir,
65
+ updateAnalysisOptions2: ({
66
+ required AnalysisOptionsImpl analysisOptions,
67
+ required ContextRoot contextRoot,
68
+ required DartSdk sdk,
69
+ }) =>
70
+ analysisOptions
71
+ ..warning = false
72
+ ..lint = false ,
73
+ );
74
+ return PubPackageBuilder ._(
75
+ config,
76
+ packageMetaProvider,
77
+ packageConfigProvider,
78
+ contextCollection,
79
+ analysisContext: contextCollection.contextFor (config.inputDir),
80
+ skipUnreachableSdkLibraries: skipUnreachableSdkLibraries,
81
+ );
82
+ }
83
+
84
+ PubPackageBuilder ._(
48
85
this ._config,
49
86
this ._packageMetaProvider,
50
- this ._packageConfigProvider, {
51
- @visibleForTesting bool skipUnreachableSdkLibraries = false ,
52
- }) : _skipUnreachableSdkLibraries = skipUnreachableSdkLibraries;
87
+ this ._packageConfigProvider,
88
+ this ._contextCollection, {
89
+ required AnalysisContext analysisContext,
90
+ required bool skipUnreachableSdkLibraries,
91
+ }) : _analysisContext = analysisContext,
92
+ _skipUnreachableSdkLibraries = skipUnreachableSdkLibraries;
53
93
54
94
@override
55
95
Future <PackageGraph > buildPackageGraph () async {
@@ -77,6 +117,7 @@ class PubPackageBuilder implements PackageBuilder {
77
117
_sdk,
78
118
_embedderSdkUris.isNotEmpty,
79
119
_packageMetaProvider,
120
+ _analysisContext,
80
121
);
81
122
await _getLibraries (newGraph);
82
123
runtimeStats.endPerfTask ();
@@ -93,6 +134,12 @@ class PubPackageBuilder implements PackageBuilder {
93
134
return newGraph;
94
135
}
95
136
137
+ @override
138
+ Future <void > dispose () async {
139
+ // Shutdown macro support.
140
+ await _contextCollection.dispose ();
141
+ }
142
+
96
143
late final DartSdk _sdk = _packageMetaProvider.defaultSdk ??
97
144
FolderBasedDartSdk (
98
145
_resourceProvider, _resourceProvider.getFolder (_config.sdkDir));
@@ -132,22 +179,6 @@ class PubPackageBuilder implements PackageBuilder {
132
179
133
180
late final Map <String , List <Folder >> _packageMap;
134
181
135
- late final _contextCollection = AnalysisContextCollectionImpl (
136
- includedPaths: [_config.inputDir],
137
- // TODO(jcollins-g): should we pass excluded directories here instead of
138
- // handling it ourselves?
139
- resourceProvider: _resourceProvider,
140
- sdkPath: _config.sdkDir,
141
- updateAnalysisOptions2: ({
142
- required AnalysisOptionsImpl analysisOptions,
143
- required ContextRoot contextRoot,
144
- required DartSdk sdk,
145
- }) =>
146
- analysisOptions
147
- ..warning = false
148
- ..lint = false ,
149
- );
150
-
151
182
List <String > get _sdkFilesToDocument => [
152
183
for (var sdkLib in _sdk.sdkLibraries)
153
184
_sdk.mapDartUri (sdkLib.shortName)! .fullName,
@@ -245,6 +276,8 @@ class PubPackageBuilder implements PackageBuilder {
245
276
}
246
277
var resolvedLibrary = await _resolveLibrary (file);
247
278
if (resolvedLibrary == null ) {
279
+ // `file` did not resolve to a _library_; could be a part, an
280
+ // augmentation, or some other invalid result.
248
281
_knownParts.add (file);
249
282
continue ;
250
283
}
@@ -459,8 +492,6 @@ class PubPackageBuilder implements PackageBuilder {
459
492
specialFiles.difference (files),
460
493
addingSpecials: true ,
461
494
);
462
- // Shutdown macro support.
463
- await _contextCollection.dispose ();
464
495
}
465
496
466
497
/// Throws an exception if any configured-to-be-included files were not found
@@ -511,22 +542,29 @@ class DartDocResolvedLibrary {
511
542
extension on Set <String > {
512
543
/// Adds [element] 's path and all of its part files' paths to `this` , and
513
544
/// recursively adds the paths of all imported and exported libraries.
514
- void addFilesReferencedBy (LibraryElement ? element) {
515
- if (element != null ) {
516
- var path = element.source.fullName;
517
- if (add (path)) {
518
- for (var import in element.libraryImports) {
519
- addFilesReferencedBy (import.importedLibrary);
520
- }
521
- for (var export in element.libraryExports) {
522
- addFilesReferencedBy (export.exportedLibrary);
523
- }
545
+ void addFilesReferencedBy (LibraryOrAugmentationElement ? element) {
546
+ if (element == null ) return ;
547
+
548
+ var path = element.source? .fullName;
549
+ if (path == null ) return ;
550
+
551
+ if (add (path)) {
552
+ for (var import in element.libraryImports) {
553
+ addFilesReferencedBy (import.importedLibrary);
554
+ }
555
+ for (var export in element.libraryExports) {
556
+ addFilesReferencedBy (export.exportedLibrary);
557
+ }
558
+ if (element is LibraryElement ) {
524
559
for (var part in element.parts
525
560
.map ((e) => e.uri)
526
561
.whereType <DirectiveUriWithUnit >()) {
527
562
add (part.source.fullName);
528
563
}
529
564
}
565
+ for (var augmentation in element.augmentationImports) {
566
+ addFilesReferencedBy (augmentation.importedAugmentation);
567
+ }
530
568
}
531
569
}
532
570
}
0 commit comments