[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";