2
2
// for details. All rights reserved. Use of this source code is governed by a
3
3
// BSD-style license that can be found in the LICENSE file.
4
4
5
- import 'package:analyzer/dart/analysis/features.dart' ;
5
+ import 'dart:async' ;
6
+
7
+ import 'package:analyzer/dart/analysis/analysis_context_collection.dart' ;
8
+ import 'package:analyzer/src/dart/analysis/analysis_context_collection.dart' ;
6
9
import 'package:analyzer/dart/analysis/results.dart' ;
7
10
import 'package:analyzer/dart/element/element.dart' ;
8
11
import 'package:analyzer/file_system/file_system.dart' ;
9
12
import 'package:analyzer/src/context/builder.dart' ;
10
- import 'package:analyzer/src/context/packages.dart' ;
11
- import 'package:analyzer/src/dart/analysis/byte_store.dart' ;
12
- import 'package:analyzer/src/dart/analysis/driver.dart' ;
13
- import 'package:analyzer/src/dart/analysis/file_state.dart' ;
14
- import 'package:analyzer/src/dart/analysis/performance_logger.dart' ;
15
13
import 'package:analyzer/src/dart/sdk/sdk.dart' ;
16
- import 'package:analyzer/src/generated/engine.dart' ;
17
14
import 'package:analyzer/src/generated/java_io.dart' ;
18
15
import 'package:analyzer/src/generated/sdk.dart' ;
19
16
import 'package:analyzer/src/generated/source.dart' ;
20
17
import 'package:analyzer/src/generated/source_io.dart' ;
21
- import 'package:analyzer/src/source/package_map_resolver.dart' ;
22
18
import 'package:dartdoc/src/dartdoc_options.dart' ;
23
19
import 'package:dartdoc/src/logging.dart' ;
24
20
import 'package:dartdoc/src/model/model.dart' hide Package;
@@ -31,7 +27,6 @@ import 'package:dartdoc/src/special_elements.dart';
31
27
import 'package:meta/meta.dart' ;
32
28
// TODO(jcollins-g): do not directly import path, use ResourceProvider instead
33
29
import 'package:path/path.dart' as path;
34
- import 'package:pub_semver/pub_semver.dart' ;
35
30
36
31
/// Everything you need to instantiate a PackageGraph object for documenting.
37
32
abstract class PackageBuilder {
@@ -42,6 +37,7 @@ abstract class PackageBuilder {
42
37
/// A package builder that understands pub package format.
43
38
class PubPackageBuilder implements PackageBuilder {
44
39
final DartdocOptionContext config;
40
+ final Set <String > _knownFiles = {};
45
41
final PackageMetaProvider packageMetaProvider;
46
42
final PackageConfigProvider packageConfigProvider;
47
43
@@ -99,8 +95,6 @@ class PubPackageBuilder implements PackageBuilder {
99
95
100
96
ResourceProvider get resourceProvider => packageMetaProvider.resourceProvider;
101
97
102
- /* late final */ Packages packages;
103
-
104
98
Future <void > _calculatePackageMap () async {
105
99
assert (_packageMap == null );
106
100
_packageMap = < String , List <Folder >> {};
@@ -110,24 +104,6 @@ class PubPackageBuilder implements PackageBuilder {
110
104
if (info == null ) return ;
111
105
112
106
var rpc = resourceProvider.pathContext;
113
- // This complicated expression transforms a list of [package_config.Package]
114
- // into [analyzer.Packages]. It's a bit confusing because [info.packages]
115
- // is actually the list of [package_config.Package] objects, rather than
116
- // the [Packages] object we need.
117
- packages = Packages (Map .fromEntries (info.packages.map ((p) => MapEntry <
118
- String , Package >(
119
- p.name,
120
- Package (
121
- name: p.name,
122
- rootFolder:
123
- resourceProvider.getFolder (rpc.normalize (rpc.fromUri (p.root))),
124
- languageVersion: p.languageVersion != null
125
- ? Version (p.languageVersion.major, p.languageVersion.minor, 0 )
126
- : null ,
127
- libFolder: resourceProvider.getFolder (
128
- rpc.normalize (rpc.fromUri (p.packageUriRoot)),
129
- ))))));
130
-
131
107
for (var package in info.packages) {
132
108
var packagePath = rpc.normalize (rpc.fromUri (package.packageUriRoot));
133
109
var resource = resourceProvider.getResource (packagePath);
@@ -139,61 +115,17 @@ class PubPackageBuilder implements PackageBuilder {
139
115
140
116
/*late final*/ Map <String , List <Folder >> _packageMap;
141
117
142
- DartUriResolver _embedderResolver ;
118
+ AnalysisContextCollection _contextCollection ;
143
119
144
- DartUriResolver get embedderResolver {
145
- _embedderResolver ?? = DartUriResolver (embedderSdk);
146
- return _embedderResolver;
147
- }
148
-
149
- SourceFactory get sourceFactory {
150
- final UriResolver packageResolver =
151
- PackageMapUriResolver (resourceProvider, _packageMap);
152
- UriResolver sdkResolver;
153
- if (embedderSdk == null || embedderSdk.urlMappings.isEmpty) {
154
- // The embedder uri resolver has no mappings. Use the default Dart SDK
155
- // uri resolver.
156
- sdkResolver = DartUriResolver (sdk);
157
- } else {
158
- // The embedder uri resolver has mappings, use it instead of the default
159
- // Dart SDK uri resolver.
160
- sdkResolver = embedderResolver;
161
- }
162
-
163
- /// [AnalysisDriver] seems to require package resolvers that
164
- /// never resolve to embedded SDK files, and the resolvers list must still
165
- /// contain a DartUriResolver. This hack won't be necessary once analyzer
166
- /// has a clean public API.
167
- var resolvers = [
168
- PackageWithoutSdkResolver (packageResolver, sdkResolver),
169
- sdkResolver,
170
- ResourceUriResolver (resourceProvider),
171
- ];
172
-
173
- assert (
174
- resolvers.any ((UriResolver resolver) => resolver is DartUriResolver ));
175
- return SourceFactory (resolvers);
176
- }
177
-
178
- AnalysisDriver _driver;
179
- AnalysisDriver get driver {
180
- if (_driver == null ) {
181
- var log = PerformanceLog (null );
182
- var scheduler = AnalysisDriverScheduler (log);
183
- var options = AnalysisOptionsImpl ()
184
- ..hint = false
185
- // TODO(jcollins-g): pass in an ExperimentStatus instead?
186
- ..contextFeatures = FeatureSet .fromEnableFlags (config.enableExperiment);
187
- // TODO(jcollins-g): make use of AnalysisContextCollection()
188
- // TODO(jcollins-g): make use of DartProject isApi()
189
- _driver = AnalysisDriver (scheduler, log, resourceProvider,
190
- MemoryByteStore (), FileContentOverlay (), null , sourceFactory, options,
191
- packages: packages);
192
- driver.results.listen ((_) => logProgress ('' ));
193
- driver.exceptions.listen ((_) {});
194
- scheduler.start ();
195
- }
196
- return _driver;
120
+ AnalysisContextCollection get contextCollection {
121
+ _contextCollection ?? = AnalysisContextCollectionImpl (
122
+ includedPaths: [config.inputDir],
123
+ // TODO(jcollins-g): should we pass excluded directories here instead of
124
+ // handling it ourselves?
125
+ resourceProvider: resourceProvider,
126
+ sdkPath: config.sdkDir,
127
+ );
128
+ return _contextCollection;
197
129
}
198
130
199
131
/// Return an Iterable with the sdk files we should parse.
@@ -219,34 +151,20 @@ class PubPackageBuilder implements PackageBuilder {
219
151
}
220
152
}
221
153
var javaFile = JavaFile (filePath).getAbsoluteFile ();
222
- Source source = FileBasedSource (javaFile);
223
-
224
- // TODO(jcollins-g): remove the manual reversal using embedderSdk when we
225
- // upgrade to analyzer-0.30 (where DartUriResolver implements
226
- // restoreAbsolute)
227
- var uri = embedderSdk? .fromFileUri (source.uri)? .uri;
228
- if (uri != null ) {
229
- source = FileBasedSource (javaFile, uri);
230
- } else {
231
- uri = driver.sourceFactory.restoreUri (source);
232
- if (uri != null ) {
233
- source = FileBasedSource (javaFile, uri);
234
- }
235
- }
236
- var sourceKind = await driver.getSourceKind (filePath);
154
+ filePath = javaFile.getPath ();
155
+
156
+ var analysisContext = contextCollection.contextFor (config.inputDir);
157
+ var session = analysisContext.currentSession;
158
+ var sourceKind = await session.getSourceKind (filePath);
159
+
237
160
// Allow dart source files with inappropriate suffixes (#1897). Those
238
161
// do not show up as SourceKind.LIBRARY.
239
162
if (sourceKind != SourceKind .PART ) {
240
163
// Loading libraryElements from part files works, but is painfully slow
241
164
// and creates many duplicates.
242
- final library =
243
- await driver.currentSession.getResolvedLibrary (source.fullName);
165
+ final library = await session.getResolvedLibrary (filePath);
244
166
final libraryElement = library.element;
245
167
var restoredUri = libraryElement.source.uri.toString ();
246
- if (! restoredUri.startsWith ('dart:' )) {
247
- restoredUri =
248
- driver.sourceFactory.restoreUri (library.element.source).toString ();
249
- }
250
168
return DartDocResolvedLibrary (library, restoredUri);
251
169
}
252
170
return null ;
@@ -256,6 +174,23 @@ class PubPackageBuilder implements PackageBuilder {
256
174
for (var filename in files) packageMetaProvider.fromFilename (filename),
257
175
};
258
176
177
+ void _addKnownFiles (LibraryElement element) {
178
+ if (element != null ) {
179
+ var path = element.source.fullName;
180
+ if (_knownFiles.add (path)) {
181
+ for (var import in element.imports) {
182
+ _addKnownFiles (import.importedLibrary);
183
+ }
184
+ for (var export in element.exports) {
185
+ _addKnownFiles (export.exportedLibrary);
186
+ }
187
+ for (var part in element.parts) {
188
+ _knownFiles.add (part.source.fullName);
189
+ }
190
+ }
191
+ }
192
+ }
193
+
259
194
/// Parses libraries with the analyzer and invokes [libraryAdder] with each
260
195
/// result.
261
196
///
@@ -268,10 +203,10 @@ class PubPackageBuilder implements PackageBuilder {
268
203
[bool Function (LibraryElement ) isLibraryIncluded]) async {
269
204
isLibraryIncluded ?? = (_) => true ;
270
205
var lastPass = < PackageMeta > {};
271
- Set <PackageMeta > current ;
206
+ var current = < PackageMeta > {} ;
272
207
var knownParts = < String > {};
273
208
do {
274
- lastPass = _packageMetasForFiles (files) ;
209
+ lastPass = current ;
275
210
276
211
// Be careful here not to accidentally stack up multiple
277
212
// [DartDocResolvedLibrary]s, as those eat our heap.
@@ -282,17 +217,17 @@ class PubPackageBuilder implements PackageBuilder {
282
217
knownParts.add (f);
283
218
continue ;
284
219
}
220
+ _addKnownFiles (r.element);
285
221
if (! libraries.contains (r.element) && isLibraryIncluded (r.element)) {
286
222
logDebug ('parsing ${f }...' );
287
223
libraryAdder (r);
288
224
libraries.add (r.element);
289
225
}
290
226
}
291
227
292
- // Be sure to give the analyzer enough time to find all the files.
293
- await driver.discoverAvailableFiles ();
294
- files.addAll (driver.knownFiles);
295
- files.addAll (_includeExternalsFrom (driver.knownFiles));
228
+ files.addAll (_knownFiles);
229
+ files.addAll (_includeExternalsFrom (_knownFiles));
230
+
296
231
current = _packageMetasForFiles (files.difference (knownParts));
297
232
// To get canonicalization correct for non-locally documented packages
298
233
// (so we can generate the right hyperlinks), it's vital that we
@@ -504,47 +439,8 @@ class PubPackageBuilder implements PackageBuilder {
504
439
}
505
440
}
506
441
507
- /// This class resolves package URIs, but only if a given SdkResolver doesn't
508
- /// resolve them.
509
- ///
510
- /// TODO(jcollins-g): remove this hackery when a clean public API to analyzer
511
- /// exists, and port dartdoc to it.
512
- class PackageWithoutSdkResolver extends UriResolver {
513
- final UriResolver _packageResolver;
514
- final UriResolver _sdkResolver;
515
-
516
- PackageWithoutSdkResolver (this ._packageResolver, this ._sdkResolver);
517
-
518
- @override
519
- Source resolveAbsolute (Uri uri, [Uri actualUri]) {
520
- if (_sdkResolver.resolveAbsolute (uri, actualUri) == null ) {
521
- return _packageResolver.resolveAbsolute (uri, actualUri);
522
- }
523
- return null ;
524
- }
525
-
526
- @override
527
- Uri restoreAbsolute (Source source) {
528
- Uri resolved;
529
- try {
530
- resolved = _sdkResolver.restoreAbsolute (source);
531
- } on ArgumentError {
532
- // SDK resolvers really don't like being thrown package paths.
533
- }
534
- if (resolved == null ) {
535
- return _packageResolver.restoreAbsolute (source);
536
- }
537
- return null ;
538
- }
539
- }
540
-
541
442
/// Contains the [ResolvedLibraryResult] and any additional information about
542
- /// the library coming from [AnalysisDriver] .
543
- ///
544
- /// Prefer to populate this class with more information rather than passing
545
- /// [AnalysisDriver] or [AnalysisSession] down to [PackageGraph] . The graph
546
- /// object is reachable by many DartDoc model objects and there's no guarantee
547
- /// that there's a valid [AnalysisDriver] in every environment dartdoc runs.
443
+ /// the library.
548
444
class DartDocResolvedLibrary {
549
445
final ResolvedLibraryResult result;
550
446
final String restoredUri;
0 commit comments