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