Revert "Revert "test: Add desugar support to run-test""

This reverts commit 75e7c9cc3db9547127dbc706f9a4fade54a41600.

Change-Id: I7932e27b5307bbe7b60184dd5faf24bd336aa63a
diff --git a/test/etc/default-build b/test/etc/default-build
index 0508b85..9e2a6e2 100755
--- a/test/etc/default-build
+++ b/test/etc/default-build
@@ -70,6 +70,9 @@
 SKIP_DX_MERGER="false"
 EXPERIMENTAL=""
 
+BUILD_MODE="target"
+DEV_MODE="no"
+
 # The key for default arguments if no experimental things are enabled.
 DEFAULT_EXPERIMENT="no-experiment"
 
@@ -137,6 +140,15 @@
     WITH_ZIP_ALIGN=true
     ZIP_ALIGN_BYTES="$1"
     shift
+  elif [ "x$1" = "x--host" ]; then
+    BUILD_MODE="host"
+    shift
+  elif [ "x$1" = "x--target" ]; then
+    BUILD_MODE="target"
+    shift
+  elif [ "x$1" = "x--dev" ]; then
+    DEV_MODE="yes"
+    shift
   elif expr "x$1" : "x--" >/dev/null 2>&1; then
     echo "unknown $0 option: $1" 1>&2
     exit 1
@@ -185,6 +197,41 @@
   fi
 }
 
+function desugar() {
+  local desugar_args=--mode=host
+  if [[ $BUILD_MODE == target ]]; then
+    desugar_args=--mode=target
+  fi
+
+  if [[ $DEV_MODE == yes ]]; then
+    desugar_args="$desugar_args --show-commands"
+  fi
+
+  "${ANDROID_BUILD_TOP}/art/tools/desugar.sh" --core-only $desugar_args "$@"
+}
+
+# Make a "dex" file given a directory of classes in $1.
+# Also calls desugar on the classes first to convert lambdas.
+function make_dex() {
+  local name="$1"
+
+  local dx_input
+  if [[ "$USE_DESUGAR" == "true" ]]; then
+    # Make a jar first so desugar doesn't need every .class file individually.
+    jar cf "$name.before-desugar.jar" -C "$name" .
+
+    dx_input="${name}.desugar.jar"
+
+    # Make desugared JAR.
+    desugar --input "$name.before-desugar.jar" --output "$dx_input"
+  else
+    dx_input="${name}"
+  fi
+
+  # Make dex file from desugared JAR.
+  ${DX} -JXmx256m --debug --dex --dump-to=${name}.lst --output=${name}.dex --dump-width=1000 ${DX_FLAGS} "${dx_input}"
+}
+
 if [ -e classes.dex ]; then
   zip $TEST_NAME.jar classes.dex
   exit 0
@@ -209,9 +256,9 @@
     ${JACK} --import classes.jill.jar --output-dex .
   else
     if [ ${NEED_DEX} = "true" ]; then
-      ${DX} -JXmx256m --debug --dex --dump-to=classes-ex.lst --output=classes.dex --dump-width=1000 ${DX_FLAGS} classes-ex
+      make_dex classes-ex
       zip ${TEST_NAME}-ex.jar classes.dex
-      ${DX} -JXmx256m --debug --dex --dump-to=classes.lst --output=classes.dex --dump-width=1000 ${DX_FLAGS} classes
+      make_dex classes
     fi
   fi
 else
@@ -254,8 +301,7 @@
       mkdir classes2
       ${JAVAC} -implicit:none -classpath src -d classes2 `find src-multidex -name '*.java'`
       if [ ${NEED_DEX} = "true" ]; then
-        ${DX} -JXmx256m --debug --dex --dump-to=classes2.lst --output=classes2.dex \
-          --dump-width=1000 ${DX_FLAGS} classes2
+        make_dex classes2
       fi
     fi
 
@@ -266,8 +312,7 @@
 
     if [ "${HAS_SRC}" = "true" ] || [ "${HAS_SRC2}" = "true" ]; then
       if [ ${NEED_DEX} = "true" -a ${SKIP_DX_MERGER} = "false" ]; then
-        ${DX} -JXmx256m --debug --dex --dump-to=classes.lst --output=classes.dex \
-          --dump-width=1000 ${DX_FLAGS} classes
+        make_dex classes
       fi
     fi
   fi
@@ -311,8 +356,7 @@
     mkdir classes-ex
     ${JAVAC} ${JAVAC_ARGS} -d classes-ex -cp classes `find src-ex -name '*.java'`
     if [ ${NEED_DEX} = "true" ]; then
-      ${DX} -JXmx256m --debug --dex --dump-to=classes-ex.lst --output=classes-ex.dex \
-        --dump-width=1000 ${DX_FLAGS} classes-ex
+      make_dex classes-ex
 
       # quick shuffle so that the stored name is "classes.dex"
       mv classes.dex classes-1.dex