Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(58)

Unified Diff: pkg/code_transformers/lib/src/resolver_impl.dart

Issue 181383015: Refactoring resolvers to make them able to be run in parallel. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: pkg/code_transformers/lib/src/resolver_impl.dart
diff --git a/pkg/code_transformers/lib/src/resolver_impl.dart b/pkg/code_transformers/lib/src/resolver_impl.dart
index fe9f6d951fce11abfe3b0d41e2b2051a6e6bebc2..0c2bce2eaaf9906952b465e1c334f624985560a1 100644
--- a/pkg/code_transformers/lib/src/resolver_impl.dart
+++ b/pkg/code_transformers/lib/src/resolver_impl.dart
@@ -46,6 +46,12 @@ class ResolverImpl implements Resolver {
/// The currently resolved library, or null if unresolved.
LibraryElement _entryLibrary;
+ /// Future indicating when this resolver is done in the current phase.
+ Future _lastPhaseComplete = new Future.value();
+
+ /// Completer for wrapping up the current phase.
+ Completer _currentPhaseComplete;
+
/// Handler for all Dart SDK (dart:) sources.
DirectoryBasedDartSdk _dartSdk;
@@ -73,19 +79,36 @@ class ResolverImpl implements Resolver {
LibraryElement get entryLibrary => _entryLibrary;
+ Future<Resolver> resolve(Transform transform) {
+ // Can only have one resolve in progress at a time, so chain the current
+ // resolution to be after the last one.
+ var phaseComplete = new Completer();
+ var future = _lastPhaseComplete.then((_) {
+ _currentPhaseComplete = phaseComplete;
+
+ return _performResolve(transform);
+ }).then((_) => this);
+ // Advance the lastPhaseComplete to be done when this phase is all done.
+ _lastPhaseComplete = phaseComplete.future;
+ return future;
+ }
+
+ void release() {
+ if (_currentPhaseComplete == null) {
+ throw new StateError('Releasing without current lock.');
+ }
+ _currentPhaseComplete.complete(null);
+ _currentPhaseComplete = null;
- /// Update the status of all the sources referenced by the entryPoint and
- /// update the resolved library.
- ///
- /// This will be invoked automatically by [ResolverTransformer]. Only one
- /// transformer may update this at a time.
- Future updateSources(Transform transform) {
+ // Clear out the entry lib since it should not be referenced after release.
+ _entryLibrary = null;
+ }
+
+ Future _performResolve(Transform transform) {
if (_currentTransform != null) {
throw new StateError('Cannot be accessed by concurrent transforms');
}
_currentTransform = transform;
- // Clear this out and update once all asset changes have been processed.
- _entryLibrary = null;
// Basic approach is to start at the first file, update it's contents
// and see if it changed, then walk all files accessed by it.
@@ -471,6 +494,13 @@ AssetId _resolve(AssetId source, String url, TransformLogger logger,
if (url == null || url == '') return null;
var uri = Uri.parse(url);
+ // Workaround for dartbug.com/17156- pub transforms package: imports from
+ // files of the transformers package to have absolute /packages/ URIs.
+ if (uri.scheme == '' && path.isAbsolute(url)
+ && uri.pathSegments[0] == 'packages') {
+ uri = Uri.parse('package:${uri.pathSegments.skip(1).join(path.separator)}');
+ }
+
if (uri.scheme == 'package') {
var segments = new List.from(uri.pathSegments);
var package = segments[0];

Powered by Google App Engine
This is Rietveld 408576698