diff options
author | Colin Cross <ccross@android.com> | 2017-02-10 14:59:04 -0800 |
---|---|---|
committer | Colin Cross <ccross@android.com> | 2017-02-17 14:37:50 -0800 |
commit | dfda3f78b5cb4823b187fa8f5bda9411570c11d2 (patch) | |
tree | d18157cd1d62b52894982534f45574366604476b | |
parent | c9d1f7894075840e7ad1450951b8336ac2ce8317 (diff) | |
download | desugar-dfda3f78b5cb4823b187fa8f5bda9411570c11d2.tar.gz |
Make desugar compile in Android
Add an Android.mk and manifest.txt, and remove unused code in
Converters.java that pulls in unnecessary dependencies.
Test: builds
Change-Id: I3d5117524818015f5ad209dd4d5e4ec05c4f9890
-rw-r--r-- | Android.mk | 14 | ||||
-rw-r--r-- | java/com/google/devtools/build/android/Converters.java | 351 | ||||
-rw-r--r-- | manifest.txt | 1 |
3 files changed, 15 insertions, 351 deletions
diff --git a/Android.mk b/Android.mk new file mode 100644 index 0000000..0492748 --- /dev/null +++ b/Android.mk @@ -0,0 +1,14 @@ +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-tree-5.2 \ + guava-20.0 \ + jsr305-3.0.1 \ + dagger2-auto-value-host \ + +include $(BUILD_HOST_JAVA_LIBRARY) 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 @@ public final class Converters { } }; - /** - * 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 @@ public final class Converters { 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 |