| Index: packages/code_transformers/lib/src/resolvers.dart
|
| diff --git a/packages/code_transformers/lib/src/resolvers.dart b/packages/code_transformers/lib/src/resolvers.dart
|
| index fa2f953cdd1d88db33b0ce8332c0e8491e5e5796..96b5df7c7e9b7cfe8ef9b364b14ed438e9071eae 100644
|
| --- a/packages/code_transformers/lib/src/resolvers.dart
|
| +++ b/packages/code_transformers/lib/src/resolvers.dart
|
| @@ -7,8 +7,10 @@ library code_transformers.src.resolvers;
|
| import 'dart:async';
|
| import 'package:barback/barback.dart';
|
|
|
| +import 'package:analyzer/file_system/physical_file_system.dart';
|
| import 'package:analyzer/src/generated/engine.dart' show AnalysisOptions;
|
| import 'package:analyzer/src/generated/sdk.dart' show DartSdk;
|
| +import 'package:analyzer/src/generated/engine.dart';
|
| import 'package:analyzer/src/generated/source.dart' show DartUriResolver;
|
|
|
| import 'entry_point.dart';
|
| @@ -25,22 +27,25 @@ import 'dart_sdk.dart' hide dartSdkDirectory;
|
| /// If multiple transformers rely on a resolved AST they should (ideally) share
|
| /// the same Resolvers object to minimize re-parsing the AST.
|
| class Resolvers {
|
| - final Map<AssetId, Resolver> _resolvers = {};
|
| - final DartSdk dartSdk;
|
| - final DartUriResolver dartUriResolver;
|
| - final AnalysisOptions options;
|
| + final Resolver _resolver;
|
|
|
| - Resolvers.fromSdk(this.dartSdk, this.dartUriResolver, {this.options});
|
| + Resolvers.fromSdk(DartSdk dartSdk, DartUriResolver dartUriResolver,
|
| + {AnalysisOptions options})
|
| + : _resolver =
|
| + new ResolverImpl(dartSdk, dartUriResolver, options: options);
|
|
|
| - factory Resolvers(dartSdkDirectory, {AnalysisOptions options}) {
|
| - var sdk = new DirectoryBasedDartSdkProxy(dartSdkDirectory);
|
| + factory Resolvers(String dartSdkDirectory, {AnalysisOptions options}) {
|
| + _initAnalysisEngine();
|
| + var sdk = new FolderBasedDartSdkProxy(
|
| + PhysicalResourceProvider.INSTANCE, dartSdkDirectory);
|
| var uriResolver = new DartUriResolverProxy(sdk);
|
| return new Resolvers.fromSdk(sdk, uriResolver, options: options);
|
| }
|
|
|
| factory Resolvers.fromMock(Map<String, String> sources,
|
| {bool reportMissing: false, AnalysisOptions options}) {
|
| - var sdk = new MockDartSdk(sources, reportMissing: reportMissing);
|
| + _initAnalysisEngine();
|
| + var sdk = new MockDartSdk(sources, options, reportMissing: reportMissing);
|
| return new Resolvers.fromSdk(sdk, sdk.resolver, options: options);
|
| }
|
|
|
| @@ -51,12 +56,11 @@ class Resolvers {
|
| /// [Resolver.release] must be called once it's done being used, or
|
| /// [ResolverTransformer] should be used to automatically release the
|
| /// resolver.
|
| - Future<Resolver> get(Transform transform, [List<AssetId> entryPoints]) {
|
| - var id = transform.primaryInput.id;
|
| - var resolver = _resolvers.putIfAbsent(
|
| - id, () => new ResolverImpl(dartSdk, dartUriResolver, options: options));
|
| - return resolver.resolve(transform, entryPoints);
|
| - }
|
| + ///
|
| + /// See [Resolver#resolve] for more info on the `resolveAllLibraries` option.
|
| + Future<Resolver> get(Transform transform,
|
| + [List<AssetId> entryPoints, bool resolveAllLibraries]) =>
|
| + _resolver.resolve(transform, entryPoints, resolveAllLibraries);
|
| }
|
|
|
| /// Transformer mixin which automatically gets and releases resolvers.
|
| @@ -67,14 +71,17 @@ abstract class ResolverTransformer implements Transformer {
|
| /// The cache of resolvers- must be set from subclass.
|
| Resolvers resolvers;
|
|
|
| - /// By default only process prossible entry point assets.
|
| + /// See [Resolver#resolve] for more info - can be overridden by a subclass.
|
| + bool get resolveAllLibraries => true;
|
| +
|
| + /// By default only process possible entry point assets.
|
| ///
|
| /// This is only a preliminary check based on the asset ID.
|
| Future<bool> isPrimary(assetOrId) {
|
| // assetOrId is to handle the transition from Asset to AssetID between
|
| // pub 1.3 and 1.4. Once support for 1.3 is dropped this should only
|
| // support AssetId.
|
| - var id = assetOrId is AssetId ? assetOrId : assetOrId.id;
|
| + var id = assetOrId is AssetId ? assetOrId : (assetOrId as Asset).id;
|
| return new Future.value(isPossibleDartEntryId(id));
|
| }
|
|
|
| @@ -95,8 +102,8 @@ abstract class ResolverTransformer implements Transformer {
|
| /// to run the resolver on.
|
| Future apply(Transform transform) =>
|
| shouldApplyResolver(transform.primaryInput).then((result) {
|
| - if (result) return applyToEntryPoints(transform);
|
| - });
|
| + if (result) return applyToEntryPoints(transform);
|
| + });
|
|
|
| /// Helper function to make it easy to write an `Transformer.apply` method
|
| /// that automatically gets and releases the resolver. This is typically used
|
| @@ -107,9 +114,11 @@ abstract class ResolverTransformer implements Transformer {
|
| /// return applyToEntryPoints(transform, entryPoints);
|
| /// }
|
| Future applyToEntryPoints(Transform transform, [List<AssetId> entryPoints]) {
|
| - return resolvers.get(transform, entryPoints).then((resolver) {
|
| - return new Future(() => applyResolver(transform, resolver)).whenComplete(
|
| - () {
|
| + return resolvers
|
| + .get(transform, entryPoints, resolveAllLibraries)
|
| + .then((resolver) {
|
| + return new Future(() => applyResolver(transform, resolver))
|
| + .whenComplete(() {
|
| resolver.release();
|
| });
|
| });
|
| @@ -120,3 +129,10 @@ abstract class ResolverTransformer implements Transformer {
|
| /// Return a Future to indicate when apply is completed.
|
| applyResolver(Transform transform, Resolver resolver);
|
| }
|
| +
|
| +bool _analysisEngineInitialized = false;
|
| +_initAnalysisEngine() {
|
| + if (_analysisEngineInitialized) return;
|
| + _analysisEngineInitialized = true;
|
| + AnalysisEngine.instance.processRequiredPlugins();
|
| +}
|
|
|