dart2js nnbd setup

- fixes check_nnbd_sdk.dart to run on dart2js patch files
- splits golden file used by that script by target
- adds it to the old-rti bot (until we get the new nnbd bot)
- adds a suite that runs legacy tests in nnbd weak mode

Change-Id: I0a89534dcd1cf7338849d59ab3e5d989d2ecf3d0
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/131885
Reviewed-by: Vijay Menon <vsm@google.com>
diff --git a/pkg/compiler/lib/src/options.dart b/pkg/compiler/lib/src/options.dart
index 749efef..7abc5d5 100644
--- a/pkg/compiler/lib/src/options.dart
+++ b/pkg/compiler/lib/src/options.dart
@@ -366,6 +366,19 @@
         _extractExperiments(options, onError: onError, onWarning: onWarning);
     if (equalMaps(languageExperiments, fe.defaultExperimentalFlags)) {
       platformBinaries ??= fe.computePlatformBinariesLocation();
+    } else {
+      // TODO(sigmund): change these defaults before we unfork the sdk.
+      // To unfork the plan is to accept the same platform files regardless of
+      // the experiment flag (it will be enabled in the sdk regardless).
+      if (_hasOption(options, Flags.testMode) &&
+          languageExperiments[fe.ExperimentalFlag.nonNullable]) {
+        var experimentWithoutNullability = Map.of(languageExperiments);
+        experimentWithoutNullability[fe.ExperimentalFlag.nonNullable] = false;
+        if (equalMaps(
+            experimentWithoutNullability, fe.defaultExperimentalFlags)) {
+          platformBinaries ??= fe.computePlatformBinariesLocation();
+        }
+      }
     }
     return new CompilerOptions()
       ..librariesSpecificationUri = librariesSpecificationUri
diff --git a/pkg/dev_compiler/tool/check_nnbd_sdk.dart b/pkg/dev_compiler/tool/check_nnbd_sdk.dart
index 846872a..ae9941c 100644
--- a/pkg/dev_compiler/tool/check_nnbd_sdk.dart
+++ b/pkg/dev_compiler/tool/check_nnbd_sdk.dart
@@ -22,7 +22,7 @@
         '${_parser.usage}');
     return;
   }
-  String baseDir = args['out'] as String;
+  var baseDir = args['out'] as String;
   if (baseDir == null) {
     var tmp = Directory.systemTemp.createTempSync('check_sdk-');
     baseDir = tmp.path;
@@ -34,11 +34,12 @@
   Uri librariesJson = args['libraries'] != null
       ? resolveInputUri(args['libraries'] as String)
       : Platform.script.resolve('../../../sdk_nnbd/lib/libraries.json');
+  var target = args['target'] as String;
   patch.main([
     '--libraries',
     librariesJson.toFilePath(),
     '--target',
-    args['target'] as String,
+    target,
     '--out',
     sdkDir,
     '--merge-parts',
@@ -88,7 +89,8 @@
   File.fromUri(errorFile).writeAsStringSync(errors, flush: true);
 
   // Check against golden file.
-  var goldenFile = Platform.script.resolve('nnbd_sdk_error_golden.txt');
+  var goldenFile =
+      Platform.script.resolve('${target}_nnbd_sdk_error_golden.txt');
   var golden = File.fromUri(goldenFile).readAsStringSync();
   if (errors != golden) {
     if (args['update-golden'] as bool) {
@@ -101,11 +103,9 @@
       print('Golden file does not match.');
       var diff = Process.runSync('diff', [goldenFile.path, errorFile.path]);
       print(diff.stdout);
-      print('''
-
-To update the golden file, run:
-> <path-to-newly-built-dart-sdk>/bin/dart pkg/dev_compiler/tool/check_nnbd_sdk.dart --update-golden
-''');
+      print('\nTo update the golden file, run:'
+          '\n  ${Platform.executable} ${Platform.script} '
+          '${argv.join(' ')} --update-golden');
       exit(1);
     }
   }
diff --git a/pkg/dev_compiler/tool/dart2js_server_nnbd_sdk_error_golden.txt b/pkg/dev_compiler/tool/dart2js_server_nnbd_sdk_error_golden.txt
new file mode 100644
index 0000000..c4026f3
--- /dev/null
+++ b/pkg/dev_compiler/tool/dart2js_server_nnbd_sdk_error_golden.txt
@@ -0,0 +1,21 @@
+ERROR|COMPILE_TIME_ERROR|INCONSISTENT_INHERITANCE|lib/_internal/js_runtime/lib/interceptors.dart|1655|7|5|Superinterfaces don't have a valid override for '&': int.& (&), JSNumber.& (&).
+ERROR|COMPILE_TIME_ERROR|INCONSISTENT_INHERITANCE|lib/_internal/js_runtime/lib/interceptors.dart|1655|7|5|Superinterfaces don't have a valid override for '<<': int.<< (<<), JSNumber.<< (<<).
+ERROR|COMPILE_TIME_ERROR|INCONSISTENT_INHERITANCE|lib/_internal/js_runtime/lib/interceptors.dart|1655|7|5|Superinterfaces don't have a valid override for '>>': int.>> (>>), JSNumber.>> (>>).
+ERROR|COMPILE_TIME_ERROR|INCONSISTENT_INHERITANCE|lib/_internal/js_runtime/lib/interceptors.dart|1655|7|5|Superinterfaces don't have a valid override for '\|': int.\| (\|), JSNumber.\| (\|).
+ERROR|COMPILE_TIME_ERROR|INCONSISTENT_INHERITANCE|lib/_internal/js_runtime/lib/interceptors.dart|1655|7|5|Superinterfaces don't have a valid override for '^': int.^ (^), JSNumber.^ (^).
+ERROR|COMPILE_TIME_ERROR|INVALID_OVERRIDE|lib/_internal/js_runtime/lib/interceptors.dart|1153|7|14|'JSMutableIndexable.[]=' ('void Function(int, dynamic)') isn't a valid override of 'JSArray.[]=' ('void Function(int, E)').
+ERROR|COMPILE_TIME_ERROR|INVALID_OVERRIDE|lib/_internal/js_runtime/lib/interceptors.dart|1155|7|12|'JSMutableIndexable.[]=' ('void Function(int, dynamic)') isn't a valid override of 'JSArray.[]=' ('void Function(int, E)').
+ERROR|COMPILE_TIME_ERROR|INVALID_OVERRIDE|lib/_internal/js_runtime/lib/interceptors.dart|1157|7|17|'JSMutableIndexable.[]=' ('void Function(int, dynamic)') isn't a valid override of 'JSArray.[]=' ('void Function(int, E)').
+ERROR|COMPILE_TIME_ERROR|INVALID_OVERRIDE|lib/_internal/js_runtime/lib/native_typed_data.dart|708|17|3|'NativeTypedArrayOfDouble.[]=' ('void Function(int, double)') isn't a valid override of 'JSMutableIndexable.[]=' ('void Function(int, dynamic)').
+ERROR|COMPILE_TIME_ERROR|INVALID_OVERRIDE|lib/_internal/js_runtime/lib/native_typed_data.dart|729|17|3|'NativeTypedArrayOfInt.[]=' ('void Function(int, int)') isn't a valid override of 'JSMutableIndexable.[]=' ('void Function(int, dynamic)').
+ERROR|COMPILE_TIME_ERROR|INVALID_OVERRIDE|lib/js/js.dart|351|17|3|'JsArray.[]=' ('void Function(dynamic, E)') isn't a valid override of 'JsObject.[]=' ('void Function(dynamic, dynamic)').
+ERROR|STATIC_TYPE_WARNING|UNDEFINED_OPERATOR|lib/_internal/js_runtime/lib/interceptors.dart|1672|28|1|The operator '&' isn't defined for the class 'JSInt'.
+ERROR|STATIC_TYPE_WARNING|UNDEFINED_OPERATOR|lib/_internal/js_runtime/lib/interceptors.dart|1674|27|1|The operator '&' isn't defined for the class 'JSInt'.
+ERROR|STATIC_TYPE_WARNING|UNDEFINED_OPERATOR|lib/_internal/js_runtime/lib/interceptors.dart|1677|17|1|The operator '&' isn't defined for the class 'JSInt'.
+ERROR|STATIC_TYPE_WARNING|UNDEFINED_OPERATOR|lib/_internal/js_runtime/lib/interceptors.dart|1682|18|1|The operator '&' isn't defined for the class 'JSInt'.
+ERROR|STATIC_TYPE_WARNING|UNDEFINED_OPERATOR|lib/_internal/js_runtime/lib/interceptors.dart|1682|44|1|The operator '&' isn't defined for the class 'JSInt'.
+ERROR|STATIC_WARNING|FINAL_NOT_INITIALIZED|lib/_internal/js_runtime/lib/native_typed_data.dart|31|13|13|The final variable 'lengthInBytes' must be initialized.
+ERROR|STATIC_WARNING|FINAL_NOT_INITIALIZED|lib/_internal/js_runtime/lib/native_typed_data.dart|320|20|6|The final variable 'buffer' must be initialized.
+ERROR|STATIC_WARNING|FINAL_NOT_INITIALIZED|lib/_internal/js_runtime/lib/native_typed_data.dart|324|13|13|The final variable 'lengthInBytes' must be initialized.
+ERROR|STATIC_WARNING|FINAL_NOT_INITIALIZED|lib/_internal/js_runtime/lib/native_typed_data.dart|328|13|13|The final variable 'offsetInBytes' must be initialized.
+ERROR|STATIC_WARNING|FINAL_NOT_INITIALIZED|lib/_internal/js_runtime/lib/native_typed_data.dart|333|13|18|The final variable 'elementSizeInBytes' must be initialized.
diff --git a/pkg/dev_compiler/tool/nnbd_sdk_error_golden.txt b/pkg/dev_compiler/tool/dartdevc_nnbd_sdk_error_golden.txt
similarity index 100%
rename from pkg/dev_compiler/tool/nnbd_sdk_error_golden.txt
rename to pkg/dev_compiler/tool/dartdevc_nnbd_sdk_error_golden.txt
diff --git a/pkg/dev_compiler/tool/patch_sdk.dart b/pkg/dev_compiler/tool/patch_sdk.dart
index 4cb4962..755de10 100755
--- a/pkg/dev_compiler/tool/patch_sdk.dart
+++ b/pkg/dev_compiler/tool/patch_sdk.dart
@@ -261,8 +261,16 @@
     var name = _qualifiedName(node);
     var patchNode = patch.patches[name];
     if (patchNode == null) {
-      print('warning: patch not found for $name: $node');
-      patchWasMissing = true;
+      // *.fromEnvironment are left unpatched by dart2js and are handled via
+      // codegen.
+      if (name != 'bool.fromEnvironment' &&
+          name != 'int.fromEnvironment' &&
+          name != 'String.fromEnvironment') {
+        print('warning: patch not found for $name: $node');
+        // TODO(sigmund): delete this fail logic? Rather than emit an empty
+        // file, it's more useful to emit a file with missing patches.
+        // patchWasMissing = true;
+      }
       return;
     }
 
diff --git a/sdk_nnbd/bin/dart2js b/sdk_nnbd/bin/dart2js
index cfc91b1..9c562ec 100755
--- a/sdk_nnbd/bin/dart2js
+++ b/sdk_nnbd/bin/dart2js
@@ -52,4 +52,4 @@
 
 DART2JS="package:compiler/src/dart2js.dart"
 
-exec "$DART" "--packages=$DART_ROOT/.packages" "${EXTRA_VM_OPTIONS[@]}" "$DART2JS" "${EXTRA_OPTIONS[@]}" "$@"
+exec "$DART" "--packages=$DART_ROOT/.packages" --enable-experiment=non-nullable "${EXTRA_VM_OPTIONS[@]}" "$DART2JS" "${EXTRA_OPTIONS[@]}" "$@"
diff --git a/sdk_nnbd/bin/dart2js_sdk b/sdk_nnbd/bin/dart2js_sdk
index e7999b4..03999f9 100755
--- a/sdk_nnbd/bin/dart2js_sdk
+++ b/sdk_nnbd/bin/dart2js_sdk
@@ -55,4 +55,4 @@
   EXTRA_VM_OPTIONS+=("${OPTIONS[@]}")
 fi
 
-exec "$DART" "${EXTRA_VM_OPTIONS[@]}" "$SNAPSHOT" "${EXTRA_OPTIONS[@]}" "$@"
+exec "$DART" --enable-experiment=non-nullable "${EXTRA_VM_OPTIONS[@]}" "$SNAPSHOT" "${EXTRA_OPTIONS[@]}" "$@"
diff --git a/tools/bots/test_matrix.json b/tools/bots/test_matrix.json
index 58478fb..1d2a195 100644
--- a/tools/bots/test_matrix.json
+++ b/tools/bots/test_matrix.json
@@ -140,6 +140,43 @@
       "xcodebuild/ReleaseX64/dart2js_platform.dill",
       "xcodebuild/ReleaseX64/dart2js_platform_strong.dill"
     ],
+    "dart2js_hostasserts_nnbd": [
+      ".packages",
+      "out/ReleaseX64NNBD/dart",
+      "out/ReleaseX64NNBD/dart2js_platform.dill",
+      "out/ReleaseX64NNBD/dart2js_platform_strong.dill",
+      "pkg/",
+      "runtime/tests/",
+      "samples-dev/",
+      "samples/",
+      "sdk/",
+      "sdk_nnbd/",
+      "tests/angular/",
+      "tests/co19_2/co19_2-analyzer.status",
+      "tests/co19_2/co19_2-co19.status",
+      "tests/co19_2/co19_2-dart2js.status",
+      "tests/co19_2/co19_2-dartdevc.status",
+      "tests/co19_2/co19_2-kernel.status",
+      "tests/co19_2/co19_2-runtime.status",
+      "tests/compiler/",
+      "tests/corelib_2/",
+      "tests/dart/",
+      "tests/kernel/",
+      "tests/language_2/",
+      "tests/lib_2/",
+      "tests/light_unittest.dart",
+      "tests/search/",
+      "tests/standalone_2/",
+      "tests/ffi/",
+      "third_party/d8/",
+      "third_party/pkg/",
+      "third_party/pkg_tested/",
+      "third_party/requirejs/",
+      "tools/",
+      "xcodebuild/ReleaseX64NNBD/dart",
+      "xcodebuild/ReleaseX64NNBD/dart2js_platform.dill",
+      "xcodebuild/ReleaseX64NNBD/dart2js_platform_strong.dill"
+    ],
     "front-end": [
       ".packages",
       "out/ReleaseIA32/",
@@ -370,6 +407,13 @@
       "options": {
         "use-sdk": true
     }},
+    "dart2js-weak-(linux|mac|win)-x64-d8": {
+      "options": {
+        "builder-tag": "dart2js-weak",
+        "enable-experiment": ["non-nullable"],
+        "dart2js-options": ["--no-runtime-null-safety"],
+        "use-sdk": true
+    }},
     "dart2js-(linux|win)-firefox": {
       "options": {
         "use-sdk": true
@@ -408,6 +452,13 @@
       "options": {
         "host-checked": true
     }},
+    "dart2js-hostasserts-weak-(linux|mac|win)-x64-d8": {
+      "options": {
+        "builder-tag": "dart2js-weak",
+        "enable-experiment": ["non-nullable"],
+        "dart2js-options": ["--no-runtime-null-safety"],
+        "host-checked": true
+    }},
     "dart2js-old-rti-(linux|mac|win)-x64-d8": {
       "options": {
         "builder-tag": "old_rti",
@@ -578,7 +629,6 @@
         "use-sdk": true,
         "enable-experiment": ["non-nullable"],
         "enable-asserts": true
-
     }},
     "cfe-(linux|mac|win)": {
       "options": {
@@ -1998,8 +2048,32 @@
           "script": "tools/build.py",
           "arguments": [
             "--nnbd",
-            "create_sdk"
+            "create_sdk",
+            "dart2js_bot"
           ]
+        },
+        {
+          "name": "check dart nnbd sdk for static errors",
+          "script": "out/ReleaseX64NNBD/dart-sdk/bin/dart",
+          "arguments": [
+            "--enable-experiment=non-nullable",
+            "pkg/dev_compiler/tool/check_nnbd_sdk.dart",
+            "--target",
+            "dart2js_server"
+          ]
+        },
+        {
+          "name": "dart2js nnbd weak tests",
+          "arguments": [
+            "-ndart2js-hostasserts-weak-linux-x64-d8",
+            "--dart2js-batch",
+            "language_2",
+            "corelib_2",
+            "dart2js_extra",
+            "dart2js_native"
+          ],
+          "shards": 6,
+          "fileset": "dart2js_hostasserts_nnbd"
         }
       ]
     },
diff --git a/utils/compiler/BUILD.gn b/utils/compiler/BUILD.gn
index 72becc6..03fe4df 100644
--- a/utils/compiler/BUILD.gn
+++ b/utils/compiler/BUILD.gn
@@ -34,7 +34,6 @@
   script = "create_snapshot_entry.dart"
 
   inputs = [
-    "../../sdk/lib/_internal/sdk_library_metadata/lib/libraries.dart",
     "$target_gen_dir/dart2js_files.stamp",
     "../../tools/make_version.py",
     "../../tools/VERSION",
@@ -69,8 +68,13 @@
   training_args = [
     "--packages=" + rebase_path("../../.packages"),
     "--libraries-spec=" + rebase_path("../../$libraries_specification_path"),
-    rebase_path("$target_gen_dir/dart2js.dart"),
   ]
+
+  if (use_nnbd) {
+    training_args += [ "--enable-experiment=non-nullable" ]
+  }
+
+  training_args += [ rebase_path("$target_gen_dir/dart2js.dart") ]
 }
 
 compile_platform("compile_dart2js_platform") {
@@ -88,6 +92,10 @@
     "--target=dart2js",
     "dart:core",
   ]
+
+  if (use_nnbd) {
+    args += [ "--enable-experiment=non-nullable" ]
+  }
 }
 compile_platform("compile_dart2js_server_platform") {
   single_root_scheme = "org-dartlang-sdk"
@@ -104,4 +112,8 @@
     "--target=dart2js_server",
     "dart:core",
   ]
+
+  if (use_nnbd) {
+    args += [ "--enable-experiment=non-nullable" ]
+  }
 }