[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