Merge remote-tracking branch 'aosp/upstream-master' into master

* aosp/upstream-master:
  Clean up android desugar tool's flags a bit
  Change how desugar finds desugared classes to have it working on Windows
  Remove bootclasspath fallback in Android desugaring tool
  Add an --copy_bridges_from_classpath argument
  Desugar calls to Objects.requireNonNull(Object o) to o.getClass()
  Avoid factory methods when desugaring stateless lambdas for Android RELNOTES: Avoid factory methods when desugaring stateless lambdas for Android
  Remove duplicate class.
  More stable naming scheme for lambda classes in desugared android code RELNOTES: More stable naming scheme for lambda classes in desugared android code

Test: m -j ANDROID_COMPILE_WITH_JACK=false
Change-Id: I0ff5b9eb3cac6a020f347c51b79633af13b0576f
diff --git a/Android.mk b/Android.mk
new file mode 100644
index 0000000..013acf9
--- /dev/null
+++ b/Android.mk
@@ -0,0 +1,24 @@
+LOCAL_PATH := $(call my-dir)
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := desugar
+LOCAL_SRC_FILES := $(call all-java-files-under, java)
+LOCAL_JAR_MANIFEST := manifest.txt
+LOCAL_STATIC_JAVA_LIBRARIES := \
+    asm-5.2 \
+    asm-commons-5.2 \
+    asm-tree-5.2 \
+    guava-20.0 \
+    jsr305-3.0.1 \
+    dagger2-auto-value-host \
+
+LOCAL_MODULE_CLASS := JAVA_LIBRARIES
+LOCAL_IS_HOST_MODULE := true
+
+# Use Dagger2 annotation processor
+# b/25860419: annotation processors must be explicitly specified for grok
+PROCESSOR_LIBRARIES := dagger2-auto-value-host
+PROCESSOR_CLASSES := com.google.auto.value.processor.AutoValueProcessor
+include external/dagger2/java_annotation_processors.mk
+
+include $(BUILD_HOST_JAVA_LIBRARY)
diff --git a/copy.bara.sky b/copy.bara.sky
new file mode 100644
index 0000000..bc83110
--- /dev/null
+++ b/copy.bara.sky
@@ -0,0 +1,37 @@
+# Copybara project config for importing desugar tool from bazel
+import_url = "rpc://github/bazelbuild/bazel"
+
+core.workflow(
+    name = "default",
+    origin = git.origin(
+        url = import_url,
+        ref = "master",
+    ),
+    origin_files = glob(
+        include = [
+            "src/tools/android/java/com/google/devtools/build/android/desugar/**",
+            "src/test/java/com/google/devtools/build/android/desugar/**",
+            "src/tools/android/java/com/google/devtools/build/android/Converters.java",
+            "src/main/java/com/google/devtools/common/options/**",
+        ],
+        exclude = [
+            "**/BUILD*",
+        ],
+    ),
+    destination = git.gerrit_destination(
+        url = "sso://android-review/platform/external/desugar",
+        fetch = "upstream-master",
+        push_to_refs_for = "upstream-master",
+    ),
+    authoring = authoring.pass_thru("Bazel Team <no-reply@google.com>"),
+    mode = "ITERATIVE",
+    transformations = [
+        core.verify_match(
+            regex = "Licensed under the Apache License, Version 2.0",
+            paths = glob(["**"]),
+        ),
+        core.move("src/tools/android", ""),
+        core.move("src/main", ""),
+        core.move("src/test/", "test"),
+    ],
+)
diff --git a/java/com/google/devtools/build/android/Converters.java b/java/com/google/devtools/build/android/Converters.java
index 63f5980..6b40027 100644
--- a/java/com/google/devtools/build/android/Converters.java
+++ b/java/com/google/devtools/build/android/Converters.java
@@ -13,26 +13,13 @@
 // limitations under the License.
 package com.google.devtools.build.android;
 
-import com.android.builder.core.VariantType;
-import com.android.manifmerger.ManifestMerger2;
-import com.android.manifmerger.ManifestMerger2.MergeType;
-import com.android.repository.Revision;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
 import com.google.devtools.common.options.Converter;
-import com.google.devtools.common.options.EnumConverter;
 import com.google.devtools.common.options.OptionsParsingException;
 import java.io.File;
-import java.lang.reflect.ParameterizedType;
 import java.nio.file.FileSystems;
 import java.nio.file.Files;
 import java.nio.file.InvalidPathException;
 import java.nio.file.Path;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
 
 /**
  * Some convenient converters used by android actions. Note: These are specific to android actions.
@@ -48,186 +35,6 @@
     }
   };
 
-  /**
-   * Converter for {@link UnvalidatedAndroidData}. Relies on
-   * {@code UnvalidatedAndroidData#valueOf(String)} to perform conversion and validation.
-   */
-  public static class UnvalidatedAndroidDataConverter implements Converter<UnvalidatedAndroidData> {
-
-    @Override
-    public UnvalidatedAndroidData convert(String input) throws OptionsParsingException {
-      try {
-        return UnvalidatedAndroidData.valueOf(input);
-      } catch (IllegalArgumentException e) {
-        throw new OptionsParsingException(
-            String.format("invalid UnvalidatedAndroidData: %s", e.getMessage()), e);
-      }
-    }
-
-    @Override
-    public String getTypeDescription() {
-      return "unvalidated android data in the format " + UnvalidatedAndroidData.EXPECTED_FORMAT;
-    }
-  }
-
-  /**
-   * Converter for {@link UnvalidatedAndroidDirectories}.
-   */
-  public static class UnvalidatedAndroidDirectoriesConverter
-      implements Converter<UnvalidatedAndroidDirectories> {
-
-    @Override
-    public UnvalidatedAndroidDirectories convert(String input) throws OptionsParsingException {
-      try {
-        return UnvalidatedAndroidDirectories.valueOf(input);
-      } catch (IllegalArgumentException e) {
-        throw new OptionsParsingException(
-            String.format("invalid UnvalidatedAndroidDirectories: %s", e.getMessage()), e);
-      }
-    }
-
-    @Override
-    public String getTypeDescription() {
-      return "unvalidated android directories in the format "
-          + UnvalidatedAndroidDirectories.EXPECTED_FORMAT;
-    }
-  }
-
-  /**
-   * Converter for a list of {@link DependencyAndroidData}. Relies on
-   * {@code DependencyAndroidData#valueOf(String)} to perform conversion and validation.
-   */
-  public static class DependencyAndroidDataListConverter
-      implements Converter<List<DependencyAndroidData>> {
-
-    @Override
-    public List<DependencyAndroidData> convert(String input) throws OptionsParsingException {
-      if (input.isEmpty()) {
-        return ImmutableList.of();
-      }
-      try {
-        ImmutableList.Builder<DependencyAndroidData> builder = ImmutableList.builder();
-        for (String item : input.split(",")) {
-          builder.add(DependencyAndroidData.valueOf(item));
-        }
-        return builder.build();
-      } catch (IllegalArgumentException e) {
-        throw new OptionsParsingException(
-            String.format("invalid DependencyAndroidData: %s", e.getMessage()), e);
-      }
-    }
-
-    @Override
-    public String getTypeDescription() {
-      return "a list of dependency android data in the format "
-          + DependencyAndroidData.EXPECTED_FORMAT + "[,...]";
-    }
-  }
-
-  /**
-   * Converter for a {@link SerializedAndroidData}.
-   */
-  public static class SerializedAndroidDataConverter implements Converter<SerializedAndroidData> {
-
-    @Override
-    public SerializedAndroidData convert(String input) throws OptionsParsingException {
-      try {
-        return SerializedAndroidData.valueOf(input);
-      } catch (IllegalArgumentException e) {
-        throw new OptionsParsingException(
-            String.format("invalid SerializedAndroidData: %s", e.getMessage()), e);
-      }
-    }
-
-    @Override
-    public String getTypeDescription() {
-      return "preparsed android data in the format " + SerializedAndroidData.EXPECTED_FORMAT;
-    }
-  }
-
-  /**
-   * Converter for a list of {@link SerializedAndroidData}.
-   */
-  public static class SerializedAndroidDataListConverter
-      implements Converter<List<SerializedAndroidData>> {
-
-    @Override
-    public List<SerializedAndroidData> convert(String input) throws OptionsParsingException {
-      if (input.isEmpty()) {
-        return ImmutableList.of();
-      }
-      try {
-        ImmutableList.Builder<SerializedAndroidData> builder = ImmutableList.builder();
-        for (String entry : input.split("&")) {
-          builder.add(SerializedAndroidData.valueOf(entry));
-        }
-        return builder.build();
-      } catch (IllegalArgumentException e) {
-        throw new OptionsParsingException(
-            String.format("invalid SerializedAndroidData: %s", e.getMessage()), e);
-      }
-    }
-
-    @Override
-    public String getTypeDescription() {
-      return "a list of preparsed android data in the format "
-          + SerializedAndroidData.EXPECTED_FORMAT + "[&...]";
-    }
-  }
-
-  /**
-   * Converter for a list of {@link DependencySymbolFileProvider}. Relies on
-   * {@code DependencySymbolFileProvider#valueOf(String)} to perform conversion and validation.
-   */
-  public static class DependencySymbolFileProviderListConverter
-      implements Converter<List<DependencySymbolFileProvider>> {
-
-    @Override
-    public List<DependencySymbolFileProvider> convert(String input) throws OptionsParsingException {
-      if (input.isEmpty()) {
-        return ImmutableList.<DependencySymbolFileProvider>of();
-      }
-      try {
-        ImmutableList.Builder<DependencySymbolFileProvider> builder = ImmutableList.builder();
-        for (String item : input.split(",")) {
-          builder.add(DependencySymbolFileProvider.valueOf(item));
-        }
-        return builder.build();
-      } catch (IllegalArgumentException e) {
-        throw new OptionsParsingException(
-            String.format("invalid DependencyAndroidData: %s", e.getMessage()), e);
-      }
-    }
-
-    @Override
-    public String getTypeDescription() {
-      return String.format("a list of dependency android data in the format: %s[%s]",
-          DependencySymbolFileProvider.commandlineFormat("1"),
-          DependencySymbolFileProvider.commandlineFormat("2"));
-    }
-  }
-
-  /**
-   * Converter for {@link Revision}. Relies on {@code Revision#parseRevision(String)} to
-   * perform conversion and validation.
-   */
-  public static class RevisionConverter implements Converter<Revision> {
-
-    @Override
-    public Revision convert(String input) throws OptionsParsingException {
-      try {
-        return Revision.parseRevision(input);
-      } catch (NumberFormatException e) {
-        throw new OptionsParsingException(e.getMessage());
-      }
-    }
-
-    @Override
-    public String getTypeDescription() {
-      return "a revision number";
-    }
-  }
-
   /** Validating converter for Paths. A Path is considered valid if it resolves to a file. */
   public static class PathConverter implements Converter<Path> {
 
@@ -270,162 +77,4 @@
       super(true);
     }
   }
-
-  /** Converter for {@link VariantType}. */
-  public static class VariantTypeConverter extends EnumConverter<VariantType> {
-    public VariantTypeConverter() {
-      super(VariantType.class, "variant type");
-    }
-  }
-
-  /** Converter for {@link ManifestMerger2}.{@link MergeType}. */
-  public static class MergeTypeConverter
-      extends EnumConverter<MergeType> {
-    public MergeTypeConverter() {
-      super(MergeType.class, "merge type");
-    }
-  }
-
-  /**
-   * Validating converter for a list of Paths.
-   * A Path is considered valid if it resolves to a file.
-   */
-  public static class PathListConverter implements Converter<List<Path>> {
-
-    private final PathConverter baseConverter;
-
-    public PathListConverter() {
-      this(false);
-    }
-
-    protected PathListConverter(boolean mustExist) {
-      baseConverter = new PathConverter(mustExist);
-    }
-
-    @Override
-    public List<Path> convert(String input) throws OptionsParsingException {
-      List<Path> list = new ArrayList<>();
-      for (String piece : input.split(File.pathSeparator)) {
-        if (!piece.isEmpty()) {
-          list.add(baseConverter.convert(piece));
-        }
-      }
-      return Collections.unmodifiableList(list);
-    }
-
-    @Override
-    public String getTypeDescription() {
-      return "a colon-separated list of paths";
-    }
-  }
-
-  /**
-   * Validating converter for a list of Paths. The list is considered valid if all Paths resolve to
-   * a file that exists.
-   */
-  public static class ExistingPathListConverter extends PathListConverter {
-    public ExistingPathListConverter() {
-      super(true);
-    }
-  }
-
-  // Commas that are not escaped by a backslash.
-  private static final String UNESCAPED_COMMA_REGEX = "(?<!\\\\)\\,";
-  // Colons that are not escaped by a backslash.
-  private static final String UNESCAPED_COLON_REGEX = "(?<!\\\\)\\:";
-
-  private static String unescapeInput(String input) {
-    return input.replace("\\:", ":").replace("\\,", ",");
-  }
-
-  /**
-   * A converter for dictionary arguments of the format key:value[,key:value]*. The keys and values
-   * may contain colons and commas as long as they are escaped with a backslash.
-   */
-  private abstract static class DictionaryConverter<K, V> implements Converter<Map<K, V>> {
-    private final Converter<K> keyConverter;
-    private final Converter<V> valueConverter;
-
-    public DictionaryConverter(Converter<K> keyConverter, Converter<V> valueConverter) {
-      this.keyConverter = keyConverter;
-      this.valueConverter = valueConverter;
-    }
-
-    @Override
-    public Map<K, V> convert(String input) throws OptionsParsingException {
-      if (input.isEmpty()) {
-        return ImmutableMap.of();
-      }
-      Map<K, V> map = new LinkedHashMap<>();
-      // Only split on comma and colon that are not escaped with a backslash
-      for (String entry : input.split(UNESCAPED_COMMA_REGEX)) {
-        String[] entryFields = entry.split(UNESCAPED_COLON_REGEX, -1);
-        if (entryFields.length < 2) {
-          throw new OptionsParsingException(String.format(
-              "Dictionary entry [%s] does not contain both a key and a value.",
-              entry));
-        } else if (entryFields.length > 2) {
-          throw new OptionsParsingException(String.format(
-              "Dictionary entry [%s] contains too many fields.",
-              entry));
-        }
-        // Unescape any comma or colon that is not a key or value separator.
-        String keyString = unescapeInput(entryFields[0]);
-        K key = keyConverter.convert(keyString);
-        if (map.containsKey(key)) {
-          throw new OptionsParsingException(String.format(
-              "Dictionary already contains the key [%s].",
-              keyString));
-        }
-        // Unescape any comma or colon that is not a key or value separator.
-        String valueString = unescapeInput(entryFields[1]);
-        V value = valueConverter.convert(valueString);
-        map.put(key, value);
-      }
-      return ImmutableMap.copyOf(map);
-    }
-
-    @Override
-    public String getTypeDescription() {
-      // Retrieve types of dictionary through reflection to avoid overriding this method in each
-      // subclass or passing types to this superclass.
-      return String.format(
-          "a comma-separated list of colon-separated key value pairs of the types %s and %s",
-          ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0],
-          ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[1]);
-    }
-  }
-
-  /**
-   * A converter for dictionary arguments of the format key:value[,key:value]*. The keys and values
-   * may contain colons and commas as long as they are escaped with a backslash. The key and value
-   * types are both String.
-   */
-  public static class StringDictionaryConverter extends DictionaryConverter<String, String> {
-    public StringDictionaryConverter() {
-      super(IDENTITY_CONVERTER, IDENTITY_CONVERTER);
-    }
-    // The way {@link OptionsData} checks for generic types requires convert to have literal type
-    // parameters and not argument type parameters.
-    @Override public Map<String, String> convert(String input) throws OptionsParsingException {
-      return super.convert(input);
-    }
-  }
-
-  /**
-   * A converter for dictionary arguments of the format key:value[,key:value]*. The keys and values
-   * may contain colons and commas as long as they are escaped with a backslash. The key type is
-   * Path and the value type is String.
-   */
-  public static class ExistingPathStringDictionaryConverter
-      extends DictionaryConverter<Path, String> {
-    public ExistingPathStringDictionaryConverter() {
-      super(new ExistingPathConverter(), IDENTITY_CONVERTER);
-    }
-    // The way {@link OptionsData} checks for generic types requires convert to have literal type
-    // parameters and not argument type parameters.
-    @Override public Map<Path, String> convert(String input) throws OptionsParsingException {
-      return super.convert(input);
-    }
-  }
 }
diff --git a/manifest.txt b/manifest.txt
new file mode 100644
index 0000000..ab00503
--- /dev/null
+++ b/manifest.txt
@@ -0,0 +1 @@
+Main-Class: com.google.devtools.build.android.desugar.Desugar