[ddc] Break out builds of ddc module format

Build all ddc module format outputs in separate invocations of the
compiler. This allows for DDC to detect `--modules=ddc` and
`--canary` and enable library bundles. This alternate "ddc" format
is where hot reload is being developed and tested. When ready, it
will become the only supported module format.

Change-Id: I932237c15d710d92db327177a8d6ca59d21a0a23
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/378545
Reviewed-by: Srujan Gaddam <srujzs@google.com>
Commit-Queue: Nicholas Shahan <nshahan@google.com>
diff --git a/utils/ddc/BUILD.gn b/utils/ddc/BUILD.gn
index 7689613..c8b08b2 100644
--- a/utils/ddc/BUILD.gn
+++ b/utils/ddc/BUILD.gn
@@ -114,8 +114,10 @@
 group("ddc_canary_test_local") {
   deps = [
     ":ddc_canary_sdk",
+    ":ddc_canary_sdk_ddc_module",
     ":ddc_canary_test_pkg",
     ":ddc_canary_unsound_sdk",
+    ":ddc_canary_unsound_sdk_ddc_module",
   ]
 }
 
@@ -149,14 +151,22 @@
 # Compiles to JavaScript using DDC (canary) all packages imported in tests.
 group("ddc_canary_test_pkg") {
   deps = [
+    ":async_helper_canary_ddc_js",
     ":async_helper_canary_js",
+    ":async_helper_canary_unsound_ddc_js",
     ":async_helper_canary_unsound_js",
     ":ddc_test_pkg_outline",
+    ":expect_canary_ddc_js",
     ":expect_canary_js",
+    ":expect_canary_unsound_ddc_js",
     ":expect_canary_unsound_js",
+    ":js_canary_ddc_js",
     ":js_canary_js",
+    ":js_canary_unsound_ddc_js",
     ":js_canary_unsound_js",
+    ":meta_canary_ddc_js",
     ":meta_canary_js",
+    ":meta_canary_unsound_ddc_js",
     ":meta_canary_unsound_js",
   ]
 }
@@ -179,6 +189,8 @@
          "Need 'package' in $target_name (the name of the package)")
   assert(defined(invoker.sound_null_safety),
          "Need 'sound_null_safety' in $target_name.")
+  assert(defined(invoker.canary), "Need 'canary' in $target_name.")
+  assert(defined(invoker.modules), "Need 'modules' in $target_name.")
 
   # Determine one of four possible directories for the JavaScript output to be
   # generated:
@@ -214,7 +226,7 @@
 
   prebuilt_dart_action(target_name) {
     script = "../../pkg/dev_compiler/bin/dartdevc.dart"
-    module = invoker.package
+    package_name = invoker.package
     out_dir = rebase_path("$js_gen_dir")
     sdk_path = rebase_path(sdk_outline)
     pkg_root = rebase_path("$root_build_dir/../../pkg")
@@ -229,29 +241,32 @@
       "$target_gen_dir/ddc_files.stamp",
     ]
 
-    outputs = [
-      "$js_gen_dir/amd/$module.js",
-      "$js_gen_dir/amd/$module.js.map",
-      "$js_gen_dir/ddc/$module.js",
-      "$js_gen_dir/ddc/$module.js.map",
-    ]
+    outputs = []
+    args = []
+    foreach(module, invoker.modules) {
+      outputs += [
+        "$js_gen_dir/$module/$package_name.js",
+        "$js_gen_dir/$module/$package_name.js.map",
+      ]
+
+      args += [
+        "--modules=$module",
+        "-o$out_dir/$module/$package_name.js",
+      ]
+    }
 
     vm_args = [ "-Dsdk_hash=$sdk_hash" ]
 
-    args = [
+    args += [
       "--no-summarize",
       "--multi-root-output-path=$pkg_root",
       "--dart-sdk-summary=$sdk_path",
-      "--modules=amd",
-      "-o$out_dir/amd/$module.js",
-      "--modules=ddc",
-      "-o$out_dir/ddc/$module.js",
-      "package:$module/$module.dart",
+      "package:$package_name/$package_name.dart",
     ]
 
     if (defined(invoker.extra_libraries)) {
       foreach(lib, invoker.extra_libraries) {
-        args += [ "package:$module/$lib.dart" ]
+        args += [ "package:$package_name/$lib.dart" ]
       }
     }
 
@@ -349,24 +364,48 @@
 ddc_compile("async_helper_stable_js") {
   package = "async_helper"
   canary = false
+  modules = [
+    "amd",
+    "ddc",
+  ]
   sound_null_safety = true
 }
 
 ddc_compile("async_helper_canary_js") {
   package = "async_helper"
   canary = true
+  modules = [ "amd" ]
+  sound_null_safety = true
+}
+
+ddc_compile("async_helper_canary_ddc_js") {
+  package = "async_helper"
+  canary = true
+  modules = [ "ddc" ]
   sound_null_safety = true
 }
 
 ddc_compile("async_helper_stable_unsound_js") {
   package = "async_helper"
   canary = false
+  modules = [
+    "amd",
+    "ddc",
+  ]
   sound_null_safety = false
 }
 
 ddc_compile("async_helper_canary_unsound_js") {
   package = "async_helper"
   canary = true
+  modules = [ "amd" ]
+  sound_null_safety = false
+}
+
+ddc_compile("async_helper_canary_unsound_ddc_js") {
+  package = "async_helper"
+  canary = true
+  modules = [ "ddc" ]
   sound_null_safety = false
 }
 
@@ -386,6 +425,10 @@
   package = "expect"
   extra_libraries = [ "minitest" ]
   canary = false
+  modules = [
+    "amd",
+    "ddc",
+  ]
   sound_null_safety = true
 }
 
@@ -393,6 +436,15 @@
   package = "expect"
   extra_libraries = [ "minitest" ]
   canary = true
+  modules = [ "amd" ]
+  sound_null_safety = true
+}
+
+ddc_compile("expect_canary_ddc_js") {
+  package = "expect"
+  extra_libraries = [ "minitest" ]
+  canary = true
+  modules = [ "ddc" ]
   sound_null_safety = true
 }
 
@@ -400,6 +452,10 @@
   package = "expect"
   extra_libraries = [ "minitest" ]
   canary = false
+  modules = [
+    "amd",
+    "ddc",
+  ]
   sound_null_safety = false
 }
 
@@ -407,6 +463,15 @@
   package = "expect"
   extra_libraries = [ "minitest" ]
   canary = true
+  modules = [ "amd" ]
+  sound_null_safety = false
+}
+
+ddc_compile("expect_canary_unsound_ddc_js") {
+  package = "expect"
+  extra_libraries = [ "minitest" ]
+  canary = true
+  modules = [ "ddc" ]
   sound_null_safety = false
 }
 
@@ -426,6 +491,10 @@
   package = "js"
   extra_libraries = [ "js_util" ]
   canary = false
+  modules = [
+    "amd",
+    "ddc",
+  ]
   sound_null_safety = true
 }
 
@@ -433,12 +502,26 @@
   package = "js"
   extra_libraries = [ "js_util" ]
   canary = true
+  modules = [ "amd" ]
   sound_null_safety = true
 }
+
+ddc_compile("js_canary_ddc_js") {
+  package = "js"
+  extra_libraries = [ "js_util" ]
+  canary = true
+  modules = [ "ddc" ]
+  sound_null_safety = true
+}
+
 ddc_compile("js_stable_unsound_js") {
   package = "js"
   extra_libraries = [ "js_util" ]
   canary = false
+  modules = [
+    "amd",
+    "ddc",
+  ]
   sound_null_safety = false
 }
 
@@ -446,6 +529,15 @@
   package = "js"
   extra_libraries = [ "js_util" ]
   canary = true
+  modules = [ "amd" ]
+  sound_null_safety = false
+}
+
+ddc_compile("js_canary_unsound_ddc_js") {
+  package = "js"
+  extra_libraries = [ "js_util" ]
+  canary = true
+  modules = [ "ddc" ]
   sound_null_safety = false
 }
 
@@ -462,24 +554,48 @@
 ddc_compile("meta_stable_js") {
   package = "meta"
   canary = false
+  modules = [
+    "amd",
+    "ddc",
+  ]
   sound_null_safety = true
 }
 
 ddc_compile("meta_canary_js") {
   package = "meta"
   canary = true
+  modules = [ "amd" ]
+  sound_null_safety = true
+}
+
+ddc_compile("meta_canary_ddc_js") {
+  package = "meta"
+  canary = true
+  modules = [ "ddc" ]
   sound_null_safety = true
 }
 
 ddc_compile("meta_stable_unsound_js") {
   package = "meta"
   canary = false
+  modules = [
+    "amd",
+    "ddc",
+  ]
   sound_null_safety = false
 }
 
 ddc_compile("meta_canary_unsound_js") {
   package = "meta"
   canary = true
+  modules = [ "amd" ]
+  sound_null_safety = false
+}
+
+ddc_compile("meta_canary_unsound_ddc_js") {
+  package = "meta"
+  canary = true
+  modules = [ "ddc" ]
   sound_null_safety = false
 }
 
@@ -527,6 +643,8 @@
 template("ddc_compile_sdk") {
   assert(defined(invoker.sound_null_safety),
          "Need 'sound_null_safety' in $target_name.")
+  assert(defined(invoker.canary), "Need 'canary' in $target_name.")
+  assert(defined(invoker.modules), "Need 'modules' in $target_name.")
 
   # Determine one of four possible directories for the JavaScript output to be
   # generated:
@@ -559,22 +677,28 @@
 
     inputs = [ platform_input ]
 
-    outputs = [
-      "$js_gen_dir/amd/dart_sdk.js",
-      "$js_gen_dir/amd/dart_sdk.js.map",
-      "$js_gen_dir/common/dart_sdk.js",
-      "$js_gen_dir/common/dart_sdk.js.map",
-      "$js_gen_dir/es6/dart_sdk.js",
-      "$js_gen_dir/es6/dart_sdk.js.map",
-      "$js_gen_dir/ddc/dart_sdk.js",
-      "$js_gen_dir/ddc/dart_sdk.js.map",
-    ]
+    outputs = []
+    args = []
+
+    foreach(module, invoker.modules) {
+      outputs += [
+        "$js_gen_dir/$module/dart_sdk.js",
+        "$js_gen_dir/$module/dart_sdk.js.map",
+      ]
+
+      args += [
+        "--modules",
+        "$module",
+        "-o",
+        rebase_path("$js_gen_dir/$module/dart_sdk.js"),
+      ]
+    }
 
     vm_args = [ "-Dsdk_hash=$sdk_hash" ]
 
     script = "../../pkg/dev_compiler/bin/dartdevc.dart"
 
-    args = [
+    args += [
       "--multi-root-scheme",
       "org-dartlang-sdk",
       "--multi-root-output-path",
@@ -586,22 +710,6 @@
       # These JavaScript files and source maps are no longer packaged into the
       # released SDK.
       rebase_path("$target_gen_dir/../../../dart-sdk"),
-      "--modules",
-      "amd",
-      "-o",
-      rebase_path("$js_gen_dir/amd/dart_sdk.js"),
-      "--modules",
-      "common",
-      "-o",
-      rebase_path("$js_gen_dir/common/dart_sdk.js"),
-      "--modules",
-      "es6",
-      "-o",
-      rebase_path("$js_gen_dir/es6/dart_sdk.js"),
-      "--modules",
-      "ddc",
-      "-o",
-      rebase_path("$js_gen_dir/ddc/dart_sdk.js"),
       rebase_path("$platform_input"),
     ]
 
@@ -619,20 +727,66 @@
 
 ddc_compile_sdk("ddc_stable_sdk") {
   canary = false
+  modules = [
+    "amd",
+    "common",
+    "es6",
+    "ddc",
+  ]
   sound_null_safety = true
 }
 
 ddc_compile_sdk("ddc_stable_unsound_sdk") {
   canary = false
+  modules = [
+    "amd",
+    "common",
+    "es6",
+    "ddc",
+  ]
   sound_null_safety = false
 }
 
 ddc_compile_sdk("ddc_canary_sdk") {
   canary = true
+  modules = [
+    "amd",
+    "common",
+    "es6",
+  ]
+  sound_null_safety = true
+}
+
+# Compiles the DDC SDK JavaScript modules from the platform .dill file in the
+# "ddc" module format only.
+#
+# This allows for them to be built individually (only passing one `--modules`
+# flag value) so that when also passing the `--canary` flag it will trigger
+# DDC to enable the option for the new library bundle format.
+ddc_compile_sdk("ddc_canary_sdk_ddc_module") {
+  canary = true
+  modules = [ "ddc" ]
   sound_null_safety = true
 }
 
 ddc_compile_sdk("ddc_canary_unsound_sdk") {
   canary = true
+  modules = [
+    "amd",
+    "common",
+    "es6",
+  ]
+  sound_null_safety = false
+}
+
+# Compiles the DDC SDK JavaScript modules from the platform .dill file in the
+# "ddc" module format only.
+#
+# This allows for them to be built individually (only passing one `--modules`
+# flag value) so that when also passing the `--canary` flag it will trigger
+# DDC to enable the option for the new library bundle format.
+ddc_compile_sdk("ddc_canary_unsound_sdk_ddc_module") {
+  canary = true
+  modules = [ "ddc" ]
   sound_null_safety = false
 }