Add kernel and backend impacts for set literals.
Change-Id: Id4eca9807b8170ef9c81b7d66236530802a2960c
Reviewed-on: https://dart-review.googlesource.com/c/92167
Reviewed-by: Johnni Winther <johnniwinther@google.com>
Reviewed-by: Sigmund Cherem <sigmund@google.com>
diff --git a/pkg/compiler/lib/src/js_backend/backend_impact.dart b/pkg/compiler/lib/src/js_backend/backend_impact.dart
index f553d9f..36d9600 100644
--- a/pkg/compiler/lib/src/js_backend/backend_impact.dart
+++ b/pkg/compiler/lib/src/js_backend/backend_impact.dart
@@ -298,6 +298,15 @@
]);
}
+ BackendImpact _constantSetLiteral;
+
+ BackendImpact get constantSetLiteral =>
+ _constantSetLiteral ??= new BackendImpact(instantiatedClasses: [
+ _commonElements.constSetLiteralClass,
+ ], otherImpacts: [
+ constantMapLiteral
+ ]);
+
BackendImpact _symbolConstructor;
BackendImpact get symbolConstructor {
@@ -570,6 +579,15 @@
]);
}
+ BackendImpact _setClass;
+
+ BackendImpact get setClass => _setClass ??= new BackendImpact(globalClasses: [
+ // The backend will use a literal list to initialize the entries
+ // of the set.
+ _commonElements.listClass,
+ _commonElements.setLiteralClass,
+ ]);
+
BackendImpact _boundClosureClass;
BackendImpact get boundClosureClass {
@@ -601,6 +619,16 @@
]);
}
+ BackendImpact _setLiteralClass;
+
+ BackendImpact get setLiteralClass =>
+ _setLiteralClass ??= new BackendImpact(globalUses: [
+ _commonElements.setLiteralConstructor,
+ _commonElements.setLiteralConstructorEmpty,
+ _commonElements.setLiteralUntypedMaker,
+ _commonElements.setLiteralUntypedEmptyMaker,
+ ]);
+
BackendImpact _closureClass;
BackendImpact get closureClass {
diff --git a/pkg/compiler/lib/src/js_backend/backend_usage.dart b/pkg/compiler/lib/src/js_backend/backend_usage.dart
index 39612fd..ed86add 100644
--- a/pkg/compiler/lib/src/js_backend/backend_usage.dart
+++ b/pkg/compiler/lib/src/js_backend/backend_usage.dart
@@ -165,6 +165,8 @@
return true;
} else if (element == _commonElements.listClass ||
element == _commonElements.mapLiteralClass ||
+ element == _commonElements.setLiteralClass ||
+ element == _commonElements.unmodifiableSetClass ||
element == _commonElements.functionClass ||
element == _commonElements.stringClass) {
// TODO(johnniwinther): Avoid these.
diff --git a/pkg/compiler/lib/src/js_backend/impact_transformer.dart b/pkg/compiler/lib/src/js_backend/impact_transformer.dart
index 9a04642..4ee816a2 100644
--- a/pkg/compiler/lib/src/js_backend/impact_transformer.dart
+++ b/pkg/compiler/lib/src/js_backend/impact_transformer.dart
@@ -225,6 +225,15 @@
}
}
+ for (SetLiteralUse setLiteralUse in worldImpact.setLiterals) {
+ if (setLiteralUse.isConstant) {
+ registerImpact(_impacts.constantSetLiteral);
+ } else {
+ transformed
+ .registerTypeUse(new TypeUse.instantiation(setLiteralUse.type));
+ }
+ }
+
for (ListLiteralUse listLiteralUse in worldImpact.listLiterals) {
// TODO(johnniwinther): Use the [isConstant] and [isEmpty] property when
// factory constructors are registered directly.
diff --git a/pkg/compiler/lib/src/js_backend/resolution_listener.dart b/pkg/compiler/lib/src/js_backend/resolution_listener.dart
index 9c2fc09..0095fc8 100644
--- a/pkg/compiler/lib/src/js_backend/resolution_listener.dart
+++ b/pkg/compiler/lib/src/js_backend/resolution_listener.dart
@@ -328,12 +328,16 @@
_registerBackendImpact(impactBuilder, _impacts.functionClass);
} else if (cls == _commonElements.mapClass) {
_registerBackendImpact(impactBuilder, _impacts.mapClass);
+ } else if (cls == _commonElements.setClass) {
+ _registerBackendImpact(impactBuilder, _impacts.setClass);
} else if (cls == _commonElements.boundClosureClass) {
_registerBackendImpact(impactBuilder, _impacts.boundClosureClass);
} else if (_nativeData.isNativeOrExtendsNative(cls)) {
_registerBackendImpact(impactBuilder, _impacts.nativeOrExtendsClass);
} else if (cls == _commonElements.mapLiteralClass) {
_registerBackendImpact(impactBuilder, _impacts.mapLiteralClass);
+ } else if (cls == _commonElements.setLiteralClass) {
+ _registerBackendImpact(impactBuilder, _impacts.setLiteralClass);
}
if (cls == _commonElements.closureClass) {
_registerBackendImpact(impactBuilder, _impacts.closureClass);
diff --git a/pkg/compiler/lib/src/js_backend/runtime_types.dart b/pkg/compiler/lib/src/js_backend/runtime_types.dart
index b9a0d33..382475a 100644
--- a/pkg/compiler/lib/src/js_backend/runtime_types.dart
+++ b/pkg/compiler/lib/src/js_backend/runtime_types.dart
@@ -1047,6 +1047,10 @@
_getClassNode(commonElements.jsArrayClass)
.addDependency(_getClassNode(commonElements.listClass));
}
+ if (commonElements.setLiteralClass != null) {
+ _getClassNode(commonElements.setLiteralClass)
+ .addDependency(_getClassNode(commonElements.setClass));
+ }
if (commonElements.mapLiteralClass != null) {
_getClassNode(commonElements.mapLiteralClass)
.addDependency(_getClassNode(commonElements.mapClass));
diff --git a/pkg/compiler/lib/src/kernel/kernel_impact.dart b/pkg/compiler/lib/src/kernel/kernel_impact.dart
index 4853aab..0bc2c94 100644
--- a/pkg/compiler/lib/src/kernel/kernel_impact.dart
+++ b/pkg/compiler/lib/src/kernel/kernel_impact.dart
@@ -231,7 +231,10 @@
@override
void registerSetLiteral(ir.DartType elementType,
{bool isConst, bool isEmpty}) {
- // TODO(johnniwinther,fishythefish): Register set literals.
+ impactBuilder.registerSetLiteral(new SetLiteralUse(
+ commonElements.setType(elementMap.getDartType(elementType)),
+ isConstant: isConst,
+ isEmpty: isEmpty));
}
@override