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(); |
+} |