[ddc] Add dart.web.assertions_enabled environment variable.

Change-Id: If28f2f1404f02c5d757774188a5a006137c8734f
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/273284
Reviewed-by: Nicholas Shahan <nshahan@google.com>
Commit-Queue: Mayank Patke <fishythefish@google.com>
Reviewed-by: Sigmund Cherem <sigmund@google.com>
Reviewed-by: Anna Gringauze <annagrin@google.com>
diff --git a/pkg/dev_compiler/lib/src/kernel/command.dart b/pkg/dev_compiler/lib/src/kernel/command.dart
index 8fb5b80..32afa73 100644
--- a/pkg/dev_compiler/lib/src/kernel/command.dart
+++ b/pkg/dev_compiler/lib/src/kernel/command.dart
@@ -139,6 +139,8 @@
   }
 
   var options = SharedCompilerOptions.fromArguments(argResults);
+  addGeneratedVariables(declaredVariables,
+      enableAsserts: options.enableAsserts);
 
   Uri toCustomUri(Uri uri) {
     if (!uri.hasScheme) {
@@ -833,6 +835,13 @@
   return declaredVariables;
 }
 
+/// Adds all synthesized environment variables to [variables].
+Map<String, String> addGeneratedVariables(Map<String, String> variables,
+    {required bool enableAsserts}) {
+  variables['dart.web.assertions_enabled'] = '$enableAsserts';
+  return variables;
+}
+
 /// The default path of the kernel summary for the Dart SDK.
 final defaultSdkSummaryPath =
     p.join(getSdkPath(), 'lib', '_internal', 'ddc_outline.dill');
diff --git a/pkg/dev_compiler/lib/src/kernel/expression_compiler_worker.dart b/pkg/dev_compiler/lib/src/kernel/expression_compiler_worker.dart
index 3f442a5..72ef463 100644
--- a/pkg/dev_compiler/lib/src/kernel/expression_compiler_worker.dart
+++ b/pkg/dev_compiler/lib/src/kernel/expression_compiler_worker.dart
@@ -97,6 +97,11 @@
     this.onDone,
   );
 
+  // Disable asserts due to failures to load source and locations on kernel
+  // loaded from dill files in DDC.
+  // https://github.com/dart-lang/sdk/issues/43986
+  static const bool _enableAsserts = false;
+
   /// Create expression compiler worker from [args] and start it.
   ///
   /// If [sendPort] is provided, creates a `receivePort` and sends it to
@@ -231,9 +236,9 @@
           soundNullSafety: soundNullSafety))
       ..fileSystem = fileSystem
       ..omitPlatform = true
-      ..environmentDefines = {
+      ..environmentDefines = addGeneratedVariables({
         if (environmentDefines != null) ...environmentDefines,
-      }
+      }, enableAsserts: _enableAsserts)
       ..explicitExperimentalFlags = explicitExperimentalFlags
       ..onDiagnostic = _onDiagnosticHandler(errors, warnings, infos)
       ..nnbdMode = soundNullSafety ? NnbdMode.Strong : NnbdMode.Weak
@@ -435,10 +440,7 @@
           summarizeApi: false,
           moduleName: moduleName,
           soundNullSafety: _compilerOptions.nnbdMode == NnbdMode.Strong,
-          // Disable asserts due to failures to load source and
-          // locations on kernel loaded from dill files in DDC.
-          // https://github.com/dart-lang/sdk/issues/43986
-          enableAsserts: false),
+          enableAsserts: _enableAsserts),
       _moduleCache.componentForLibrary,
       _moduleCache.moduleNameForComponent,
       coreTypes: coreTypes,
diff --git a/pkg/dev_compiler/test/expression_compiler/assertions_enabled_test.dart b/pkg/dev_compiler/test/expression_compiler/assertions_enabled_test.dart
new file mode 100644
index 0000000..931b7e9
--- /dev/null
+++ b/pkg/dev_compiler/test/expression_compiler/assertions_enabled_test.dart
@@ -0,0 +1,45 @@
+// Copyright (c) 2023, 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.
+
+import 'package:test/test.dart';
+
+import 'expression_compiler_e2e_suite.dart';
+
+void main() async {
+  var driver = await TestDriver.init();
+
+  group('dart.web.assertions_enabled', () {
+    const source = r'''
+      void main() {
+        var b = const bool.fromEnvironment('dart.web.assertions_enabled');
+
+        // Breakpoint: bp
+        print('hello world');
+      }
+    ''';
+
+    tearDown(() async {
+      await driver.cleanupTest();
+    });
+
+    tearDownAll(() async {
+      await driver.finish();
+    });
+
+    test('is automatically set', () async {
+      var setup = SetupCompilerOptions(enableAsserts: true);
+      await driver.initSource(setup, source);
+      // TODO(43986): Update when assertions are enabled.
+      await driver.check(
+          breakpointId: 'bp', expression: 'b', expectedResult: 'false');
+    });
+
+    test('is automatically unset', () async {
+      var setup = SetupCompilerOptions(enableAsserts: false);
+      await driver.initSource(setup, source);
+      await driver.check(
+          breakpointId: 'bp', expression: 'b', expectedResult: 'false');
+    });
+  });
+}
diff --git a/pkg/dev_compiler/test/expression_compiler/expression_compiler_e2e_suite.dart b/pkg/dev_compiler/test/expression_compiler/expression_compiler_e2e_suite.dart
index 4d7ab62..811796a 100644
--- a/pkg/dev_compiler/test/expression_compiler/expression_compiler_e2e_suite.dart
+++ b/pkg/dev_compiler/test/expression_compiler/expression_compiler_e2e_suite.dart
@@ -73,7 +73,8 @@
   final fe.CompilerOptions options;
   final bool soundNullSafety;
 
-  static fe.CompilerOptions _getOptions(bool soundNullSafety) {
+  static fe.CompilerOptions _getOptions(
+      {required bool enableAsserts, required bool soundNullSafety}) {
     var options = fe.CompilerOptions()
       ..verbose = false // set to true for debugging
       ..sdkRoot = sdkRoot
@@ -83,16 +84,22 @@
       ..omitPlatform = true
       ..sdkSummary =
           p.toUri(soundNullSafety ? sdkSoundSummaryPath : sdkUnsoundSummaryPath)
-      ..environmentDefines = const {}
+      ..environmentDefines = addGeneratedVariables({},
+          // Disable asserts due to failures to load source and
+          // locations on kernel loaded from dill files in DDC.
+          // https://github.com/dart-lang/sdk/issues/43986
+          enableAsserts: false)
       ..nnbdMode = soundNullSafety ? fe.NnbdMode.Strong : fe.NnbdMode.Weak;
     return options;
   }
 
   SetupCompilerOptions(
-      {this.soundNullSafety = true,
+      {bool enableAsserts = true,
+      this.soundNullSafety = true,
       this.legacyCode = false,
       this.moduleFormat = ModuleFormat.amd})
-      : options = _getOptions(soundNullSafety) {
+      : options = _getOptions(
+            soundNullSafety: soundNullSafety, enableAsserts: enableAsserts) {
     options.onDiagnostic = (fe.DiagnosticMessage m) {
       diagnosticMessages.addAll(m.plainTextFormatted);
       if (m.severity == fe.Severity.error) {
diff --git a/pkg/dev_compiler/test/nullable_inference_test.dart b/pkg/dev_compiler/test/nullable_inference_test.dart
index 51ed8c2..4cabdac 100644
--- a/pkg/dev_compiler/test/nullable_inference_test.dart
+++ b/pkg/dev_compiler/test/nullable_inference_test.dart
@@ -6,7 +6,8 @@
 import 'dart:convert' show jsonEncode;
 import 'dart:io';
 
-import 'package:dev_compiler/src/kernel/command.dart' show getSdkPath;
+import 'package:dev_compiler/src/kernel/command.dart'
+    show addGeneratedVariables, getSdkPath;
 import 'package:dev_compiler/src/kernel/js_typerep.dart';
 import 'package:dev_compiler/src/kernel/nullable_inference.dart';
 import 'package:dev_compiler/src/kernel/target.dart';
@@ -705,7 +706,7 @@
       DevCompilerTarget(TargetFlags(soundNullSafety: false)),
       fileSystem: _fileSystem,
       explicitExperimentalFlags: const {},
-      environmentDefines: const {},
+      environmentDefines: addGeneratedVariables({}, enableAsserts: true),
       nnbdMode: fe.NnbdMode.Weak);
   if (!identical(oldCompilerState, _compilerState)) inference = null;
   var result =
diff --git a/pkg/dev_compiler/test/shared_test_options.dart b/pkg/dev_compiler/test/shared_test_options.dart
index c7525ca..0ed32d8 100644
--- a/pkg/dev_compiler/test/shared_test_options.dart
+++ b/pkg/dev_compiler/test/shared_test_options.dart
@@ -4,7 +4,8 @@
 
 import 'package:dev_compiler/src/compiler/module_builder.dart'
     show ModuleFormat;
-import 'package:dev_compiler/src/kernel/command.dart' show getSdkPath;
+import 'package:dev_compiler/src/kernel/command.dart'
+    show addGeneratedVariables, getSdkPath;
 import 'package:dev_compiler/src/kernel/target.dart' show DevCompilerTarget;
 import 'package:front_end/src/api_unstable/ddc.dart';
 import 'package:front_end/src/compute_platform_binaries_location.dart';
@@ -60,7 +61,7 @@
       ..omitPlatform = true
       ..sdkSummary =
           soundNullSafety ? sdkSoundSummaryPath : sdkUnsoundSummaryPath
-      ..environmentDefines = const {}
+      ..environmentDefines = addGeneratedVariables({}, enableAsserts: true)
       ..nnbdMode = soundNullSafety ? NnbdMode.Strong : NnbdMode.Weak;
     return options;
   }
diff --git a/tests/web/assertions_disabled_test.dart b/tests/web/assertions_disabled_test.dart
index fee23f4..7cbb533 100644
--- a/tests/web/assertions_disabled_test.dart
+++ b/tests/web/assertions_disabled_test.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// dartdevcOptions=--no-enable-asserts
+
 import "package:expect/expect.dart";
 
 void main() {
diff --git a/tests/web_2/assertions_disabled_test.dart b/tests/web_2/assertions_disabled_test.dart
index fee23f4..7cbb533 100644
--- a/tests/web_2/assertions_disabled_test.dart
+++ b/tests/web_2/assertions_disabled_test.dart
@@ -2,6 +2,8 @@
 // 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.
 
+// dartdevcOptions=--no-enable-asserts
+
 import "package:expect/expect.dart";
 
 void main() {