[dart2js] Elide a number of interfaces.
Inlined KClosedWorldImpl into KClosedWorld
Inlined ResolutionWorldBuilderImpl into ResolutionWorldBuilder
Change-Id: Id88abac06f7cd279413ae56ea8b021b349009649
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/233655
Reviewed-by: Mark Zhou <markzipan@google.com>
Commit-Queue: Joshua Litt <joshualitt@google.com>
diff --git a/pkg/compiler/lib/src/backend_strategy.dart b/pkg/compiler/lib/src/backend_strategy.dart
index a8f2d9f..a3ce46d 100644
--- a/pkg/compiler/lib/src/backend_strategy.dart
+++ b/pkg/compiler/lib/src/backend_strategy.dart
@@ -17,6 +17,7 @@
import 'js_backend/inferred_data.dart';
import 'js_emitter/code_emitter_task.dart';
import 'js_model/locals.dart';
+import 'kernel/kernel_world.dart';
import 'serialization/serialization.dart';
import 'ssa/ssa.dart';
import 'universe/codegen_world_builder.dart';
diff --git a/pkg/compiler/lib/src/compiler.dart b/pkg/compiler/lib/src/compiler.dart
index ba54779..8ff980a3 100644
--- a/pkg/compiler/lib/src/compiler.dart
+++ b/pkg/compiler/lib/src/compiler.dart
@@ -39,12 +39,14 @@
import 'io/source_information.dart' show SourceInformation;
import 'ir/modular.dart';
import 'js_backend/backend.dart' show CodegenInputs;
+import 'js_backend/enqueuer.dart';
import 'js_backend/inferred_data.dart';
import 'js_model/js_strategy.dart';
import 'js_model/js_world.dart';
import 'js_model/locals.dart';
import 'kernel/front_end_adapter.dart' show CompilerFileSystem;
import 'kernel/kernel_strategy.dart';
+import 'kernel/kernel_world.dart';
import 'kernel/loader.dart' show KernelLoaderTask, KernelResult;
import 'null_compiler_output.dart' show NullCompilerOutput;
import 'options.dart' show CompilerOptions;
@@ -56,7 +58,7 @@
import 'universe/codegen_world_builder.dart';
import 'universe/resolution_world_builder.dart';
import 'universe/world_impact.dart' show WorldImpact, WorldImpactBuilderImpl;
-import 'world.dart' show JClosedWorld, KClosedWorld;
+import 'world.dart' show JClosedWorld;
typedef MakeReporterFunction = CompilerDiagnosticReporter Function(
Compiler compiler, CompilerOptions options);
@@ -499,7 +501,7 @@
codegenResults.globalTypeInferenceResults;
JClosedWorld closedWorld = globalInferenceResults.closedWorld;
CodegenInputs codegenInputs = codegenResults.codegenInputs;
- Enqueuer codegenEnqueuer = enqueuer.createCodegenEnqueuer(
+ CodegenEnqueuer codegenEnqueuer = enqueuer.createCodegenEnqueuer(
closedWorld, globalInferenceResults, codegenInputs, codegenResults);
_codegenWorldBuilder = codegenEnqueuer.worldBuilder;
diff --git a/pkg/compiler/lib/src/deferred_load/algorithm_state.dart b/pkg/compiler/lib/src/deferred_load/algorithm_state.dart
index 4aca919..5e1b914 100644
--- a/pkg/compiler/lib/src/deferred_load/algorithm_state.dart
+++ b/pkg/compiler/lib/src/deferred_load/algorithm_state.dart
@@ -11,7 +11,7 @@
import '../compiler.dart' show Compiler;
import '../elements/entities.dart';
import '../kernel/element_map.dart';
-import '../world.dart' show KClosedWorld;
+import '../kernel/kernel_world.dart';
/// Manages the state of the [EntityData] model. Every class, member, constant,
/// etc, is wrapped in the deferred loading algorithm by an [EntityData] which
diff --git a/pkg/compiler/lib/src/deferred_load/deferred_load.dart b/pkg/compiler/lib/src/deferred_load/deferred_load.dart
index 405738c..4a5af37 100644
--- a/pkg/compiler/lib/src/deferred_load/deferred_load.dart
+++ b/pkg/compiler/lib/src/deferred_load/deferred_load.dart
@@ -286,8 +286,8 @@
import '../elements/types.dart';
import '../elements/entities.dart';
import '../kernel/element_map.dart';
+import '../kernel/kernel_world.dart';
import '../util/util.dart' show makeUnique;
-import '../world.dart' show KClosedWorld;
class _DeferredLoadTaskMetrics implements Metrics {
@override
diff --git a/pkg/compiler/lib/src/deferred_load/entity_data_info.dart b/pkg/compiler/lib/src/deferred_load/entity_data_info.dart
index b601c6c..6f6c33a 100644
--- a/pkg/compiler/lib/src/deferred_load/entity_data_info.dart
+++ b/pkg/compiler/lib/src/deferred_load/entity_data_info.dart
@@ -17,9 +17,9 @@
import '../ir/util.dart';
import '../kernel/kelements.dart' show KLocalFunction;
import '../kernel/element_map.dart';
+import '../kernel/kernel_world.dart';
import '../universe/use.dart';
import '../universe/world_impact.dart' show WorldImpact, WorldImpactVisitorImpl;
-import '../world.dart' show KClosedWorld;
/// [EntityDataInfo] is meta data about [EntityData] for a given compilation
/// [Entity].
diff --git a/pkg/compiler/lib/src/enqueue.dart b/pkg/compiler/lib/src/enqueue.dart
index de9afc0..470e510 100644
--- a/pkg/compiler/lib/src/enqueue.dart
+++ b/pkg/compiler/lib/src/enqueue.dart
@@ -21,7 +21,6 @@
import 'js_backend/enqueuer.dart';
import 'universe/member_usage.dart';
import 'universe/resolution_world_builder.dart';
-import 'universe/world_builder.dart';
import 'universe/use.dart'
show
ConstantUse,
@@ -60,13 +59,17 @@
return enqueuer;
}
- Enqueuer createCodegenEnqueuer(
+ CodegenEnqueuer createCodegenEnqueuer(
JClosedWorld closedWorld,
GlobalTypeInferenceResults globalInferenceResults,
CodegenInputs codegenInputs,
CodegenResults codegenResults) {
- Enqueuer enqueuer = compiler.backendStrategy.createCodegenEnqueuer(this,
- closedWorld, globalInferenceResults, codegenInputs, codegenResults)
+ CodegenEnqueuer enqueuer = compiler.backendStrategy.createCodegenEnqueuer(
+ this,
+ closedWorld,
+ globalInferenceResults,
+ codegenInputs,
+ codegenResults)
..onEmptyForTesting = compiler.onCodegenQueueEmptyForTesting;
if (retainDataForTesting) {
codegenEnqueuerForTesting = enqueuer;
@@ -142,7 +145,6 @@
// side-effects.
static bool skipEnqueuerCheckForTesting = false;
- WorldBuilder get worldBuilder;
WorldImpactVisitor get impactVisitor;
/// Returns [:true:] if this enqueuer is the resolution enqueuer.
@@ -171,6 +173,8 @@
Iterable<ClassEntity> get processedClasses;
+ Iterable<ClassEntity> get directlyInstantiatedClasses;
+
CompilerTask get task;
void checkClass(ClassEntity cls);
void processStaticUse(MemberEntity member, StaticUse staticUse);
@@ -191,8 +195,7 @@
bool checkEnqueuerConsistency(ElementEnvironment elementEnvironment) {
task.measureSubtask('resolution.check', () {
// Run through the classes and see if we need to enqueue more methods.
- for (ClassEntity classElement
- in worldBuilder.directlyInstantiatedClasses) {
+ for (ClassEntity classElement in directlyInstantiatedClasses) {
for (ClassEntity currentClass = classElement;
currentClass != null;
currentClass = elementEnvironment.getSuperClass(currentClass)) {
@@ -214,7 +217,7 @@
final Set<ClassEntity> _recentClasses = Setlet<ClassEntity>();
bool _recentConstants = false;
- final ResolutionEnqueuerWorldBuilder _worldBuilder;
+ final ResolutionWorldBuilder worldBuilder;
WorkItemBuilder _workItemBuilder;
final DiagnosticReporter _reporter;
final AnnotationsData _annotationsData;
@@ -232,13 +235,14 @@
void Function() onEmptyForTesting;
ResolutionEnqueuer(this.task, this._reporter, this.listener,
- this._worldBuilder, this._workItemBuilder, this._annotationsData,
+ this.worldBuilder, this._workItemBuilder, this._annotationsData,
[this.name = 'resolution enqueuer']) {
impactVisitor = EnqueuerImpactVisitor(this);
}
@override
- ResolutionWorldBuilder get worldBuilder => _worldBuilder;
+ Iterable<ClassEntity> get directlyInstantiatedClasses =>
+ worldBuilder.directlyInstantiatedClasses;
@override
bool get queueIsEmpty => _queue.isEmpty;
@@ -251,14 +255,14 @@
}
@override
- Iterable<ClassEntity> get processedClasses => _worldBuilder.processedClasses;
+ Iterable<ClassEntity> get processedClasses => worldBuilder.processedClasses;
void _registerInstantiatedType(InterfaceType type,
{ConstructorEntity constructor,
bool nativeUsage = false,
bool globalDependency = false}) {
task.measureSubtask('resolution.typeUse', () {
- _worldBuilder.registerTypeInstantiation(type, _applyClassUse,
+ worldBuilder.registerTypeInstantiation(type, _applyClassUse,
constructor: constructor);
listener.registerInstantiatedType(type,
isGlobal: globalDependency, nativeUsage: nativeUsage);
@@ -274,7 +278,7 @@
@override
void checkClass(ClassEntity cls) {
- _worldBuilder.processClassMembers(cls,
+ worldBuilder.processClassMembers(cls,
(MemberEntity member, EnumSet<MemberUse> useSet) {
if (useSet.isNotEmpty) {
_reporter.internalError(member,
@@ -300,7 +304,7 @@
void _applyClassUse(ClassEntity cls, EnumSet<ClassUse> useSet) {
if (useSet.contains(ClassUse.INSTANTIATED)) {
_recentClasses.add(cls);
- _worldBuilder.processClassMembers(cls, _applyMemberUse);
+ worldBuilder.processClassMembers(cls, _applyMemberUse);
// We only tell the backend once that [cls] was instantiated, so
// any additional dependencies must be treated as global
// dependencies.
@@ -314,14 +318,14 @@
@override
void processDynamicUse(DynamicUse dynamicUse) {
task.measureSubtask('resolution.dynamicUse', () {
- _worldBuilder.registerDynamicUse(dynamicUse, _applyMemberUse);
+ worldBuilder.registerDynamicUse(dynamicUse, _applyMemberUse);
});
}
@override
void processConstantUse(ConstantUse constantUse) {
task.measureSubtask('resolution.constantUse', () {
- if (_worldBuilder.registerConstantUse(constantUse)) {
+ if (worldBuilder.registerConstantUse(constantUse)) {
applyImpact(listener.registerUsedConstant(constantUse.value));
_recentConstants = true;
}
@@ -331,7 +335,7 @@
@override
void processStaticUse(MemberEntity member, StaticUse staticUse) {
task.measureSubtask('resolution.staticUse', () {
- _worldBuilder.registerStaticUse(staticUse, _applyMemberUse);
+ worldBuilder.registerStaticUse(staticUse, _applyMemberUse);
// TODO(johnniwinther): Add `ResolutionWorldBuilder.registerConstructorUse`
// for these:
switch (staticUse.kind) {
@@ -380,7 +384,7 @@
break;
case TypeUseKind.TYPE_LITERAL:
if (type is TypeVariableType) {
- _worldBuilder.registerTypeVariableTypeLiteral(type);
+ worldBuilder.registerTypeVariableTypeLiteral(type);
}
break;
case TypeUseKind.RTI_VALUE:
@@ -396,17 +400,17 @@
}
void _registerIsCheck(DartType type) {
- _worldBuilder.registerIsCheck(type);
+ worldBuilder.registerIsCheck(type);
}
void _registerNamedTypeVariableNewRti(TypeVariableType type) {
- _worldBuilder.registerNamedTypeVariableNewRti(type);
+ worldBuilder.registerNamedTypeVariableNewRti(type);
}
void _registerClosurizedMember(MemberEntity element) {
assert(element.isInstanceMember);
applyImpact(listener.registerClosurizedMember(element));
- _worldBuilder.registerClosurizedMember(element);
+ worldBuilder.registerClosurizedMember(element);
}
void _forEach(void f(WorkItem work)) {
@@ -414,9 +418,9 @@
while (_queue.isNotEmpty) {
// TODO(johnniwinther): Find an optimal process order.
WorkItem work = _queue.removeLast();
- if (!_worldBuilder.isMemberProcessed(work.element)) {
+ if (!worldBuilder.isMemberProcessed(work.element)) {
f(work);
- _worldBuilder.registerProcessedMember(work.element);
+ worldBuilder.registerProcessedMember(work.element);
}
}
List<ClassEntity> recents = _recentClasses.toList(growable: false);
@@ -448,8 +452,7 @@
String toString() => 'Enqueuer($name)';
@override
- Iterable<MemberEntity> get processedEntities =>
- _worldBuilder.processedMembers;
+ Iterable<MemberEntity> get processedEntities => worldBuilder.processedMembers;
@override
bool get isResolutionQueue => true;
@@ -465,13 +468,13 @@
/// Registers [entity] as processed by the resolution enqueuer. Used only for
/// testing.
void registerProcessedElementInternal(MemberEntity entity) {
- _worldBuilder.registerProcessedMember(entity);
+ worldBuilder.registerProcessedMember(entity);
}
/// Create a [WorkItem] for [entity] and add it to the work list if it has not
/// already been processed.
void _addToWorkList(MemberEntity entity) {
- if (_worldBuilder.isMemberProcessed(entity)) return;
+ if (worldBuilder.isMemberProcessed(entity)) return;
WorkItem workItem = _workItemBuilder.createWorkItem(entity);
if (workItem == null) return;
@@ -481,7 +484,7 @@
}
applyImpact(listener.registerUsedElement(entity));
- _worldBuilder.registerUsedElement(entity);
+ worldBuilder.registerUsedElement(entity);
_queue.add(workItem);
}
diff --git a/pkg/compiler/lib/src/js_backend/enqueuer.dart b/pkg/compiler/lib/src/js_backend/enqueuer.dart
index e8abbfb..a80f764 100644
--- a/pkg/compiler/lib/src/js_backend/enqueuer.dart
+++ b/pkg/compiler/lib/src/js_backend/enqueuer.dart
@@ -33,7 +33,7 @@
final String name;
final Set<ClassEntity> _recentClasses = Setlet();
bool _recentConstants = false;
- final CodegenWorldBuilderImpl _worldBuilder;
+ final CodegenWorldBuilderImpl worldBuilder;
final WorkItemBuilder _workItemBuilder;
@override
@@ -56,14 +56,15 @@
// applying additional impacts before re-emptying the queue.
void Function() onEmptyForTesting;
- CodegenEnqueuer(this.task, this._worldBuilder, this._workItemBuilder,
+ CodegenEnqueuer(this.task, this.worldBuilder, this._workItemBuilder,
this.listener, this._annotationsData)
: this.name = 'codegen enqueuer' {
impactVisitor = EnqueuerImpactVisitor(this);
}
@override
- CodegenWorldBuilder get worldBuilder => _worldBuilder;
+ Iterable<ClassEntity> get directlyInstantiatedClasses =>
+ worldBuilder.directlyInstantiatedClasses;
@override
bool get queueIsEmpty => _queue.isEmpty;
@@ -98,7 +99,7 @@
void _registerInstantiatedType(InterfaceType type,
{bool nativeUsage = false}) {
task.measureSubtask('codegen.typeUse', () {
- _worldBuilder.registerTypeInstantiation(type, _applyClassUse);
+ worldBuilder.registerTypeInstantiation(type, _applyClassUse);
listener.registerInstantiatedType(type, nativeUsage: nativeUsage);
});
}
@@ -111,7 +112,7 @@
@override
void checkClass(ClassEntity cls) {
- _worldBuilder.processClassMembers(cls,
+ worldBuilder.processClassMembers(cls,
(MemberEntity member, EnumSet<MemberUse> useSet) {
if (useSet.isNotEmpty) {
failedAt(member,
@@ -124,7 +125,7 @@
void _applyClassUse(ClassEntity cls, EnumSet<ClassUse> useSet) {
if (useSet.contains(ClassUse.INSTANTIATED)) {
_recentClasses.add(cls);
- _worldBuilder.processClassMembers(cls, _applyMemberUse);
+ worldBuilder.processClassMembers(cls, _applyMemberUse);
// We only tell the backend once that [cls] was instantiated, so
// any additional dependencies must be treated as global
// dependencies.
@@ -151,14 +152,14 @@
@override
void processDynamicUse(DynamicUse dynamicUse) {
task.measureSubtask('codegen.dynamicUse', () {
- _worldBuilder.registerDynamicUse(dynamicUse, _applyMemberUse);
+ worldBuilder.registerDynamicUse(dynamicUse, _applyMemberUse);
});
}
@override
void processStaticUse(MemberEntity member, StaticUse staticUse) {
task.measureSubtask('codegen.staticUse', () {
- _worldBuilder.registerStaticUse(staticUse, _applyMemberUse);
+ worldBuilder.registerStaticUse(staticUse, _applyMemberUse);
switch (staticUse.kind) {
case StaticUseKind.CONSTRUCTOR_INVOKE:
case StaticUseKind.CONST_CONSTRUCTOR_INVOKE:
@@ -206,17 +207,17 @@
break;
case TypeUseKind.TYPE_LITERAL:
if (type is TypeVariableType) {
- _worldBuilder.registerTypeVariableTypeLiteral(type);
+ worldBuilder.registerTypeVariableTypeLiteral(type);
}
break;
case TypeUseKind.RTI_VALUE:
- _worldBuilder.registerConstTypeLiteral(type);
+ worldBuilder.registerConstTypeLiteral(type);
break;
case TypeUseKind.TYPE_ARGUMENT:
- _worldBuilder.registerTypeArgument(type);
+ worldBuilder.registerTypeArgument(type);
break;
case TypeUseKind.CONSTRUCTOR_REFERENCE:
- _worldBuilder.registerConstructorReference(type);
+ worldBuilder.registerConstructorReference(type);
break;
case TypeUseKind.CONST_INSTANTIATION:
failedAt(CURRENT_ELEMENT_SPANNABLE, "Unexpected type use: $typeUse.");
@@ -230,7 +231,7 @@
@override
void processConstantUse(ConstantUse constantUse) {
task.measureSubtask('codegen.constantUse', () {
- if (_worldBuilder.registerConstantUse(constantUse)) {
+ if (worldBuilder.registerConstantUse(constantUse)) {
applyImpact(listener.registerUsedConstant(constantUse.value));
_recentConstants = true;
}
@@ -238,11 +239,11 @@
}
void _registerIsCheck(DartType type) {
- _worldBuilder.registerIsCheck(type);
+ worldBuilder.registerIsCheck(type);
}
void _registerNamedTypeVariableNewRti(TypeVariableType type) {
- _worldBuilder.registerNamedTypeVariableNewRti(type);
+ worldBuilder.registerNamedTypeVariableNewRti(type);
}
void _registerClosurizedMember(FunctionEntity element) {
@@ -303,5 +304,5 @@
@override
Iterable<ClassEntity> get processedClasses =>
- _worldBuilder.instantiatedClasses;
+ worldBuilder.instantiatedClasses;
}
diff --git a/pkg/compiler/lib/src/js_backend/field_analysis.dart b/pkg/compiler/lib/src/js_backend/field_analysis.dart
index 4ff7751..0f3326c 100644
--- a/pkg/compiler/lib/src/js_backend/field_analysis.dart
+++ b/pkg/compiler/lib/src/js_backend/field_analysis.dart
@@ -270,8 +270,8 @@
sink.end(tag);
}
- factory JFieldAnalysis.from(KClosedWorldImpl closedWorld, JsToFrontendMap map,
- CompilerOptions options) {
+ factory JFieldAnalysis.from(
+ KClosedWorld closedWorld, JsToFrontendMap map, CompilerOptions options) {
Map<FieldEntity, FieldAnalysisData> fieldData = {};
bool canBeElided(FieldEntity field) {
diff --git a/pkg/compiler/lib/src/js_backend/runtime_types_resolution.dart b/pkg/compiler/lib/src/js_backend/runtime_types_resolution.dart
index 253d438..2606826 100644
--- a/pkg/compiler/lib/src/js_backend/runtime_types_resolution.dart
+++ b/pkg/compiler/lib/src/js_backend/runtime_types_resolution.dart
@@ -12,6 +12,7 @@
import '../elements/types.dart';
import '../ir/runtime_type_analysis.dart';
import '../kernel/kelements.dart';
+import '../kernel/kernel_world.dart';
import '../options.dart';
import '../serialization/serialization.dart';
import '../universe/class_hierarchy.dart';
diff --git a/pkg/compiler/lib/src/js_model/js_strategy.dart b/pkg/compiler/lib/src/js_model/js_strategy.dart
index fa22c30..51028eb 100644
--- a/pkg/compiler/lib/src/js_model/js_strategy.dart
+++ b/pkg/compiler/lib/src/js_model/js_strategy.dart
@@ -41,6 +41,7 @@
import '../js_emitter/js_emitter.dart' show CodeEmitterTask;
import '../js/js.dart' as js;
import '../kernel/kernel_strategy.dart';
+import '../kernel/kernel_world.dart';
import '../native/behavior.dart';
import '../native/enqueue.dart';
import '../options.dart';
diff --git a/pkg/compiler/lib/src/js_model/js_world_builder.dart b/pkg/compiler/lib/src/js_model/js_world_builder.dart
index 6815146..fb5e0ef 100644
--- a/pkg/compiler/lib/src/js_model/js_world_builder.dart
+++ b/pkg/compiler/lib/src/js_model/js_world_builder.dart
@@ -24,6 +24,7 @@
import '../js_backend/no_such_method_registry.dart';
import '../js_backend/runtime_types_resolution.dart';
import '../kernel/kelements.dart';
+import '../kernel/kernel_world.dart';
import '../native/behavior.dart';
import '../options.dart';
import '../universe/class_hierarchy.dart';
@@ -31,7 +32,6 @@
import '../universe/feature.dart';
import '../universe/member_usage.dart';
import '../universe/selector.dart';
-import '../world.dart';
import 'closure.dart';
import 'elements.dart';
import 'element_map_impl.dart';
diff --git a/pkg/compiler/lib/src/kernel/kernel_strategy.dart b/pkg/compiler/lib/src/kernel/kernel_strategy.dart
index ef176a1..336ead7 100644
--- a/pkg/compiler/lib/src/kernel/kernel_strategy.dart
+++ b/pkg/compiler/lib/src/kernel/kernel_strategy.dart
@@ -187,7 +187,7 @@
_nativeResolutionEnqueuer,
_fieldAnalysis,
compiler.deferredLoadTask),
- ResolutionWorldBuilderImpl(
+ ResolutionWorldBuilder(
_options,
elementMap,
elementEnvironment,
diff --git a/pkg/compiler/lib/src/kernel/kernel_world.dart b/pkg/compiler/lib/src/kernel/kernel_world.dart
index 14bbbff..7928607 100644
--- a/pkg/compiler/lib/src/kernel/kernel_world.dart
+++ b/pkg/compiler/lib/src/kernel/kernel_world.dart
@@ -22,51 +22,27 @@
import 'element_map_impl.dart';
-class KClosedWorldImpl implements KClosedWorld {
+/// The immutable result of the [ResolutionWorldBuilder].
+class KClosedWorld implements BuiltWorld {
final KernelToElementMapImpl elementMap;
-
- @override
final KElementEnvironment elementEnvironment;
-
- @override
final DartTypes dartTypes;
-
- @override
final KCommonElements commonElements;
-
- @override
final NativeData nativeData;
-
- @override
final InterceptorData interceptorData;
-
- @override
final BackendUsage backendUsage;
-
- @override
final NoSuchMethodData noSuchMethodData;
-
- @override
final Map<ClassEntity, Set<ClassEntity>> mixinUses;
-
- @override
final Map<ClassEntity, Set<ClassEntity>> typesImplementedBySubclasses;
// TODO(johnniwinther): Can this be derived from [ClassSet]s?
final Set<ClassEntity> _implementedClasses;
-
- @override
final Iterable<MemberEntity> liveInstanceMembers;
- @override
+ /// Members that are written either directly or through a setter selector.
final Iterable<MemberEntity> assignedInstanceMembers;
- @override
final KFieldAnalysis fieldAnalysis;
-
- @override
final Iterable<ClassEntity> liveNativeClasses;
-
- @override
final Map<MemberEntity, MemberUsage> liveMemberUsage;
@override
@@ -93,19 +69,23 @@
@override
final Set<Local> genericLocalFunctions;
- @override
+ /// Set of live closurized members whose signatures reference type variables.
+ ///
+ /// A closurized method is considered live if the enclosing class has been
+ /// instantiated.
final Set<FunctionEntity> closurizedMembersWithFreeTypeVariables;
- @override
+ /// Set of (live) local functions (closures).
+ ///
+ /// A live function is one whose enclosing member function has been enqueued.
final Iterable<Local> localFunctions;
@override
final Iterable<InterfaceType> instantiatedTypes;
- @override
RuntimeTypesNeed get rtiNeed => _rtiNeed;
- KClosedWorldImpl(this.elementMap,
+ KClosedWorld(this.elementMap,
{CompilerOptions options,
this.elementEnvironment,
this.dartTypes,
@@ -155,7 +135,7 @@
return true;
}
- @override
+ /// Returns `true` if [cls] is implemented by an instantiated class.
bool isImplemented(ClassEntity cls) {
return _implementedClasses.contains(cls);
}
@@ -175,7 +155,8 @@
dynamicTypeArgumentDependencies.forEach(f);
}
- @override
+ /// Returns `true` if [member] has been marked as used (called, read, etc.) in
+ /// this world builder.
bool isMemberUsed(MemberEntity member) => liveMemberUsage.containsKey(member);
@override
diff --git a/pkg/compiler/lib/src/universe/codegen_world_builder.dart b/pkg/compiler/lib/src/universe/codegen_world_builder.dart
index c41f8e3..1832cbc 100644
--- a/pkg/compiler/lib/src/universe/codegen_world_builder.dart
+++ b/pkg/compiler/lib/src/universe/codegen_world_builder.dart
@@ -28,7 +28,7 @@
/// World builder specific to codegen.
///
/// This adds additional access to liveness of selectors and elements.
-abstract class CodegenWorldBuilder implements WorldBuilder {
+abstract class CodegenWorldBuilder {
/// Register [constant] as needed for emission.
void addCompileTimeConstantForEmission(ConstantValue constant);
@@ -99,7 +99,7 @@
OneShotInterceptorData get oneShotInterceptorData;
}
-class CodegenWorldBuilderImpl extends WorldBuilderBase
+class CodegenWorldBuilderImpl extends WorldBuilder
implements CodegenWorldBuilder {
final JClosedWorld _closedWorld;
final OneShotInterceptorData _oneShotInterceptorData;
@@ -170,7 +170,6 @@
.where((cls) => _processedClasses[cls].isInstantiated);
// TODO(johnniwinther): Improve semantic precision.
- @override
Iterable<ClassEntity> get directlyInstantiatedClasses {
return _directlyInstantiatedClasses;
}
diff --git a/pkg/compiler/lib/src/universe/resolution_world_builder.dart b/pkg/compiler/lib/src/universe/resolution_world_builder.dart
index 3b3d0d37..2d04eae 100644
--- a/pkg/compiler/lib/src/universe/resolution_world_builder.dart
+++ b/pkg/compiler/lib/src/universe/resolution_world_builder.dart
@@ -23,7 +23,7 @@
import '../options.dart';
import '../util/enumset.dart';
import '../util/util.dart';
-import '../world.dart' show KClosedWorld, OpenWorld;
+import '../world.dart' show World;
import 'call_structure.dart';
import 'class_hierarchy.dart' show ClassHierarchyBuilder, ClassQueries;
import 'class_set.dart';
@@ -33,65 +33,6 @@
show ConstantUse, DynamicUse, DynamicUseKind, StaticUse, StaticUseKind;
import 'world_builder.dart';
-abstract class ResolutionWorldBuilder implements WorldBuilder, OpenWorld {
- /// The closed world computed by this world builder.
- ///
- /// This is only available after the world builder has been closed.
- KClosedWorld get closedWorldForTesting;
-
- void registerClass(ClassEntity cls);
-}
-
-/// Extended [ResolutionWorldBuilder] interface used by the
-/// [ResolutionEnqueuer].
-abstract class ResolutionEnqueuerWorldBuilder extends ResolutionWorldBuilder {
- /// Returns the classes registered as directly or indirectly instantiated.
- Iterable<ClassEntity> get processedClasses;
-
- /// Registers that [element] has been closurized.
- void registerClosurizedMember(MemberEntity element);
-
- /// Register [type] as (directly) instantiated.
- // TODO(johnniwinther): Fully enforce the separation between exact, through
- // subclass and through subtype instantiated types/classes.
- // TODO(johnniwinther): Support unknown type arguments for generic types.
- void registerTypeInstantiation(
- InterfaceType type, ClassUsedCallback classUsed,
- {ConstructorEntity constructor});
-
- /// Computes usage for all members declared by [cls]. Calls [membersUsed] with
- /// the usage changes for each member.
- ///
- /// If [checkEnqueuerConsistency] is `true` we check that no new member
- /// usage can be found. This check is performed without changing the already
- /// collected member usage.
- void processClassMembers(ClassEntity cls, MemberUsedCallback memberUsed,
- {bool checkEnqueuerConsistency = false});
-
- /// Applies the [dynamicUse] to applicable instance members. Calls
- /// [membersUsed] with the usage changes for each member.
- void registerDynamicUse(DynamicUse dynamicUse, MemberUsedCallback memberUsed);
-
- /// Applies the [staticUse] to applicable members. Calls [membersUsed] with
- /// the usage changes for each member.
- void registerStaticUse(StaticUse staticUse, MemberUsedCallback memberUsed);
-
- /// Register the constant [use] with this world builder. Returns `true` if
- /// the constant use was new to the world.
- bool registerConstantUse(ConstantUse use);
-
- bool isMemberProcessed(MemberEntity member);
- void registerProcessedMember(MemberEntity member);
- Iterable<MemberEntity> get processedMembers;
-
- /// Registers that [type] is checked in this world builder.
- void registerIsCheck(DartType type);
-
- void registerNamedTypeVariableNewRti(TypeVariableType typeVariable);
-
- void registerTypeVariableTypeLiteral(TypeVariableType typeVariable);
-}
-
/// The type and kind of an instantiation registered through
/// `ResolutionWorldBuilder.registerTypeInstantiation`.
class Instance {
@@ -248,9 +189,7 @@
}
}
-/// Implementation of [ResolutionEnqueuerWorldBuilder].
-class ResolutionWorldBuilderImpl extends WorldBuilderBase
- implements ResolutionEnqueuerWorldBuilder {
+class ResolutionWorldBuilder extends WorldBuilder implements World {
/// Instantiation information for all classes with instantiated types.
///
/// Invariant: Elements are declaration elements.
@@ -340,7 +279,7 @@
final KernelToElementMapImpl _elementMap;
- ResolutionWorldBuilderImpl(
+ ResolutionWorldBuilder(
this._options,
this._elementMap,
this._elementEnvironment,
@@ -359,23 +298,22 @@
this._classHierarchyBuilder,
this._classQueries);
- @override
+ /// Returns the classes registered as directly or indirectly instantiated.
Iterable<ClassEntity> get processedClasses => _processedClasses.keys
.where((cls) => _processedClasses[cls].isInstantiated);
- @override
bool isMemberProcessed(MemberEntity member) =>
_processedMembers.contains(member);
- @override
void registerProcessedMember(MemberEntity member) {
_processedMembers.add(member);
}
- @override
Iterable<MemberEntity> get processedMembers => _processedMembers;
- @override
+ /// The closed world computed by this world builder.
+ ///
+ /// This is only available after the world builder has been closed.
KClosedWorld get closedWorldForTesting {
if (!_closed) {
failedAt(
@@ -385,7 +323,6 @@
}
// TODO(johnniwinther): Improve semantic precision.
- @override
Iterable<ClassEntity> get directlyInstantiatedClasses {
Set<ClassEntity> classes = {};
getInstantiationMap().forEach((ClassEntity cls, InstantiationInfo info) {
@@ -396,7 +333,7 @@
return classes;
}
- @override
+ /// Registers that [element] has been closurized.
void registerClosurizedMember(MemberEntity element) {
FunctionType type = _elementEnvironment.getFunctionType(element);
if (type.containsTypeVariables) {
@@ -404,10 +341,10 @@
}
}
+ /// Register [type] as (directly) instantiated.
// TODO(johnniwinther): Fully enforce the separation between exact, through
// subclass and through subtype instantiated types/classes.
// TODO(johnniwinther): Support unknown type arguments for generic types.
- @override
void registerTypeInstantiation(
InterfaceType type, ClassUsedCallback classUsed,
{ConstructorEntity constructor}) {
@@ -495,7 +432,8 @@
return _hasMatchingSelector(_invokedSetters[member.name], member);
}
- @override
+ /// Applies the [dynamicUse] to applicable instance members. Calls
+ /// [membersUsed] with the usage changes for each member.
void registerDynamicUse(
DynamicUse dynamicUse, MemberUsedCallback memberUsed) {
Selector selector = dynamicUse.selector;
@@ -573,22 +511,23 @@
return constraints.addReceiverConstraint(constraint);
}
- @override
+ /// Registers that [type] is checked in this world builder.
void registerIsCheck(covariant DartType type) {
_isChecks.add(type);
}
- @override
void registerNamedTypeVariableNewRti(TypeVariableType type) {
_namedTypeVariablesNewRti.add(type);
}
- @override
+ /// Register the constant [use] with this world builder. Returns `true` if
+ /// the constant use was new to the world.
bool registerConstantUse(ConstantUse use) {
return _constantValues.add(use.value);
}
- @override
+ /// Applies the [staticUse] to applicable members. Calls [membersUsed] with
+ /// the usage changes for each member.
void registerStaticUse(StaticUse staticUse, MemberUsedCallback memberUsed) {
if (staticUse.kind == StaticUseKind.CLOSURE) {
Local localFunction = staticUse.element;
@@ -718,7 +657,12 @@
}
}
- @override
+ /// Computes usage for all members declared by [cls]. Calls [membersUsed] with
+ /// the usage changes for each member.
+ ///
+ /// If [checkEnqueuerConsistency] is `true` we check that no new member
+ /// usage can be found. This check is performed without changing the already
+ /// collected member usage.
void processClassMembers(ClassEntity cls, MemberUsedCallback memberUsed,
{bool checkEnqueuerConsistency = false}) {
_elementEnvironment.forEachClassMember(cls,
@@ -891,7 +835,6 @@
}
}
- @override
void registerUsedElement(MemberEntity element) {
if (element.isInstanceMember && !element.isAbstract) {
_liveInstanceMembers.add(element);
@@ -945,12 +888,23 @@
return assignedInstanceMembers;
}
- @override
void registerClass(ClassEntity cls) {
_classHierarchyBuilder.registerClass(cls);
}
- @override
+ /// Returns `true` if [member] is inherited into a subtype of [type].
+ ///
+ /// For instance:
+ ///
+ /// class A { m() {} }
+ /// class B extends A implements I {}
+ /// class C extends Object with A implements I {}
+ /// abstract class I { m(); }
+ /// abstract class J implements A { }
+ ///
+ /// Here `A.m` is inherited into `A`, `B`, and `C`. Because `B` and
+ /// `C` implement `I`, `isInheritedInSubtypeOf(A.m, I)` is true, but
+ /// `isInheritedInSubtypeOf(A.m, J)` is false.
bool isInheritedIn(
MemberEntity member, ClassEntity type, ClassRelation relation) {
// TODO(johnniwinther): Use the [member] itself to avoid enqueueing members
@@ -979,7 +933,6 @@
throw UnsupportedError("Unexpected ClassRelation $relation.");
}
- @override
KClosedWorld closeWorld(DiagnosticReporter reporter) {
Map<ClassEntity, Set<ClassEntity>> typesImplementedBySubclasses =
populateHierarchyNodes();
@@ -1014,7 +967,7 @@
}
});
- KClosedWorld closedWorld = KClosedWorldImpl(_elementMap,
+ KClosedWorld closedWorld = KClosedWorld(_elementMap,
options: _options,
elementEnvironment: _elementEnvironment,
dartTypes: _dartTypes,
diff --git a/pkg/compiler/lib/src/universe/world_builder.dart b/pkg/compiler/lib/src/universe/world_builder.dart
index 9470571..d75a9e2 100644
--- a/pkg/compiler/lib/src/universe/world_builder.dart
+++ b/pkg/compiler/lib/src/universe/world_builder.dart
@@ -10,7 +10,8 @@
import '../elements/types.dart';
import '../ir/static_type.dart';
import '../js_backend/native_data.dart' show NativeBasicData;
-import '../world.dart' show World, JClosedWorld, OpenWorld;
+import '../universe/resolution_world_builder.dart' show ResolutionWorldBuilder;
+import '../world.dart' show World;
import 'selector.dart' show Selector;
import 'use.dart' show DynamicUse, StaticUse;
@@ -99,8 +100,8 @@
}
@override
- bool appliedUnnamed(
- DynamicUse dynamicUse, MemberEntity member, covariant OpenWorld world) {
+ bool appliedUnnamed(DynamicUse dynamicUse, MemberEntity member,
+ covariant ResolutionWorldBuilder world) {
Selector selector = dynamicUse.selector;
StrongModeConstraint constraint = dynamicUse.receiverConstraint;
return selector.appliesUnnamed(member) &&
@@ -184,7 +185,7 @@
bool needsNoSuchMethodHandling(Selector selector, World world) => true;
- bool canHit(MemberEntity element, Name name, OpenWorld world) {
+ bool canHit(MemberEntity element, Name name, ResolutionWorldBuilder world) {
return world.isInheritedIn(element, cls, relation);
}
@@ -207,19 +208,7 @@
String toString() => 'StrongModeConstraint($cls,$relation)';
}
-/// The [WorldBuilder] is an auxiliary class used in the process of computing
-/// the [JClosedWorld].
-// TODO(johnniwinther): Move common implementation to a [WorldBuilderBase] when
-// universes and worlds have been unified.
abstract class WorldBuilder {
- /// All directly instantiated classes, that is, classes with a generative
- /// constructor that has been called directly and not only through a
- /// super-call.
- // TODO(johnniwinther): Improve semantic precision.
- Iterable<ClassEntity> get directlyInstantiatedClasses;
-}
-
-abstract class WorldBuilderBase {
final Map<Entity, Set<DartType>> staticTypeArgumentDependencies = {};
final Map<Selector, Set<DartType>> dynamicTypeArgumentDependencies = {};
diff --git a/pkg/compiler/lib/src/world.dart b/pkg/compiler/lib/src/world.dart
index b5c4d4f..7a77d72 100644
--- a/pkg/compiler/lib/src/world.dart
+++ b/pkg/compiler/lib/src/world.dart
@@ -5,21 +5,14 @@
library dart2js.world;
import 'closure.dart';
-import 'common.dart';
-import 'common/elements.dart'
- show
- JCommonElements,
- JElementEnvironment,
- KCommonElements,
- KElementEnvironment;
+import 'common/elements.dart' show JCommonElements, JElementEnvironment;
import 'deferred_load/output_unit.dart';
import 'elements/entities.dart';
import 'elements/names.dart';
import 'elements/types.dart';
import 'inferrer/abstract_value_domain.dart';
-import 'ir/static_type.dart';
import 'js_backend/annotations.dart';
-import 'js_backend/field_analysis.dart' show JFieldAnalysis, KFieldAnalysis;
+import 'js_backend/field_analysis.dart' show JFieldAnalysis;
import 'js_backend/backend_usage.dart' show BackendUsage;
import 'js_backend/interceptor_data.dart' show InterceptorData;
import 'js_backend/native_data.dart' show NativeData;
@@ -224,28 +217,6 @@
void registerExtractTypeArguments(ClassEntity interface);
}
-abstract class OpenWorld implements World {
- void registerUsedElement(MemberEntity element);
-
- KClosedWorld closeWorld(DiagnosticReporter reporter);
-
- /// Returns `true` if [member] is inherited into a subtype of [type].
- ///
- /// For instance:
- ///
- /// class A { m() {} }
- /// class B extends A implements I {}
- /// class C extends Object with A implements I {}
- /// abstract class I { m(); }
- /// abstract class J implements A { }
- ///
- /// Here `A.m` is inherited into `A`, `B`, and `C`. Because `B` and
- /// `C` implement `I`, `isInheritedInSubtypeOf(A.m, I)` is true, but
- /// `isInheritedInSubtypeOf(A.m, J)` is false.
- bool isInheritedIn(
- MemberEntity member, ClassEntity type, ClassRelation relation);
-}
-
/// A [BuiltWorld] is an immutable result of a [WorldBuilder].
abstract class BuiltWorld {
ClassHierarchy get classHierarchy;
@@ -298,52 +269,3 @@
void forEachDynamicTypeArgument(
void f(Selector selector, Set<DartType> typeArguments));
}
-
-// TODO(johnniwinther): Rename this to `ResolutionWorld` or `KWorld`?
-// The immutable result of the [ResolutionWorldBuilder].
-abstract class KClosedWorld implements BuiltWorld {
- DartTypes get dartTypes;
- KFieldAnalysis get fieldAnalysis;
- BackendUsage get backendUsage;
- NativeData get nativeData;
- InterceptorData get interceptorData;
- KElementEnvironment get elementEnvironment;
- KCommonElements get commonElements;
-
- @override
- ClassHierarchy get classHierarchy;
-
- /// Returns `true` if [cls] is implemented by an instantiated class.
- bool isImplemented(ClassEntity cls);
-
- Iterable<MemberEntity> get liveInstanceMembers;
- Map<ClassEntity, Set<ClassEntity>> get mixinUses;
- Map<ClassEntity, Set<ClassEntity>> get typesImplementedBySubclasses;
-
- /// Members that are written either directly or through a setter selector.
- Iterable<MemberEntity> get assignedInstanceMembers;
-
- Iterable<ClassEntity> get liveNativeClasses;
- Map<MemberEntity, MemberUsage> get liveMemberUsage;
- RuntimeTypesNeed get rtiNeed;
- NoSuchMethodData get noSuchMethodData;
-
- @override
- AnnotationsData get annotationsData;
-
- /// Set of live closurized members whose signatures reference type variables.
- ///
- /// A closurized method is considered live if the enclosing class has been
- /// instantiated.
- Iterable<FunctionEntity> get closurizedMembersWithFreeTypeVariables;
-
- /// Set of (live) local functions (closures).
- ///
- /// A live function is one whose enclosing member function has been enqueued.
- Iterable<Local> get localFunctions;
-
- /// Returns `true` if [member] has been marked as used (called, read, etc.) in
- /// this world builder.
- // TODO(johnniwinther): Maybe this should be part of [ClosedWorld] (instead).
- bool isMemberUsed(MemberEntity member);
-}
diff --git a/pkg/compiler/test/helpers/type_test_helper.dart b/pkg/compiler/test/helpers/type_test_helper.dart
index 5fdd343..570e368 100644
--- a/pkg/compiler/test/helpers/type_test_helper.dart
+++ b/pkg/compiler/test/helpers/type_test_helper.dart
@@ -15,8 +15,9 @@
import 'package:compiler/src/elements/entities.dart';
import 'package:compiler/src/kernel/kelements.dart';
import 'package:compiler/src/kernel/kernel_strategy.dart';
+import 'package:compiler/src/kernel/kernel_world.dart';
import 'package:compiler/src/options.dart';
-import 'package:compiler/src/world.dart' show JClosedWorld, KClosedWorld;
+import 'package:compiler/src/world.dart' show JClosedWorld;
import 'memory_compiler.dart' as memory;
extension DartTypeHelpers on DartType {
diff --git a/pkg/compiler/test/inlining/meta_annotations_test.dart b/pkg/compiler/test/inlining/meta_annotations_test.dart
index 0551ccb..e13070d 100644
--- a/pkg/compiler/test/inlining/meta_annotations_test.dart
+++ b/pkg/compiler/test/inlining/meta_annotations_test.dart
@@ -9,7 +9,7 @@
import 'package:compiler/src/common/elements.dart';
import 'package:compiler/src/compiler.dart';
import 'package:compiler/src/elements/entities.dart';
-import 'package:compiler/src/world.dart' show KClosedWorld;
+import 'package:compiler/src/kernel/kernel_world.dart';
import '../helpers/memory_compiler.dart';
const Map<String, String> MEMORY_SOURCE_FILES = const {
diff --git a/pkg/compiler/test/member_usage/member_usage_test.dart b/pkg/compiler/test/member_usage/member_usage_test.dart
index ff367d6..0134f01 100644
--- a/pkg/compiler/test/member_usage/member_usage_test.dart
+++ b/pkg/compiler/test/member_usage/member_usage_test.dart
@@ -81,7 +81,7 @@
Map<Id, ActualData<Features>> actualMap,
{bool verbose: false}) {
KernelFrontendStrategy frontendStrategy = compiler.frontendStrategy;
- ResolutionWorldBuilderImpl resolutionWorldBuilder =
+ ResolutionWorldBuilder resolutionWorldBuilder =
compiler.resolutionWorldBuilderForTesting;
ir.Member node = frontendStrategy.elementMap.getMemberNode(member);
Features features = new Features();
diff --git a/pkg/compiler/test/model/class_set_test.dart b/pkg/compiler/test/model/class_set_test.dart
index fd8526e..31e538e 100644
--- a/pkg/compiler/test/model/class_set_test.dart
+++ b/pkg/compiler/test/model/class_set_test.dart
@@ -11,6 +11,7 @@
import 'package:expect/expect.dart';
import 'package:async_helper/async_helper.dart';
import 'package:compiler/src/elements/entities.dart' show ClassEntity;
+import 'package:compiler/src/kernel/kernel_world.dart';
import 'package:compiler/src/universe/class_set.dart';
import 'package:compiler/src/util/enumset.dart';
import 'package:compiler/src/world.dart';
diff --git a/pkg/compiler/test/model/open_world_test.dart b/pkg/compiler/test/model/open_world_test.dart
index e694730..d098a5d 100644
--- a/pkg/compiler/test/model/open_world_test.dart
+++ b/pkg/compiler/test/model/open_world_test.dart
@@ -52,7 +52,7 @@
CommonElements commonElements;
NativeBasicData nativeBasicData;
- ResolutionWorldBuilderImpl world;
+ ResolutionWorldBuilder world;
List<ClassEntity> allClasses;
diff --git a/pkg/compiler/test/model/strong_mode_closed_world_test.dart b/pkg/compiler/test/model/strong_mode_closed_world_test.dart
index 76d847e..2b66300 100644
--- a/pkg/compiler/test/model/strong_mode_closed_world_test.dart
+++ b/pkg/compiler/test/model/strong_mode_closed_world_test.dart
@@ -9,7 +9,7 @@
import 'package:compiler/src/compiler.dart';
import 'package:compiler/src/common/elements.dart';
import 'package:compiler/src/elements/entities.dart';
-import 'package:compiler/src/world.dart';
+import 'package:compiler/src/kernel/kernel_world.dart';
import '../helpers/memory_compiler.dart';
main() {
diff --git a/pkg/compiler/test/model/strong_mode_impact_test.dart b/pkg/compiler/test/model/strong_mode_impact_test.dart
index fc045cc..558f0af 100644
--- a/pkg/compiler/test/model/strong_mode_impact_test.dart
+++ b/pkg/compiler/test/model/strong_mode_impact_test.dart
@@ -12,7 +12,7 @@
import 'package:compiler/src/common/elements.dart';
import 'package:compiler/src/elements/entities.dart';
import 'package:compiler/src/elements/types.dart';
-import 'package:compiler/src/world.dart';
+import 'package:compiler/src/kernel/kernel_world.dart';
import 'package:compiler/src/universe/use.dart';
import 'package:compiler/src/universe/world_impact.dart';
import '../helpers/memory_compiler.dart';
diff --git a/pkg/compiler/test/model/subtypeset_test.dart b/pkg/compiler/test/model/subtypeset_test.dart
index f16f4c9..dca3abe 100644
--- a/pkg/compiler/test/model/subtypeset_test.dart
+++ b/pkg/compiler/test/model/subtypeset_test.dart
@@ -11,8 +11,8 @@
import 'package:expect/expect.dart';
import 'package:async_helper/async_helper.dart';
import 'package:compiler/src/elements/entities.dart';
+import 'package:compiler/src/kernel/kernel_world.dart';
import 'package:compiler/src/universe/class_set.dart';
-import 'package:compiler/src/world.dart';
import '../helpers/type_test_helper.dart';
void main() {