[dartdevc] Implementing block expressions and set constants

Change-Id: I8d04a6f256f41f7810e33c22a333d4807dad7049
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/95673
Commit-Queue: Mark Zhou <markzipan@google.com>
Reviewed-by: Jenny Messerly <jmesserly@google.com>
diff --git a/pkg/dev_compiler/lib/src/kernel/compiler.dart b/pkg/dev_compiler/lib/src/kernel/compiler.dart
index 60b576f..160be8b 100644
--- a/pkg/dev_compiler/lib/src/kernel/compiler.dart
+++ b/pkg/dev_compiler/lib/src/kernel/compiler.dart
@@ -5056,7 +5056,12 @@
 
   @override
   visitBlockExpression(BlockExpression node) {
-    throw UnimplementedError('ProgramCompiler.visitBlockExpression');
+    var jsExpr = _visitExpression(node.value);
+    List<JS.Statement> jsStmts = node.body.statements
+        .map(_visitStatement)
+        .toList()
+          ..add(JS.Return(jsExpr));
+    return JS.Call(JS.ArrowFun([], JS.Block(jsStmts)), []);
   }
 
   @override
@@ -5162,9 +5167,12 @@
   }
 
   @override
-  visitListConstant(node) {
-    return _cacheConst(() => _emitConstList(
-        node.typeArgument, node.entries.map(visitConstant).toList()));
+  visitListConstant(node) => visitConstantList(node.typeArgument, node.entries);
+
+  /// Visits [Constant] with [_visitConstant].
+  visitConstantList(DartType typeArgument, List<Constant> entries) {
+    return _cacheConst(() =>
+        _emitConstList(typeArgument, entries.map(visitConstant).toList()));
   }
 
   @override
@@ -5172,7 +5180,10 @@
     // Set literals are currently desugared in the frontend.
     // Implement this method before flipping the supportsSetLiterals flag
     // in DevCompilerTarget to true.
-    throw "Set literal constants not supported.";
+    return _cacheConst(() => runtimeCall('constSet(#, #)', [
+          _emitType(node.typeArgument),
+          visitConstantList(node.typeArgument, node.entries)
+        ]));
   }
 
   @override
diff --git a/pkg/dev_compiler/lib/src/kernel/target.dart b/pkg/dev_compiler/lib/src/kernel/target.dart
index 1227ed7..db69224 100644
--- a/pkg/dev_compiler/lib/src/kernel/target.dart
+++ b/pkg/dev_compiler/lib/src/kernel/target.dart
@@ -69,6 +69,9 @@
   bool get errorOnUnexactWebIntLiterals => true;
 
   @override
+  bool get supportsSetLiterals => true;
+
+  @override
   bool get enableNoSuchMethodForwarders => true;
 
   @override