[dart2js] Support AssertInitializer in dart2js

Closes #37881

Change-Id: I2606a3cf9bcbc047c58d075585aec01e10e0ea90
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/189200
Commit-Queue: Johnni Winther <johnniwinther@google.com>
Reviewed-by: Stephen Adams <sra@google.com>
diff --git a/pkg/compiler/lib/src/inferrer/builder_kernel.dart b/pkg/compiler/lib/src/inferrer/builder_kernel.dart
index fc818c1..17d63df 100644
--- a/pkg/compiler/lib/src/inferrer/builder_kernel.dart
+++ b/pkg/compiler/lib/src/inferrer/builder_kernel.dart
@@ -492,8 +492,7 @@
     return null;
   }
 
-  @override
-  visitAssertStatement(ir.AssertStatement node) {
+  TypeInformation _handleAssertStatement(ir.AssertStatement node) {
     // Avoid pollution from assert statement unless enabled.
     if (!_options.enableUserAssertions) {
       return null;
@@ -514,6 +513,16 @@
   }
 
   @override
+  visitAssertInitializer(ir.AssertInitializer node) {
+    return _handleAssertStatement(node.statement);
+  }
+
+  @override
+  visitAssertStatement(ir.AssertStatement node) {
+    return _handleAssertStatement(node);
+  }
+
+  @override
   visitBreakStatement(ir.BreakStatement node) {
     JumpTarget target = _localsMap.getJumpTargetForBreak(node);
     _state.seenBreakOrContinue = true;
diff --git a/pkg/compiler/lib/src/ssa/builder_kernel.dart b/pkg/compiler/lib/src/ssa/builder_kernel.dart
index 75156d4..ef086e0 100644
--- a/pkg/compiler/lib/src/ssa/builder_kernel.dart
+++ b/pkg/compiler/lib/src/ssa/builder_kernel.dart
@@ -1047,8 +1047,7 @@
         // TODO(sra): Apply inferred type information.
         _letBindings[variable] = value;
       } else if (initializer is ir.AssertInitializer) {
-        // Assert in initializer is currently not supported in dart2js.
-        // TODO(johnniwinther): Support assert in initializer.
+        initializer.statement.accept(this);
       } else if (initializer is ir.InvalidInitializer) {
         assert(false, 'ir.InvalidInitializer not handled');
       } else {
diff --git a/pkg/compiler/test/inference/data/assert_initializer.dart b/pkg/compiler/test/inference/data/assert_initializer.dart
new file mode 100644
index 0000000..9daf511
--- /dev/null
+++ b/pkg/compiler/test/inference/data/assert_initializer.dart
@@ -0,0 +1,23 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// 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.
+
+class X {
+  /*member: X.a:Union([exact=JSExtendableArray], [exact=JSString])*/
+  final dynamic a;
+
+  /*member: X.:[exact=X]*/
+  X(Object /*Union([exact=JSExtendableArray], [exact=JSString])*/ value)
+      : assert(value is String),
+        a = value;
+}
+
+/*member: main:[null]*/
+main() {
+  X('a')
+      . /*[exact=X]*/ a
+      . /*Union([exact=JSExtendableArray], [exact=JSString])*/ length;
+  X([1])
+      . /*[exact=X]*/ a
+      . /*Union([exact=JSExtendableArray], [exact=JSString])*/ length;
+}
diff --git a/pkg/compiler/test/inference/data/assert_initializer_ea.dart b/pkg/compiler/test/inference/data/assert_initializer_ea.dart
new file mode 100644
index 0000000..bf7f4f1
--- /dev/null
+++ b/pkg/compiler/test/inference/data/assert_initializer_ea.dart
@@ -0,0 +1,19 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// 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.
+
+class X {
+  /*member: X.a:[exact=JSString]*/
+  final dynamic a;
+
+  /*member: X.:[exact=X]*/
+  X(Object /*Union([exact=JSExtendableArray], [exact=JSString])*/ value)
+      : assert(value is String),
+        a = value;
+}
+
+/*member: main:[null]*/
+main() {
+  X('a'). /*[exact=X]*/ a. /*[exact=JSString]*/ length;
+  X([1]). /*[exact=X]*/ a. /*[exact=JSString]*/ length;
+}
diff --git a/tests/language/assert/initializer_test.dart b/tests/language/assert/initializer_test.dart
index b5de1eb..7e8f486 100644
--- a/tests/language/assert/initializer_test.dart
+++ b/tests/language/assert/initializer_test.dart
@@ -2,6 +2,9 @@
 // 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.
 
+// VMOptions=--enable-asserts
+// dart2jsOptions=--enable-asserts
+
 // Dart test program testing assert statements.
 
 import "package:expect/expect.dart";