Add support for using source when using compile-dump and run_on_app

Change-Id: I19cad28813a443b5ce83c8188d793094086d715f
diff --git a/tools/compiledump.py b/tools/compiledump.py
index 48c596b..5919e3f 100755
--- a/tools/compiledump.py
+++ b/tools/compiledump.py
@@ -38,6 +38,7 @@
     help='Compiler version to use (default read from dump version file).'
       'Valid arguments are:'
       '  "master" to run from your own tree,'
+      '  "source" to run from build classes directly,'
       '  "X.Y.Z" to run a specific version, or'
       '  <hash> to run that hash from master.',
     default=None)
@@ -209,6 +210,8 @@
 def download_distribution(args, version, temp):
   if version == 'master':
     return utils.R8_JAR if args.nolib else utils.R8LIB_JAR
+  if version == 'source':
+    return '%s:%s' % (utils.BUILD_JAVA_MAIN_DIR, utils.ALL_DEPS_JAR)
   name = 'r8.jar' if args.nolib else 'r8lib.jar'
   source = archive.GetUploadDestination(version, name, is_hash(version))
   dest = os.path.join(temp, 'r8.jar')
@@ -299,7 +302,7 @@
       return 0
     except subprocess.CalledProcessError, e:
       print e.output
-      if not args.nolib:
+      if not args.nolib and version != 'source':
         stacktrace = os.path.join(temp, 'stacktrace')
         open(stacktrace, 'w+').write(e.output)
         local_map = utils.R8LIB_MAP if version == 'master' else None
diff --git a/tools/run_on_app_dump.py b/tools/run_on_app_dump.py
index 2cac8c2..5c7468d 100755
--- a/tools/run_on_app_dump.py
+++ b/tools/run_on_app_dump.py
@@ -369,6 +369,10 @@
   return '-full' in shrinker
 
 
+def version_is_built_jar(version):
+  return version != 'master' and version != 'source'
+
+
 def compute_size_of_dex_files_in_package(path):
   dex_size = 0
   z = zipfile.ZipFile(path, 'r')
@@ -386,6 +390,13 @@
   return os.path.join(app_dir, app.dump_test)
 
 
+def get_r8_jar(options, temp_dir, shrinker):
+  if (options.version == 'source'):
+    return None
+  return os.path.join(
+      temp_dir, 'r8lib.jar' if is_minified_r8(shrinker) else 'r8.jar')
+
+
 def get_results_for_app(app, options, temp_dir):
   app_folder = app.folder if app.folder else app.name + "_" + app.revision
   app_dir = os.path.join(utils.OPENSOURCE_DUMPS_DIR, app_folder)
@@ -527,14 +538,12 @@
 def build_app_with_shrinker(app, options, temp_dir, app_dir, shrinker,
                             compilation_step_index, compilation_steps,
                             prev_recomp_jar):
-  r8jar = os.path.join(
-    temp_dir, 'r8lib.jar' if is_minified_r8(shrinker) else 'r8.jar')
 
   args = AttrDict({
     'dump': dump_for_app(app_dir, app),
-    'r8_jar': r8jar,
+    'r8_jar': get_r8_jar(options, temp_dir, shrinker),
     'ea': False if options.disable_assertions else True,
-    'version': 'master',
+    'version': options.version,
     'compiler': 'r8full' if is_full_r8(shrinker) else 'r8',
     'debug_agent': options.debug_agent,
     'program_jar': prev_recomp_jar,
@@ -574,8 +583,6 @@
 
 def build_test_with_shrinker(app, options, temp_dir, app_dir, shrinker,
                              compilation_step_index, mapping):
-  r8jar = os.path.join(
-    temp_dir, 'r8lib.jar' if is_minified_r8(shrinker) else 'r8.jar')
 
   def rewrite_file(file):
     remove_print_lines(file)
@@ -589,9 +596,9 @@
 
   args = AttrDict({
     'dump': dump_test_for_app(app_dir, app),
-    'r8_jar': r8jar,
+    'r8_jar': get_r8_jar(options, temp_dir, shrinker),
     'ea': False if options.disable_assertions else True,
-    'version': 'master',
+    'version': options.version,
     'compiler': 'r8full' if is_full_r8(shrinker) else 'r8',
     'debug_agent': options.debug_agent,
     'nolib': not is_minified_r8(shrinker),
@@ -805,7 +812,7 @@
   else:
     options.shrinker = [shrinker for shrinker in SHRINKERS]
 
-  if options.hash or options.version:
+  if options.hash or version_is_built_jar(options.version):
     # No need to build R8 if a specific version should be used.
     options.no_build = True
     if 'r8-nolib' in options.shrinker:
@@ -845,16 +852,16 @@
       as_utils.MoveFile(
         os.path.join(temp_dir, target), os.path.join(temp_dir, 'r8lib.jar'),
         quiet=options.quiet)
-    elif options.version:
-      # Download r8-<version>.jar from
-      # https://storage.googleapis.com/r8-releases/raw/.
-      target = 'r8-{}.jar'.format(options.version)
-      update_prebuilds_in_android.download_version(
-        temp_dir, 'com/android/tools/r8/' + options.version, target)
-      as_utils.MoveFile(
-        os.path.join(temp_dir, target), os.path.join(temp_dir, 'r8lib.jar'),
-        quiet=options.quiet)
-    else:
+    elif version_is_built_jar(options.version):
+        # Download r8-<version>.jar from
+        # https://storage.googleapis.com/r8-releases/raw/.
+        target = 'r8-{}.jar'.format(options.version)
+        update_prebuilds_in_android.download_version(
+          temp_dir, 'com/android/tools/r8/' + options.version, target)
+        as_utils.MoveFile(
+          os.path.join(temp_dir, target), os.path.join(temp_dir, 'r8lib.jar'),
+          quiet=options.quiet)
+    elif options.version == 'master':
       if not (options.no_build or options.golem):
         gradle.RunGradle(['r8', '-Pno_internal'])
         build_r8lib = False
diff --git a/tools/utils.py b/tools/utils.py
index 0ece764..5396c0a 100644
--- a/tools/utils.py
+++ b/tools/utils.py
@@ -29,6 +29,7 @@
 BUILD = os.path.join(REPO_ROOT, 'build')
 BUILD_DEPS_DIR = os.path.join(BUILD, 'deps')
 BUILD_MAIN_DIR = os.path.join(BUILD, 'classes', 'main')
+BUILD_JAVA_MAIN_DIR = os.path.join(BUILD, 'classes', 'java', 'main')
 BUILD_TEST_DIR = os.path.join(BUILD, 'classes', 'test')
 LIBS = os.path.join(BUILD, 'libs')
 GENERATED_LICENSE_DIR = os.path.join(BUILD, 'generatedLicense')
@@ -43,6 +44,7 @@
 R8_SRC = 'sourceJar'
 LIBRARY_DESUGAR_CONVERSIONS = 'buildLibraryDesugarConversions'
 
+ALL_DEPS_JAR = os.path.join(LIBS, 'deps_all.jar')
 D8_JAR = os.path.join(LIBS, 'd8.jar')
 R8_JAR = os.path.join(LIBS, 'r8.jar')
 R8LIB_JAR = os.path.join(LIBS, 'r8lib.jar')