mirror of
https://github.com/dart-lang/sdk
synced 2024-10-14 10:18:13 +00:00
Make resolution/codegen_world_builder into libraries
Change-Id: Ic8c00b2b3cf13a21e165486c1c825df75edd7d7b Reviewed-on: https://dart-review.googlesource.com/c/84021 Commit-Queue: Johnni Winther <johnniwinther@google.com> Commit-Queue: Sigmund Cherem <sigmund@google.com> Auto-Submit: Johnni Winther <johnniwinther@google.com> Reviewed-by: Sigmund Cherem <sigmund@google.com>
This commit is contained in:
parent
b484aada21
commit
d062a41404
|
@ -15,6 +15,7 @@ import 'js_backend/js_backend.dart';
|
|||
import 'js_backend/native_data.dart';
|
||||
import 'ssa/ssa.dart';
|
||||
import 'types/types.dart';
|
||||
import 'universe/codegen_world_builder.dart';
|
||||
import 'universe/world_builder.dart';
|
||||
import 'world.dart';
|
||||
|
||||
|
|
|
@ -42,8 +42,8 @@ import 'types/abstract_value_domain.dart' show AbstractValueStrategy;
|
|||
import 'types/types.dart'
|
||||
show GlobalTypeInferenceResults, GlobalTypeInferenceTask;
|
||||
import 'universe/selector.dart' show Selector;
|
||||
import 'universe/world_builder.dart'
|
||||
show ResolutionWorldBuilder, CodegenWorldBuilder;
|
||||
import 'universe/codegen_world_builder.dart';
|
||||
import 'universe/resolution_world_builder.dart';
|
||||
import 'universe/world_impact.dart'
|
||||
show ImpactStrategy, WorldImpact, WorldImpactBuilderImpl;
|
||||
import 'world.dart' show JClosedWorld, KClosedWorld;
|
||||
|
|
|
@ -23,7 +23,7 @@ import 'js_backend/js_backend.dart' show JavaScriptBackend;
|
|||
import 'types/abstract_value_domain.dart';
|
||||
import 'types/types.dart'
|
||||
show GlobalTypeInferenceMemberResult, GlobalTypeInferenceResults;
|
||||
import 'universe/world_builder.dart' show CodegenWorldBuilder;
|
||||
import 'universe/codegen_world_builder.dart';
|
||||
import 'universe/world_impact.dart'
|
||||
show ImpactUseCase, WorldImpact, WorldImpactVisitorImpl;
|
||||
import 'world.dart' show JClosedWorld;
|
||||
|
|
|
@ -17,6 +17,8 @@ import 'elements/entities.dart';
|
|||
import 'elements/types.dart';
|
||||
import 'js_backend/enqueuer.dart';
|
||||
import 'types/types.dart';
|
||||
import 'universe/member_usage.dart';
|
||||
import 'universe/resolution_world_builder.dart';
|
||||
import 'universe/world_builder.dart';
|
||||
import 'universe/use.dart'
|
||||
show
|
||||
|
|
|
@ -22,6 +22,7 @@ import 'library_loader.dart';
|
|||
import 'native/enqueue.dart' show NativeResolutionEnqueuer;
|
||||
import 'native/resolver.dart';
|
||||
import 'universe/class_hierarchy.dart';
|
||||
import 'universe/resolution_world_builder.dart';
|
||||
import 'universe/world_builder.dart';
|
||||
import 'universe/world_impact.dart';
|
||||
|
||||
|
|
|
@ -34,6 +34,7 @@ import '../types/types.dart';
|
|||
import '../universe/call_structure.dart' show CallStructure;
|
||||
import '../universe/class_hierarchy.dart'
|
||||
show ClassHierarchyBuilder, ClassQueries;
|
||||
import '../universe/codegen_world_builder.dart';
|
||||
import '../universe/selector.dart' show Selector;
|
||||
import '../universe/use.dart' show StaticUse;
|
||||
import '../universe/world_builder.dart';
|
||||
|
|
|
@ -12,7 +12,7 @@ import '../js/js.dart' as jsAst;
|
|||
import '../js/js.dart' show js;
|
||||
import '../js_emitter/code_emitter_task.dart';
|
||||
import '../options.dart';
|
||||
import '../universe/world_builder.dart';
|
||||
import '../universe/codegen_world_builder.dart';
|
||||
import 'allocator_analysis.dart' show JAllocatorAnalysis;
|
||||
import 'constant_system_javascript.dart';
|
||||
import 'js_backend.dart';
|
||||
|
|
|
@ -14,7 +14,8 @@ import '../elements/entities.dart';
|
|||
import '../elements/types.dart';
|
||||
import '../enqueue.dart';
|
||||
import '../options.dart';
|
||||
import '../universe/world_builder.dart';
|
||||
import '../universe/codegen_world_builder.dart';
|
||||
import '../universe/member_usage.dart';
|
||||
import '../universe/use.dart'
|
||||
show
|
||||
ConstantUse,
|
||||
|
|
|
@ -9,8 +9,8 @@ import '../elements/types.dart';
|
|||
import '../js/js.dart' as jsAst;
|
||||
import '../js/js.dart' show js;
|
||||
import '../universe/selector.dart' show Selector;
|
||||
import '../universe/world_builder.dart'
|
||||
show CodegenWorldBuilder, SelectorConstraints;
|
||||
import '../universe/codegen_world_builder.dart';
|
||||
import '../universe/world_builder.dart' show SelectorConstraints;
|
||||
import 'namer.dart';
|
||||
import 'native_data.dart';
|
||||
|
||||
|
|
|
@ -26,8 +26,8 @@ import '../js/js.dart' as jsAst;
|
|||
import '../js_model/closure.dart';
|
||||
import '../js_model/elements.dart' show JGeneratorBody;
|
||||
import '../universe/call_structure.dart' show CallStructure;
|
||||
import '../universe/codegen_world_builder.dart';
|
||||
import '../universe/selector.dart' show Selector, SelectorKind;
|
||||
import '../universe/world_builder.dart' show CodegenWorldBuilder;
|
||||
import '../util/util.dart';
|
||||
import '../world.dart' show JClosedWorld;
|
||||
import 'backend.dart';
|
||||
|
|
|
@ -21,7 +21,9 @@ import '../js_emitter/js_emitter.dart' show Emitter;
|
|||
import '../options.dart';
|
||||
import '../serialization/serialization.dart';
|
||||
import '../universe/class_hierarchy.dart';
|
||||
import '../universe/codegen_world_builder.dart';
|
||||
import '../universe/feature.dart';
|
||||
import '../universe/resolution_world_builder.dart';
|
||||
import '../universe/selector.dart';
|
||||
import '../universe/world_builder.dart';
|
||||
import '../world.dart' show JClosedWorld, KClosedWorld;
|
||||
|
|
|
@ -12,9 +12,9 @@ import '../js/js.dart' show js;
|
|||
import '../js_backend/namer.dart' show Namer;
|
||||
import '../js_backend/interceptor_data.dart' show InterceptorData;
|
||||
import '../options.dart';
|
||||
import '../universe/codegen_world_builder.dart';
|
||||
import '../universe/selector.dart' show Selector;
|
||||
import '../universe/world_builder.dart'
|
||||
show CodegenWorldBuilder, SelectorConstraints;
|
||||
import '../universe/world_builder.dart' show SelectorConstraints;
|
||||
import '../world.dart' show JClosedWorld;
|
||||
|
||||
import 'code_emitter_task.dart';
|
||||
|
|
|
@ -15,7 +15,7 @@ import '../elements/entities.dart';
|
|||
import '../js/js.dart' as jsAst;
|
||||
import '../js_backend/js_backend.dart' show JavaScriptBackend, Namer;
|
||||
import '../js_backend/inferred_data.dart';
|
||||
import '../universe/world_builder.dart' show CodegenWorldBuilder;
|
||||
import '../universe/codegen_world_builder.dart';
|
||||
import '../world.dart' show JClosedWorld;
|
||||
import 'full_emitter/emitter.dart' as full_js_emitter;
|
||||
import 'program_builder/program_builder.dart';
|
||||
|
|
|
@ -29,7 +29,7 @@ import '../../js_backend/js_backend.dart'
|
|||
import '../../js_backend/native_data.dart';
|
||||
import '../../js_backend/js_interop_analysis.dart' as jsInteropAnalysis;
|
||||
import '../../universe/call_structure.dart' show CallStructure;
|
||||
import '../../universe/world_builder.dart' show CodegenWorldBuilder;
|
||||
import '../../universe/codegen_world_builder.dart';
|
||||
import '../../util/uri_extras.dart' show relativize;
|
||||
import '../../world.dart' show JClosedWorld;
|
||||
import '../constant_ordering.dart' show ConstantOrdering;
|
||||
|
|
|
@ -12,9 +12,9 @@ import '../js/js.dart' as jsAst;
|
|||
import '../js/js.dart' show js;
|
||||
import '../js_backend/namer.dart' show Namer;
|
||||
import '../universe/call_structure.dart' show CallStructure;
|
||||
import '../universe/codegen_world_builder.dart';
|
||||
import '../universe/selector.dart' show Selector;
|
||||
import '../universe/world_builder.dart'
|
||||
show CodegenWorldBuilder, SelectorConstraints;
|
||||
import '../universe/world_builder.dart' show SelectorConstraints;
|
||||
import '../world.dart' show JClosedWorld;
|
||||
|
||||
import 'model.dart';
|
||||
|
|
|
@ -19,8 +19,8 @@ import '../js_backend/native_data.dart';
|
|||
import '../js_backend/interceptor_data.dart';
|
||||
import '../native/enqueue.dart';
|
||||
import '../options.dart';
|
||||
import '../universe/codegen_world_builder.dart';
|
||||
import '../universe/selector.dart' show Selector;
|
||||
import '../universe/world_builder.dart' show CodegenWorldBuilder;
|
||||
import '../world.dart' show JClosedWorld;
|
||||
|
||||
import 'code_emitter_task.dart' show CodeEmitterTask, Emitter;
|
||||
|
|
|
@ -17,7 +17,7 @@ import '../js/js.dart' as jsAst;
|
|||
import '../js/js.dart' show js;
|
||||
import '../js_backend/runtime_types.dart' show RuntimeTypesEncoder;
|
||||
import '../options.dart';
|
||||
import '../universe/world_builder.dart' show CodegenWorldBuilder;
|
||||
import '../universe/codegen_world_builder.dart';
|
||||
|
||||
import 'code_emitter_task.dart' show Emitter;
|
||||
|
||||
|
|
|
@ -13,7 +13,7 @@ import '../js/js.dart' show js;
|
|||
import '../js_backend/interceptor_data.dart';
|
||||
import '../js_backend/native_data.dart';
|
||||
import '../native/enqueue.dart' show NativeCodegenEnqueuer;
|
||||
import '../universe/world_builder.dart' show CodegenWorldBuilder;
|
||||
import '../universe/codegen_world_builder.dart';
|
||||
import '../world.dart' show JClosedWorld;
|
||||
|
||||
import 'code_emitter_task.dart' show CodeEmitterTask;
|
||||
|
|
|
@ -15,9 +15,9 @@ import '../js_backend/native_data.dart';
|
|||
import '../js_backend/interceptor_data.dart';
|
||||
import '../js_backend/runtime_types.dart';
|
||||
import '../universe/call_structure.dart' show CallStructure;
|
||||
import '../universe/codegen_world_builder.dart';
|
||||
import '../universe/selector.dart' show Selector;
|
||||
import '../universe/world_builder.dart'
|
||||
show CodegenWorldBuilder, SelectorConstraints;
|
||||
import '../universe/world_builder.dart' show SelectorConstraints;
|
||||
import '../world.dart' show JClosedWorld;
|
||||
|
||||
import 'model.dart';
|
||||
|
|
|
@ -33,9 +33,9 @@ import '../../js_backend/runtime_types.dart'
|
|||
import '../../js_model/elements.dart' show JGeneratorBody, JSignatureMethod;
|
||||
import '../../native/enqueue.dart' show NativeCodegenEnqueuer;
|
||||
import '../../options.dart';
|
||||
import '../../universe/codegen_world_builder.dart';
|
||||
import '../../universe/selector.dart' show Selector;
|
||||
import '../../universe/world_builder.dart'
|
||||
show CodegenWorldBuilder, SelectorConstraints;
|
||||
import '../../universe/world_builder.dart' show SelectorConstraints;
|
||||
import '../../world.dart' show JClosedWorld;
|
||||
import '../js_emitter.dart'
|
||||
show
|
||||
|
|
|
@ -13,7 +13,7 @@ import '../js_backend/runtime_types.dart'
|
|||
RuntimeTypesChecksBuilder,
|
||||
RuntimeTypesSubstitutions;
|
||||
import '../options.dart';
|
||||
import '../universe/world_builder.dart';
|
||||
import '../universe/codegen_world_builder.dart';
|
||||
|
||||
class TypeTestRegistry {
|
||||
final ElementEnvironment _elementEnvironment;
|
||||
|
|
|
@ -47,7 +47,6 @@ import '../serialization/serialization.dart';
|
|||
import '../ssa/type_builder.dart';
|
||||
import '../universe/call_structure.dart';
|
||||
import '../universe/selector.dart';
|
||||
import '../universe/world_builder.dart';
|
||||
|
||||
import 'closure.dart';
|
||||
import 'elements.dart';
|
||||
|
|
|
@ -31,6 +31,7 @@ import '../ssa/ssa.dart';
|
|||
import '../ssa/types.dart';
|
||||
import '../types/abstract_value_domain.dart';
|
||||
import '../types/types.dart';
|
||||
import '../universe/codegen_world_builder.dart';
|
||||
import '../universe/selector.dart';
|
||||
import '../universe/world_builder.dart';
|
||||
import '../universe/world_impact.dart';
|
||||
|
|
|
@ -29,6 +29,7 @@ import '../native/enqueue.dart' show NativeResolutionEnqueuer;
|
|||
import '../native/resolver.dart';
|
||||
import '../options.dart';
|
||||
import '../universe/class_hierarchy.dart';
|
||||
import '../universe/resolution_world_builder.dart';
|
||||
import '../universe/world_builder.dart';
|
||||
import '../universe/world_impact.dart';
|
||||
import 'deferred_load.dart';
|
||||
|
|
|
@ -17,7 +17,7 @@ import '../js_backend/runtime_types.dart';
|
|||
import '../options.dart';
|
||||
import '../universe/class_hierarchy.dart';
|
||||
import '../universe/class_set.dart';
|
||||
import '../universe/world_builder.dart';
|
||||
import '../universe/resolution_world_builder.dart';
|
||||
import '../world.dart';
|
||||
|
||||
import 'element_map_impl.dart';
|
||||
|
|
|
@ -36,12 +36,12 @@ import '../native/native.dart' as native;
|
|||
import '../types/abstract_value_domain.dart';
|
||||
import '../types/types.dart';
|
||||
import '../universe/call_structure.dart';
|
||||
import '../universe/codegen_world_builder.dart';
|
||||
import '../universe/feature.dart';
|
||||
import '../universe/selector.dart';
|
||||
import '../universe/side_effects.dart' show SideEffects;
|
||||
import '../universe/target_checks.dart' show TargetChecks;
|
||||
import '../universe/use.dart' show ConstantUse, StaticUse;
|
||||
import '../universe/world_builder.dart' show CodegenWorldBuilder;
|
||||
import '../world.dart';
|
||||
import 'graph_builder.dart';
|
||||
import 'jump_handler.dart';
|
||||
|
|
|
@ -2,7 +2,30 @@
|
|||
// 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.
|
||||
|
||||
part of world_builder;
|
||||
import 'dart:collection';
|
||||
|
||||
import '../common/names.dart' show Identifiers;
|
||||
import '../common_elements.dart';
|
||||
import '../constants/values.dart';
|
||||
import '../elements/entities.dart';
|
||||
import '../elements/types.dart';
|
||||
import '../js_backend/native_data.dart' show NativeBasicData;
|
||||
import '../js_model/locals.dart';
|
||||
import '../js_model/element_map_impl.dart';
|
||||
import '../util/enumset.dart';
|
||||
import '../util/util.dart';
|
||||
import '../world.dart' show JClosedWorld;
|
||||
import 'member_usage.dart';
|
||||
import 'selector.dart' show Selector;
|
||||
import 'use.dart'
|
||||
show
|
||||
ConstantUse,
|
||||
ConstantUseKind,
|
||||
DynamicUse,
|
||||
DynamicUseKind,
|
||||
StaticUse,
|
||||
StaticUseKind;
|
||||
import 'world_builder.dart';
|
||||
|
||||
/// World builder specific to codegen.
|
||||
///
|
||||
|
@ -131,34 +154,34 @@ class CodegenWorldBuilderImpl extends WorldBuilderBase
|
|||
final Map<String, Map<Selector, SelectorConstraints>> _invokedSetters =
|
||||
<String, Map<Selector, SelectorConstraints>>{};
|
||||
|
||||
final Map<ClassEntity, _ClassUsage> _processedClasses =
|
||||
<ClassEntity, _ClassUsage>{};
|
||||
final Map<ClassEntity, ClassUsage> _processedClasses =
|
||||
<ClassEntity, ClassUsage>{};
|
||||
|
||||
Map<ClassEntity, _ClassUsage> get classUsageForTesting => _processedClasses;
|
||||
Map<ClassEntity, ClassUsage> get classUsageForTesting => _processedClasses;
|
||||
|
||||
/// Map of registered usage of static members of live classes.
|
||||
final Map<Entity, _StaticMemberUsage> _staticMemberUsage =
|
||||
<Entity, _StaticMemberUsage>{};
|
||||
final Map<Entity, StaticMemberUsage> _staticMemberUsage =
|
||||
<Entity, StaticMemberUsage>{};
|
||||
|
||||
Map<Entity, _StaticMemberUsage> get staticMemberUsageForTesting =>
|
||||
Map<Entity, StaticMemberUsage> get staticMemberUsageForTesting =>
|
||||
_staticMemberUsage;
|
||||
|
||||
/// Map of registered usage of instance members of live classes.
|
||||
final Map<MemberEntity, _MemberUsage> _instanceMemberUsage =
|
||||
<MemberEntity, _MemberUsage>{};
|
||||
final Map<MemberEntity, MemberUsage> _instanceMemberUsage =
|
||||
<MemberEntity, MemberUsage>{};
|
||||
|
||||
Map<MemberEntity, _MemberUsage> get instanceMemberUsageForTesting =>
|
||||
Map<MemberEntity, MemberUsage> get instanceMemberUsageForTesting =>
|
||||
_instanceMemberUsage;
|
||||
|
||||
/// Map containing instance members of live classes that are not yet live
|
||||
/// themselves.
|
||||
final Map<String, Set<_MemberUsage>> _instanceMembersByName =
|
||||
<String, Set<_MemberUsage>>{};
|
||||
final Map<String, Set<MemberUsage>> _instanceMembersByName =
|
||||
<String, Set<MemberUsage>>{};
|
||||
|
||||
/// Map containing instance methods of live classes that are not yet
|
||||
/// closurized.
|
||||
final Map<String, Set<_MemberUsage>> _instanceFunctionsByName =
|
||||
<String, Set<_MemberUsage>>{};
|
||||
final Map<String, Set<MemberUsage>> _instanceFunctionsByName =
|
||||
<String, Set<MemberUsage>>{};
|
||||
|
||||
final Set<DartType> isChecks = new Set<DartType>();
|
||||
|
||||
|
@ -263,9 +286,9 @@ class CodegenWorldBuilderImpl extends WorldBuilderBase
|
|||
Selector selector = dynamicUse.selector;
|
||||
String methodName = selector.name;
|
||||
|
||||
void _process(Map<String, Set<_MemberUsage>> memberMap,
|
||||
EnumSet<MemberUse> action(_MemberUsage usage)) {
|
||||
_processSet(memberMap, methodName, (_MemberUsage usage) {
|
||||
void _process(Map<String, Set<MemberUsage>> memberMap,
|
||||
EnumSet<MemberUse> action(MemberUsage usage)) {
|
||||
_processSet(memberMap, methodName, (MemberUsage usage) {
|
||||
if (selectorConstraintsStrategy.appliedUnnamed(
|
||||
dynamicUse, usage.entity, _world)) {
|
||||
memberUsed(usage.entity, action(usage));
|
||||
|
@ -387,13 +410,13 @@ class CodegenWorldBuilderImpl extends WorldBuilderBase
|
|||
void registerStaticUse(StaticUse staticUse, MemberUsedCallback memberUsed) {
|
||||
Entity element = staticUse.element;
|
||||
_registerStaticUse(staticUse);
|
||||
_StaticMemberUsage usage = _staticMemberUsage.putIfAbsent(element, () {
|
||||
StaticMemberUsage usage = _staticMemberUsage.putIfAbsent(element, () {
|
||||
if (element is MemberEntity &&
|
||||
(element.isStatic || element.isTopLevel) &&
|
||||
element.isFunction) {
|
||||
return new _StaticFunctionUsage(element);
|
||||
return new StaticFunctionUsage(element);
|
||||
} else {
|
||||
return new _GeneralStaticMemberUsage(element);
|
||||
return new GeneralStaticMemberUsage(element);
|
||||
}
|
||||
});
|
||||
EnumSet<MemberUse> useSet = new EnumSet<MemberUse>();
|
||||
|
@ -431,7 +454,7 @@ class CodegenWorldBuilderImpl extends WorldBuilderBase
|
|||
break;
|
||||
case StaticUseKind.DIRECT_INVOKE:
|
||||
MemberEntity member = staticUse.element;
|
||||
_MemberUsage instanceUsage = _getMemberUsage(member, memberUsed);
|
||||
MemberUsage instanceUsage = _getMemberUsage(member, memberUsed);
|
||||
memberUsed(instanceUsage.entity, instanceUsage.invoke());
|
||||
_instanceMembersByName[instanceUsage.entity.name]
|
||||
?.remove(instanceUsage);
|
||||
|
@ -469,7 +492,7 @@ class CodegenWorldBuilderImpl extends WorldBuilderBase
|
|||
_getMemberUsage(member, memberUsed);
|
||||
}
|
||||
|
||||
_MemberUsage _getMemberUsage(
|
||||
MemberUsage _getMemberUsage(
|
||||
covariant MemberEntity member, MemberUsedCallback memberUsed) {
|
||||
// TODO(johnniwinther): Change [TypeMask] to not apply to a superclass
|
||||
// member unless the class has been instantiated. Similar to
|
||||
|
@ -478,7 +501,7 @@ class CodegenWorldBuilderImpl extends WorldBuilderBase
|
|||
String memberName = member.name;
|
||||
ClassEntity cls = member.enclosingClass;
|
||||
bool isNative = _nativeBasicData.isNativeClass(cls);
|
||||
_MemberUsage usage = new _MemberUsage(member, isNative: isNative);
|
||||
MemberUsage usage = new MemberUsage(member, isNative: isNative);
|
||||
EnumSet<MemberUse> useSet = new EnumSet<MemberUse>();
|
||||
useSet.addAll(usage.appliedUse);
|
||||
if (!usage.hasRead && hasInvokedGetter(member, _world)) {
|
||||
|
@ -495,14 +518,14 @@ class CodegenWorldBuilderImpl extends WorldBuilderBase
|
|||
// Store the member in [instanceFunctionsByName] to catch
|
||||
// getters on the function.
|
||||
_instanceFunctionsByName
|
||||
.putIfAbsent(usage.entity.name, () => new Set<_MemberUsage>())
|
||||
.putIfAbsent(usage.entity.name, () => new Set<MemberUsage>())
|
||||
.add(usage);
|
||||
}
|
||||
if (usage.pendingUse.contains(MemberUse.NORMAL)) {
|
||||
// The element is not yet used. Add it to the list of instance
|
||||
// members to still be processed.
|
||||
_instanceMembersByName
|
||||
.putIfAbsent(memberName, () => new Set<_MemberUsage>())
|
||||
.putIfAbsent(memberName, () => new Set<MemberUsage>())
|
||||
.add(usage);
|
||||
}
|
||||
memberUsed(member, useSet);
|
||||
|
@ -510,24 +533,24 @@ class CodegenWorldBuilderImpl extends WorldBuilderBase
|
|||
});
|
||||
}
|
||||
|
||||
void _processSet(Map<String, Set<_MemberUsage>> map, String memberName,
|
||||
bool f(_MemberUsage e)) {
|
||||
Set<_MemberUsage> members = map[memberName];
|
||||
void _processSet(Map<String, Set<MemberUsage>> map, String memberName,
|
||||
bool f(MemberUsage e)) {
|
||||
Set<MemberUsage> members = map[memberName];
|
||||
if (members == null) return;
|
||||
// [f] might add elements to [: map[memberName] :] during the loop below
|
||||
// so we create a new list for [: map[memberName] :] and prepend the
|
||||
// [remaining] members after the loop.
|
||||
map[memberName] = new Set<_MemberUsage>();
|
||||
Set<_MemberUsage> remaining = new Set<_MemberUsage>();
|
||||
for (_MemberUsage member in members) {
|
||||
map[memberName] = new Set<MemberUsage>();
|
||||
Set<MemberUsage> remaining = new Set<MemberUsage>();
|
||||
for (MemberUsage member in members) {
|
||||
if (!f(member)) remaining.add(member);
|
||||
}
|
||||
map[memberName].addAll(remaining);
|
||||
}
|
||||
|
||||
/// Return the canonical [_ClassUsage] for [cls].
|
||||
_ClassUsage _getClassUsage(ClassEntity cls) {
|
||||
return _processedClasses.putIfAbsent(cls, () => new _ClassUsage(cls));
|
||||
/// Return the canonical [ClassUsage] for [cls].
|
||||
ClassUsage _getClassUsage(ClassEntity cls) {
|
||||
return _processedClasses.putIfAbsent(cls, () => new ClassUsage(cls));
|
||||
}
|
||||
|
||||
void _processInstantiatedClass(ClassEntity cls, ClassUsedCallback classUsed) {
|
||||
|
@ -535,7 +558,7 @@ class CodegenWorldBuilderImpl extends WorldBuilderBase
|
|||
// already instantiated and we therefore have to process its superclass as
|
||||
// well.
|
||||
bool processClass(ClassEntity superclass) {
|
||||
_ClassUsage usage = _getClassUsage(superclass);
|
||||
ClassUsage usage = _getClassUsage(superclass);
|
||||
if (!usage.isInstantiated) {
|
||||
classUsed(usage.cls, usage.instantiate());
|
||||
return true;
|
||||
|
@ -596,7 +619,7 @@ class CodegenWorldBuilderImpl extends WorldBuilderBase
|
|||
Iterable<FunctionEntity> get genericInstanceMethods {
|
||||
List<FunctionEntity> functions = <FunctionEntity>[];
|
||||
|
||||
void processMemberUse(MemberEntity member, _MemberUsage memberUsage) {
|
||||
void processMemberUse(MemberEntity member, MemberUsage memberUsage) {
|
||||
if (member.isInstanceMember &&
|
||||
member is FunctionEntity &&
|
||||
memberUsage.hasUse &&
|
||||
|
@ -613,7 +636,7 @@ class CodegenWorldBuilderImpl extends WorldBuilderBase
|
|||
Iterable<FunctionEntity> get userNoSuchMethods {
|
||||
List<FunctionEntity> functions = <FunctionEntity>[];
|
||||
|
||||
void processMemberUse(MemberEntity member, _MemberUsage memberUsage) {
|
||||
void processMemberUse(MemberEntity member, MemberUsage memberUsage) {
|
||||
if (member.isInstanceMember &&
|
||||
member is FunctionEntity &&
|
||||
memberUsage.hasUse &&
|
||||
|
|
|
@ -2,7 +2,10 @@
|
|||
// 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.
|
||||
|
||||
part of world_builder;
|
||||
import '../common.dart';
|
||||
import '../elements/entities.dart';
|
||||
import '../js_model/elements.dart' show JSignatureMethod;
|
||||
import '../util/enumset.dart';
|
||||
|
||||
abstract class AbstractUsage<T> {
|
||||
final EnumSet<T> _pendingUse = new EnumSet<T>();
|
||||
|
@ -31,27 +34,27 @@ abstract class AbstractUsage<T> {
|
|||
}
|
||||
|
||||
/// Registry for the observed use of a member [entity] in the open world.
|
||||
abstract class _MemberUsage extends AbstractUsage<MemberUse> {
|
||||
abstract class MemberUsage extends AbstractUsage<MemberUse> {
|
||||
final MemberEntity entity;
|
||||
|
||||
_MemberUsage.internal(this.entity);
|
||||
MemberUsage.internal(this.entity);
|
||||
|
||||
factory _MemberUsage(MemberEntity member, {bool isNative: false}) {
|
||||
factory MemberUsage(MemberEntity member, {bool isNative: false}) {
|
||||
if (member.isField) {
|
||||
if (member.isAssignable) {
|
||||
return new _FieldUsage(member, isNative: isNative);
|
||||
return new FieldUsage(member, isNative: isNative);
|
||||
} else {
|
||||
return new _FinalFieldUsage(member, isNative: isNative);
|
||||
return new FinalFieldUsage(member, isNative: isNative);
|
||||
}
|
||||
} else if (member.isGetter) {
|
||||
return new _GetterUsage(member);
|
||||
return new GetterUsage(member);
|
||||
} else if (member.isSetter) {
|
||||
return new _SetterUsage(member);
|
||||
return new SetterUsage(member);
|
||||
} else if (member.isConstructor) {
|
||||
return new _ConstructorUsage(member);
|
||||
return new ConstructorUsage(member);
|
||||
} else {
|
||||
assert(member.isFunction, failedAt(member, "Unexpected member: $member"));
|
||||
return new _FunctionUsage(member);
|
||||
return new FunctionUsage(member);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -106,18 +109,18 @@ abstract class _MemberUsage extends AbstractUsage<MemberUse> {
|
|||
|
||||
bool operator ==(other) {
|
||||
if (identical(this, other)) return true;
|
||||
if (other is! _MemberUsage) return false;
|
||||
if (other is! MemberUsage) return false;
|
||||
return entity == other.entity;
|
||||
}
|
||||
|
||||
String toString() => '$entity:${appliedUse.iterable(MemberUse.values)}';
|
||||
}
|
||||
|
||||
class _FieldUsage extends _MemberUsage {
|
||||
class FieldUsage extends MemberUsage {
|
||||
bool hasRead = false;
|
||||
bool hasWrite = false;
|
||||
|
||||
_FieldUsage(FieldEntity field, {bool isNative: false})
|
||||
FieldUsage(FieldEntity field, {bool isNative: false})
|
||||
: super.internal(field) {
|
||||
if (!isNative) {
|
||||
// All field initializers must be resolved as they could
|
||||
|
@ -164,10 +167,10 @@ class _FieldUsage extends _MemberUsage {
|
|||
}
|
||||
}
|
||||
|
||||
class _FinalFieldUsage extends _MemberUsage {
|
||||
class FinalFieldUsage extends MemberUsage {
|
||||
bool hasRead = false;
|
||||
|
||||
_FinalFieldUsage(FieldEntity field, {bool isNative: false})
|
||||
FinalFieldUsage(FieldEntity field, {bool isNative: false})
|
||||
: super.internal(field) {
|
||||
if (!isNative) {
|
||||
// All field initializers must be resolved as they could
|
||||
|
@ -199,11 +202,11 @@ class _FinalFieldUsage extends _MemberUsage {
|
|||
EnumSet<MemberUse> fullyUse() => read();
|
||||
}
|
||||
|
||||
class _FunctionUsage extends _MemberUsage {
|
||||
class FunctionUsage extends MemberUsage {
|
||||
bool hasInvoke = false;
|
||||
bool hasRead = false;
|
||||
|
||||
_FunctionUsage(FunctionEntity function) : super.internal(function) {
|
||||
FunctionUsage(FunctionEntity function) : super.internal(function) {
|
||||
if (function is JSignatureMethod) {
|
||||
// We mark signature methods as "always used" to prevent them from being
|
||||
// optimized away.
|
||||
|
@ -253,10 +256,10 @@ class _FunctionUsage extends _MemberUsage {
|
|||
bool get fullyUsed => hasInvoke && hasRead;
|
||||
}
|
||||
|
||||
class _GetterUsage extends _MemberUsage {
|
||||
class GetterUsage extends MemberUsage {
|
||||
bool hasRead = false;
|
||||
|
||||
_GetterUsage(FunctionEntity getter) : super.internal(getter);
|
||||
GetterUsage(FunctionEntity getter) : super.internal(getter);
|
||||
|
||||
@override
|
||||
bool get fullyUsed => hasRead;
|
||||
|
@ -277,10 +280,10 @@ class _GetterUsage extends _MemberUsage {
|
|||
EnumSet<MemberUse> fullyUse() => read();
|
||||
}
|
||||
|
||||
class _SetterUsage extends _MemberUsage {
|
||||
class SetterUsage extends MemberUsage {
|
||||
bool hasWrite = false;
|
||||
|
||||
_SetterUsage(FunctionEntity setter) : super.internal(setter);
|
||||
SetterUsage(FunctionEntity setter) : super.internal(setter);
|
||||
|
||||
@override
|
||||
bool get fullyUsed => hasWrite;
|
||||
|
@ -298,11 +301,10 @@ class _SetterUsage extends _MemberUsage {
|
|||
EnumSet<MemberUse> fullyUse() => write();
|
||||
}
|
||||
|
||||
class _ConstructorUsage extends _MemberUsage {
|
||||
class ConstructorUsage extends MemberUsage {
|
||||
bool hasInvoke = false;
|
||||
|
||||
_ConstructorUsage(ConstructorEntity constructor)
|
||||
: super.internal(constructor);
|
||||
ConstructorUsage(ConstructorEntity constructor) : super.internal(constructor);
|
||||
|
||||
EnumSet<MemberUse> get _originalUse => MemberUses.NORMAL_ONLY;
|
||||
|
||||
|
@ -345,13 +347,13 @@ typedef void MemberUsedCallback(MemberEntity member, EnumSet<MemberUse> useSet);
|
|||
|
||||
/// Registry for the observed use of a class [entity] in the open world.
|
||||
// TODO(johnniwinther): Merge this with [InstantiationInfo].
|
||||
class _ClassUsage extends AbstractUsage<ClassUse> {
|
||||
class ClassUsage extends AbstractUsage<ClassUse> {
|
||||
bool isInstantiated = false;
|
||||
bool isImplemented = false;
|
||||
|
||||
final ClassEntity cls;
|
||||
|
||||
_ClassUsage(this.cls);
|
||||
ClassUsage(this.cls);
|
||||
|
||||
EnumSet<ClassUse> instantiate() {
|
||||
if (isInstantiated) {
|
||||
|
@ -390,15 +392,15 @@ class ClassUses {
|
|||
|
||||
typedef void ClassUsedCallback(ClassEntity cls, EnumSet<ClassUse> useSet);
|
||||
|
||||
// TODO(johnniwinther): Merge this with [_MemberUsage].
|
||||
abstract class _StaticMemberUsage extends AbstractUsage<MemberUse>
|
||||
implements _MemberUsage {
|
||||
// TODO(johnniwinther): Merge this with [MemberUsage].
|
||||
abstract class StaticMemberUsage extends AbstractUsage<MemberUse>
|
||||
implements MemberUsage {
|
||||
final MemberEntity entity;
|
||||
|
||||
bool hasNormalUse = false;
|
||||
bool get hasClosurization => false;
|
||||
|
||||
_StaticMemberUsage.internal(this.entity);
|
||||
StaticMemberUsage.internal(this.entity);
|
||||
|
||||
EnumSet<MemberUse> normalUse() {
|
||||
if (hasNormalUse) {
|
||||
|
@ -426,8 +428,8 @@ abstract class _StaticMemberUsage extends AbstractUsage<MemberUse>
|
|||
String toString() => '$entity:${appliedUse.iterable(MemberUse.values)}';
|
||||
}
|
||||
|
||||
class _GeneralStaticMemberUsage extends _StaticMemberUsage {
|
||||
_GeneralStaticMemberUsage(MemberEntity entity) : super.internal(entity);
|
||||
class GeneralStaticMemberUsage extends StaticMemberUsage {
|
||||
GeneralStaticMemberUsage(MemberEntity entity) : super.internal(entity);
|
||||
|
||||
EnumSet<MemberUse> tearOff() => normalUse();
|
||||
|
||||
|
@ -444,10 +446,10 @@ class _GeneralStaticMemberUsage extends _StaticMemberUsage {
|
|||
bool get hasRead => hasNormalUse;
|
||||
}
|
||||
|
||||
class _StaticFunctionUsage extends _StaticMemberUsage {
|
||||
class StaticFunctionUsage extends StaticMemberUsage {
|
||||
bool hasClosurization = false;
|
||||
|
||||
_StaticFunctionUsage(MemberEntity entity) : super.internal(entity);
|
||||
StaticFunctionUsage(MemberEntity entity) : super.internal(entity);
|
||||
|
||||
EnumSet<MemberUse> tearOff() {
|
||||
if (hasClosurization) {
|
||||
|
|
|
@ -2,7 +2,35 @@
|
|||
// 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.
|
||||
|
||||
part of world_builder;
|
||||
import '../common.dart';
|
||||
import '../common/names.dart' show Identifiers, Names;
|
||||
import '../common_elements.dart';
|
||||
import '../constants/values.dart';
|
||||
import '../elements/entities.dart';
|
||||
import '../elements/types.dart';
|
||||
import '../js_backend/annotations.dart';
|
||||
import '../js_backend/allocator_analysis.dart' show KAllocatorAnalysis;
|
||||
import '../js_backend/backend_usage.dart'
|
||||
show BackendUsage, BackendUsageBuilder;
|
||||
import '../js_backend/interceptor_data.dart' show InterceptorDataBuilder;
|
||||
import '../js_backend/native_data.dart' show NativeBasicData, NativeDataBuilder;
|
||||
import '../js_backend/no_such_method_registry.dart';
|
||||
import '../js_backend/runtime_types.dart';
|
||||
import '../kernel/element_map_impl.dart';
|
||||
import '../kernel/kelements.dart';
|
||||
import '../kernel/kernel_world.dart';
|
||||
import '../native/enqueue.dart' show NativeResolutionEnqueuer;
|
||||
import '../options.dart';
|
||||
import '../universe/class_set.dart';
|
||||
import '../util/enumset.dart';
|
||||
import '../util/util.dart';
|
||||
import '../world.dart' show KClosedWorld, OpenWorld;
|
||||
import 'class_hierarchy.dart' show ClassHierarchyBuilder, ClassQueries;
|
||||
import 'member_usage.dart';
|
||||
import 'selector.dart' show Selector;
|
||||
import 'use.dart'
|
||||
show ConstantUse, DynamicUse, DynamicUseKind, StaticUse, StaticUseKind;
|
||||
import 'world_builder.dart';
|
||||
|
||||
abstract class ResolutionWorldBuilder implements WorldBuilder, OpenWorld {
|
||||
/// Calls [f] for all local functions in the program together with the member
|
||||
|
@ -296,18 +324,18 @@ class ResolutionWorldBuilderImpl extends WorldBuilderBase
|
|||
final Map<String, Map<Selector, SelectorConstraints>> _invokedSetters =
|
||||
<String, Map<Selector, SelectorConstraints>>{};
|
||||
|
||||
final Map<ClassEntity, _ClassUsage> _processedClasses =
|
||||
<ClassEntity, _ClassUsage>{};
|
||||
final Map<ClassEntity, ClassUsage> _processedClasses =
|
||||
<ClassEntity, ClassUsage>{};
|
||||
|
||||
Map<ClassEntity, _ClassUsage> get classUsageForTesting => _processedClasses;
|
||||
Map<ClassEntity, ClassUsage> get classUsageForTesting => _processedClasses;
|
||||
|
||||
/// Map of registered usage of static members of live classes.
|
||||
final Map<MemberEntity, _MemberUsage> _memberUsage =
|
||||
<MemberEntity, _MemberUsage>{};
|
||||
final Map<MemberEntity, MemberUsage> _memberUsage =
|
||||
<MemberEntity, MemberUsage>{};
|
||||
|
||||
Map<MemberEntity, _MemberUsage> get staticMemberUsageForTesting {
|
||||
Map<MemberEntity, _MemberUsage> map = <MemberEntity, _MemberUsage>{};
|
||||
_memberUsage.forEach((MemberEntity member, _MemberUsage usage) {
|
||||
Map<MemberEntity, MemberUsage> get staticMemberUsageForTesting {
|
||||
Map<MemberEntity, MemberUsage> map = <MemberEntity, MemberUsage>{};
|
||||
_memberUsage.forEach((MemberEntity member, MemberUsage usage) {
|
||||
if (!member.isInstanceMember) {
|
||||
map[member] = usage;
|
||||
}
|
||||
|
@ -315,9 +343,9 @@ class ResolutionWorldBuilderImpl extends WorldBuilderBase
|
|||
return map;
|
||||
}
|
||||
|
||||
Map<MemberEntity, _MemberUsage> get instanceMemberUsageForTesting {
|
||||
Map<MemberEntity, _MemberUsage> map = <MemberEntity, _MemberUsage>{};
|
||||
_memberUsage.forEach((MemberEntity member, _MemberUsage usage) {
|
||||
Map<MemberEntity, MemberUsage> get instanceMemberUsageForTesting {
|
||||
Map<MemberEntity, MemberUsage> map = <MemberEntity, MemberUsage>{};
|
||||
_memberUsage.forEach((MemberEntity member, MemberUsage usage) {
|
||||
if (member.isInstanceMember) {
|
||||
map[member] = usage;
|
||||
}
|
||||
|
@ -327,13 +355,13 @@ class ResolutionWorldBuilderImpl extends WorldBuilderBase
|
|||
|
||||
/// Map containing instance members of live classes that are not yet live
|
||||
/// themselves.
|
||||
final Map<String, Set<_MemberUsage>> _instanceMembersByName =
|
||||
<String, Set<_MemberUsage>>{};
|
||||
final Map<String, Set<MemberUsage>> _instanceMembersByName =
|
||||
<String, Set<MemberUsage>>{};
|
||||
|
||||
/// Map containing instance methods of live classes that are not yet
|
||||
/// closurized.
|
||||
final Map<String, Set<_MemberUsage>> _instanceFunctionsByName =
|
||||
<String, Set<_MemberUsage>>{};
|
||||
final Map<String, Set<MemberUsage>> _instanceFunctionsByName =
|
||||
<String, Set<MemberUsage>>{};
|
||||
|
||||
/// Fields set.
|
||||
final Set<FieldEntity> fieldSetters = new Set<FieldEntity>();
|
||||
|
@ -589,9 +617,9 @@ class ResolutionWorldBuilderImpl extends WorldBuilderBase
|
|||
Selector selector = dynamicUse.selector;
|
||||
String methodName = selector.name;
|
||||
|
||||
void _process(Map<String, Set<_MemberUsage>> memberMap,
|
||||
EnumSet<MemberUse> action(_MemberUsage usage)) {
|
||||
_processSet(memberMap, methodName, (_MemberUsage usage) {
|
||||
void _process(Map<String, Set<MemberUsage>> memberMap,
|
||||
EnumSet<MemberUse> action(MemberUsage usage)) {
|
||||
_processSet(memberMap, methodName, (MemberUsage usage) {
|
||||
if (_selectorConstraintsStrategy.appliedUnnamed(
|
||||
dynamicUse, usage.entity, this)) {
|
||||
memberUsed(usage.entity, action(usage));
|
||||
|
@ -669,8 +697,8 @@ class ResolutionWorldBuilderImpl extends WorldBuilderBase
|
|||
|
||||
MemberEntity element = staticUse.element;
|
||||
EnumSet<MemberUse> useSet = new EnumSet<MemberUse>();
|
||||
_MemberUsage usage = _memberUsage.putIfAbsent(element, () {
|
||||
_MemberUsage usage = new _MemberUsage(element);
|
||||
MemberUsage usage = _memberUsage.putIfAbsent(element, () {
|
||||
MemberUsage usage = new MemberUsage(element);
|
||||
useSet.addAll(usage.appliedUse);
|
||||
return usage;
|
||||
});
|
||||
|
@ -738,14 +766,14 @@ class ResolutionWorldBuilderImpl extends WorldBuilderBase
|
|||
}
|
||||
}
|
||||
|
||||
/// Called to create a [_ClassUsage] for [cls].
|
||||
/// Called to create a [ClassUsage] for [cls].
|
||||
///
|
||||
/// Subclasses override this to ensure needed invariants on [cls].
|
||||
_ClassUsage _createClassUsage(covariant ClassEntity cls) =>
|
||||
new _ClassUsage(cls);
|
||||
ClassUsage _createClassUsage(covariant ClassEntity cls) =>
|
||||
new ClassUsage(cls);
|
||||
|
||||
/// Return the canonical [_ClassUsage] for [cls].
|
||||
_ClassUsage _getClassUsage(ClassEntity cls) {
|
||||
/// Return the canonical [ClassUsage] for [cls].
|
||||
ClassUsage _getClassUsage(ClassEntity cls) {
|
||||
return _processedClasses.putIfAbsent(cls, () {
|
||||
return _createClassUsage(cls);
|
||||
});
|
||||
|
@ -757,7 +785,7 @@ class ResolutionWorldBuilderImpl extends WorldBuilderBase
|
|||
// already instantiated and we therefore have to process its superclass as
|
||||
// well.
|
||||
bool processClass(ClassEntity superclass) {
|
||||
_ClassUsage usage = _getClassUsage(superclass);
|
||||
ClassUsage usage = _getClassUsage(superclass);
|
||||
if (!usage.isInstantiated) {
|
||||
classUsed(usage.cls, usage.instantiate());
|
||||
return true;
|
||||
|
@ -779,19 +807,19 @@ class ResolutionWorldBuilderImpl extends WorldBuilderBase
|
|||
});
|
||||
}
|
||||
|
||||
/// Call [updateUsage] on all [_MemberUsage]s in the set in [map] for
|
||||
/// Call [updateUsage] on all [MemberUsage]s in the set in [map] for
|
||||
/// [memberName]. If [updateUsage] returns `true` the usage is removed from
|
||||
/// the set.
|
||||
void _processSet(Map<String, Set<_MemberUsage>> map, String memberName,
|
||||
bool updateUsage(_MemberUsage e)) {
|
||||
Set<_MemberUsage> members = map[memberName];
|
||||
void _processSet(Map<String, Set<MemberUsage>> map, String memberName,
|
||||
bool updateUsage(MemberUsage e)) {
|
||||
Set<MemberUsage> members = map[memberName];
|
||||
if (members == null) return;
|
||||
// [f] might add elements to [: map[memberName] :] during the loop below
|
||||
// so we create a new list for [: map[memberName] :] and prepend the
|
||||
// [remaining] members after the loop.
|
||||
map[memberName] = new Set<_MemberUsage>();
|
||||
Set<_MemberUsage> remaining = new Set<_MemberUsage>();
|
||||
for (_MemberUsage usage in members) {
|
||||
map[memberName] = new Set<MemberUsage>();
|
||||
Set<MemberUsage> remaining = new Set<MemberUsage>();
|
||||
for (MemberUsage usage in members) {
|
||||
if (!updateUsage(usage)) remaining.add(usage);
|
||||
}
|
||||
map[memberName].addAll(remaining);
|
||||
|
@ -809,11 +837,11 @@ class ResolutionWorldBuilderImpl extends WorldBuilderBase
|
|||
// Note: this assumes that there are no non-native fields on native
|
||||
// classes, which may not be the case when a native class is subclassed.
|
||||
bool newUsage = false;
|
||||
_MemberUsage usage = _memberUsage.putIfAbsent(member, () {
|
||||
MemberUsage usage = _memberUsage.putIfAbsent(member, () {
|
||||
newUsage = true;
|
||||
bool isNative = _nativeBasicData.isNativeClass(cls);
|
||||
EnumSet<MemberUse> useSet = new EnumSet<MemberUse>();
|
||||
_MemberUsage usage = new _MemberUsage(member, isNative: isNative);
|
||||
MemberUsage usage = new MemberUsage(member, isNative: isNative);
|
||||
useSet.addAll(usage.appliedUse);
|
||||
if (member.isField && isNative) {
|
||||
registerUsedElement(member);
|
||||
|
@ -838,14 +866,14 @@ class ResolutionWorldBuilderImpl extends WorldBuilderBase
|
|||
// The element is not yet used. Add it to the list of instance
|
||||
// members to still be processed.
|
||||
_instanceMembersByName
|
||||
.putIfAbsent(memberName, () => new Set<_MemberUsage>())
|
||||
.putIfAbsent(memberName, () => new Set<MemberUsage>())
|
||||
.add(usage);
|
||||
}
|
||||
if (usage.pendingUse.contains(MemberUse.CLOSURIZE_INSTANCE)) {
|
||||
// Store the member in [instanceFunctionsByName] to catch
|
||||
// getters on the function.
|
||||
_instanceFunctionsByName
|
||||
.putIfAbsent(memberName, () => new Set<_MemberUsage>())
|
||||
.putIfAbsent(memberName, () => new Set<MemberUsage>())
|
||||
.add(usage);
|
||||
}
|
||||
memberUsed(usage.entity, useSet);
|
||||
|
|
|
@ -4,48 +4,13 @@
|
|||
|
||||
library world_builder;
|
||||
|
||||
import 'dart:collection';
|
||||
|
||||
import '../common.dart';
|
||||
import '../common/names.dart' show Identifiers, Names;
|
||||
import '../common_elements.dart';
|
||||
import '../constants/values.dart';
|
||||
import '../elements/entities.dart';
|
||||
import '../elements/types.dart';
|
||||
import '../js_backend/annotations.dart';
|
||||
import '../js_backend/allocator_analysis.dart' show KAllocatorAnalysis;
|
||||
import '../js_backend/backend_usage.dart'
|
||||
show BackendUsage, BackendUsageBuilder;
|
||||
import '../js_backend/interceptor_data.dart' show InterceptorDataBuilder;
|
||||
import '../js_backend/native_data.dart' show NativeBasicData, NativeDataBuilder;
|
||||
import '../js_backend/no_such_method_registry.dart';
|
||||
import '../js_backend/runtime_types.dart';
|
||||
import '../js_model/locals.dart';
|
||||
import '../js_model/element_map_impl.dart';
|
||||
import '../js_model/elements.dart' show JSignatureMethod;
|
||||
import '../kernel/element_map_impl.dart';
|
||||
import '../kernel/kelements.dart';
|
||||
import '../kernel/kernel_world.dart';
|
||||
import '../native/enqueue.dart' show NativeResolutionEnqueuer;
|
||||
import '../options.dart';
|
||||
import '../universe/class_set.dart';
|
||||
import '../util/enumset.dart';
|
||||
import '../util/util.dart';
|
||||
import '../world.dart' show World, JClosedWorld, KClosedWorld, OpenWorld;
|
||||
import 'class_hierarchy.dart' show ClassHierarchyBuilder, ClassQueries;
|
||||
import '../js_backend/native_data.dart' show NativeBasicData;
|
||||
import '../world.dart' show World, JClosedWorld, OpenWorld;
|
||||
import 'selector.dart' show Selector;
|
||||
import 'use.dart'
|
||||
show
|
||||
ConstantUse,
|
||||
ConstantUseKind,
|
||||
DynamicUse,
|
||||
DynamicUseKind,
|
||||
StaticUse,
|
||||
StaticUseKind;
|
||||
|
||||
part 'codegen_world_builder.dart';
|
||||
part 'member_usage.dart';
|
||||
part 'resolution_world_builder.dart';
|
||||
import 'use.dart' show DynamicUse, StaticUse;
|
||||
|
||||
/// The combined constraints on receivers all the dynamic call sites of the same
|
||||
/// selector.
|
||||
|
|
|
@ -12,7 +12,7 @@ import 'package:compiler/src/elements/entities.dart';
|
|||
import 'package:compiler/src/js_model/element_map.dart';
|
||||
import 'package:compiler/src/js_model/js_world.dart';
|
||||
import 'package:compiler/src/js_model/locals.dart';
|
||||
import 'package:compiler/src/universe/world_builder.dart';
|
||||
import 'package:compiler/src/universe/codegen_world_builder.dart';
|
||||
import 'package:expect/expect.dart';
|
||||
import '../equivalence/id_equivalence.dart';
|
||||
import '../equivalence/id_equivalence_helper.dart';
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
import 'package:async_helper/async_helper.dart';
|
||||
import 'package:compiler/src/compiler.dart';
|
||||
import 'package:compiler/src/universe/call_structure.dart';
|
||||
import 'package:compiler/src/universe/world_builder.dart';
|
||||
import 'package:compiler/src/universe/codegen_world_builder.dart';
|
||||
import 'package:expect/expect.dart';
|
||||
|
||||
import '../helpers/memory_compiler.dart';
|
||||
|
|
|
@ -18,8 +18,8 @@ import 'package:compiler/src/js_model/element_map.dart';
|
|||
import 'package:compiler/src/kernel/element_map.dart';
|
||||
import 'package:compiler/src/kernel/kernel_strategy.dart';
|
||||
import 'package:compiler/src/universe/feature.dart';
|
||||
import 'package:compiler/src/universe/resolution_world_builder.dart';
|
||||
import 'package:compiler/src/universe/selector.dart';
|
||||
import 'package:compiler/src/universe/world_builder.dart';
|
||||
import 'package:kernel/ast.dart' as ir;
|
||||
import '../equivalence/check_helpers.dart';
|
||||
import '../equivalence/id_equivalence.dart';
|
||||
|
|
Loading…
Reference in a new issue