Add support for catch all wildcards in the feature split mapping.
Change-Id: I1f5188fcc2d293714caeb95eec4ad77a1de957e4
diff --git a/src/main/java/com/android/tools/r8/utils/FeatureClassMapping.java b/src/main/java/com/android/tools/r8/utils/FeatureClassMapping.java
index ebb692f..e46bef9 100644
--- a/src/main/java/com/android/tools/r8/utils/FeatureClassMapping.java
+++ b/src/main/java/com/android/tools/r8/utils/FeatureClassMapping.java
@@ -146,24 +146,30 @@
private static Pattern identifier = Pattern.compile("[A-Za-z_\\-][A-Za-z0-9_$\\-]*");
final String predicate;
final String feature;
+ final boolean isCatchAll;
// False implies class predicate.
final boolean isWildcard;
FeaturePredicate(String predicate, String feature) throws FeatureMappingException {
isWildcard = predicate.endsWith(".*");
- if (isWildcard) {
- this.predicate = predicate.substring(0, predicate.length() - 3);
+ isCatchAll = predicate.equals("*");
+ if (isCatchAll) {
+ this.predicate = "";
+ } else if (isWildcard) {
+ this.predicate = predicate.substring(0, predicate.length() - 2);
} else {
this.predicate = predicate;
}
- if (!DescriptorUtils.isValidJavaType(this.predicate)) {
+ if (!DescriptorUtils.isValidJavaType(this.predicate) && !isCatchAll) {
throw new FeatureMappingException(this.predicate + " is not a valid identifier");
}
this.feature = feature;
}
boolean match(String className) {
- if (isWildcard) {
+ if (isCatchAll) {
+ return true;
+ } else if (isWildcard) {
return className.startsWith(predicate);
} else {
// We also put inner classes into the same feature.
diff --git a/src/test/java/com/android/tools/r8/utils/FeatureClassMappingTest.java b/src/test/java/com/android/tools/r8/utils/FeatureClassMappingTest.java
index 3e759d9..a8ead8a 100644
--- a/src/test/java/com/android/tools/r8/utils/FeatureClassMappingTest.java
+++ b/src/test/java/com/android/tools/r8/utils/FeatureClassMappingTest.java
@@ -64,6 +64,21 @@
}
@Test
+ public void testCatchAllWildcards() throws Exception {
+ List<String> lines =
+ ImmutableList.of(
+ "com.google.Feature1:feature1",
+ "*:base",
+ "com.strange.*:feature2");
+ FeatureClassMapping mapping = new FeatureClassMapping(lines);
+ assertEquals(mapping.featureForClass("com.google.Feature1"), "feature1");
+ assertEquals(mapping.featureForClass("com.google.different.Feature1"), "base");
+ assertEquals(mapping.featureForClass("com.strange.different.Feature1"), "feature2");
+ assertEquals(mapping.featureForClass("Feature1"), "base");
+ assertEquals(mapping.featureForClass("a.b.z.A"), "base");
+ }
+
+ @Test
public void testWrongLines() throws Exception {
// No colon.
ensureThrowsMappingException("foo");