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