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");