blob: b7119ecad65352ba4f726d2cf4ed2a75e5c67506 [file] [log] [blame]
// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
library dart2js.serialization.task;
import '../common/resolution.dart' show
ResolutionImpact,
ResolutionWorkItem;
import '../common/tasks.dart' show
CompilerTask;
import '../common/work.dart' show
ItemCompilationContext;
import '../compiler.dart' show
Compiler;
import '../elements/elements.dart';
import '../enqueue.dart' show
ResolutionEnqueuer;
import '../universe/world_impact.dart' show
WorldImpact;
/// A deserializer that can load a library element by reading it's information
/// from a serialized form.
abstract class LibraryDeserializer {
/// Loads the [LibraryElement] associated with a library under [uri], or null
/// if no serialized information is available for the given library.
LibraryElement readLibrary(Uri uri);
}
/// Task that supports deserialization of elements.
class SerializationTask extends CompilerTask implements LibraryDeserializer {
SerializationTask(Compiler compiler) : super(compiler);
DeserializerSystem deserializer;
String get name => 'Serialization';
/// If `true`, data must be retained to support serialization.
// TODO(johnniwinther): Make this more precise in terms of what needs to be
// retained, for instance impacts, resolution data etc.
bool supportSerialization = false;
/// Returns the [LibraryElement] for [resolvedUri] if available from
/// serialization.
LibraryElement readLibrary(Uri resolvedUri) {
if (deserializer == null) return null;
return deserializer.readLibrary(resolvedUri);
}
/// Returns `true` if [element] has been deserialized.
bool isDeserialized(Element element) {
return deserializer != null && deserializer.isDeserialized(element);
}
/// Creates the [ResolutionWorkItem] for the deserialized [element].
ResolutionWorkItem createResolutionWorkItem(
Element element, ItemCompilationContext context) {
assert(deserializer != null);
assert(isDeserialized(element));
return new DeserializedResolutionWorkItem(
element, context, deserializer.computeWorldImpact(element));
}
}
/// A [ResolutionWorkItem] for a deserialized element.
///
/// This will not resolve the element but only compute the [WorldImpact].
class DeserializedResolutionWorkItem implements ResolutionWorkItem {
final Element element;
final ItemCompilationContext compilationContext;
final WorldImpact worldImpact;
bool _isAnalyzed = false;
DeserializedResolutionWorkItem(
this.element, this.compilationContext, this.worldImpact);
@override
bool get isAnalyzed => _isAnalyzed;
@override
WorldImpact run(Compiler compiler, ResolutionEnqueuer world) {
_isAnalyzed = true;
world.registerProcessedElement(element);
return worldImpact;
}
}
/// The interface for a system that supports deserialization of libraries and
/// elements.
abstract class DeserializerSystem {
LibraryElement readLibrary(Uri resolvedUri);
bool isDeserialized(Element element);
ResolutionImpact getResolutionImpact(Element element);
WorldImpact computeWorldImpact(Element element);
}