[KeepAnno] Replace 'match' functions with is/as methods.

Bug: b/248408342
Change-Id: Iaac18e27426f0f87e093a32143b8f67614dca702
diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/asm/KeepEdgeWriter.java b/src/keepanno/java/com/android/tools/r8/keepanno/asm/KeepEdgeWriter.java
index 373853f..0e96364 100644
--- a/src/keepanno/java/com/android/tools/r8/keepanno/asm/KeepEdgeWriter.java
+++ b/src/keepanno/java/com/android/tools/r8/keepanno/asm/KeepEdgeWriter.java
@@ -9,7 +9,7 @@
 import com.android.tools.r8.keepanno.ast.KeepEdge;
 import com.android.tools.r8.keepanno.ast.KeepItemPattern;
 import com.android.tools.r8.keepanno.ast.KeepMembersPattern;
-import com.android.tools.r8.keepanno.ast.KeepMethodNamePattern;
+import com.android.tools.r8.keepanno.ast.KeepMethodNamePattern.KeepMethodNameExactPattern;
 import com.android.tools.r8.keepanno.ast.KeepMethodPattern;
 import com.android.tools.r8.keepanno.ast.KeepPreconditions;
 import com.android.tools.r8.keepanno.ast.KeepQualifiedClassNamePattern;
@@ -85,15 +85,12 @@
       throw new Unimplemented();
     }
     KeepMethodPattern method = membersPattern.asMethod();
-    KeepMethodNamePattern methodNamePattern = method.getNamePattern();
-    methodNamePattern.match(
-        () -> {
-          throw new Unimplemented();
-        },
-        exactMethodName -> {
-          targetVisitor.visit(Target.methodName, exactMethodName);
-          return null;
-        });
+    KeepMethodNameExactPattern exactMethodName = method.getNamePattern().asExact();
+    if (exactMethodName != null) {
+      targetVisitor.visit(Target.methodName, exactMethodName.getName());
+    } else {
+      throw new Unimplemented();
+    }
     if (!method.getAccessPattern().isAny()) {
       throw new Unimplemented();
     }
diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepMethodNamePattern.java b/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepMethodNamePattern.java
index 1a637de..8203d56 100644
--- a/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepMethodNamePattern.java
+++ b/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepMethodNamePattern.java
@@ -3,8 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.keepanno.ast;
 
-import java.util.function.Function;
-import java.util.function.Supplier;
 
 public abstract class KeepMethodNamePattern {
 
@@ -23,15 +21,16 @@
   private KeepMethodNamePattern() {}
 
   public boolean isAny() {
-    return match(() -> true, ignore -> false);
+    return false;
   }
 
-  public boolean isExact() {
-    return match(() -> false, ignore -> true);
+  public final boolean isExact() {
+    return asExact() != null;
   }
-  ;
 
-  public abstract <T> T match(Supplier<T> onAny, Function<String, T> onExact);
+  public KeepMethodNameExactPattern asExact() {
+    return null;
+  }
 
   private static class Any extends KeepMethodNamePattern {
     private static final Any INSTANCE = new Any();
@@ -41,8 +40,8 @@
     }
 
     @Override
-    public <T> T match(Supplier<T> onAny, Function<String, T> onExact) {
-      return onAny.get();
+    public boolean isAny() {
+      return true;
     }
 
     @Override
@@ -61,7 +60,7 @@
     }
   }
 
-  private static class KeepMethodNameExactPattern extends KeepMethodNamePattern {
+  public static class KeepMethodNameExactPattern extends KeepMethodNamePattern {
     private final String name;
 
     public KeepMethodNameExactPattern(String name) {
@@ -70,8 +69,12 @@
     }
 
     @Override
-    public <T> T match(Supplier<T> onAny, Function<String, T> onExact) {
-      return onExact.apply(name);
+    public KeepMethodNameExactPattern asExact() {
+      return this;
+    }
+
+    public String getName() {
+      return name;
     }
 
     @Override
diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepMethodParametersPattern.java b/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepMethodParametersPattern.java
index cd850e6..29442ff 100644
--- a/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepMethodParametersPattern.java
+++ b/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepMethodParametersPattern.java
@@ -5,8 +5,6 @@
 
 import java.util.Collections;
 import java.util.List;
-import java.util.function.Function;
-import java.util.function.Supplier;
 
 public abstract class KeepMethodParametersPattern {
 
@@ -15,42 +13,55 @@
   }
 
   public static KeepMethodParametersPattern none() {
-    return None.getInstance();
+    return Some.EMPTY_INSTANCE;
   }
 
   private KeepMethodParametersPattern() {}
 
-  public abstract <T> T match(Supplier<T> onAny, Function<List<KeepTypePattern>, T> onList);
-
   public boolean isAny() {
-    return match(() -> true, params -> false);
+    return false;
   }
 
-  private static class None extends KeepMethodParametersPattern {
-    private static final None INSTANCE = new None();
+  public boolean isList() {
+    return asList() != null;
+  }
 
-    public static None getInstance() {
-      return INSTANCE;
+  public List<KeepTypePattern> asList() {
+    return null;
+  }
+
+  private static class Some extends KeepMethodParametersPattern {
+
+    private static final Some EMPTY_INSTANCE = new Some(Collections.emptyList());
+
+    private final List<KeepTypePattern> parameterPatterns;
+
+    private Some(List<KeepTypePattern> parameterPatterns) {
+      assert parameterPatterns != null;
+      this.parameterPatterns = parameterPatterns;
     }
 
     @Override
-    public <T> T match(Supplier<T> onAny, Function<List<KeepTypePattern>, T> onList) {
-      return onList.apply(Collections.emptyList());
+    public List<KeepTypePattern> asList() {
+      return parameterPatterns;
     }
 
     @Override
-    public boolean equals(Object obj) {
-      return this == obj;
+    public boolean equals(Object o) {
+      if (this == o) {
+        return true;
+      }
+      if (o == null || getClass() != o.getClass()) {
+        return false;
+      }
+
+      Some that = (Some) o;
+      return parameterPatterns.equals(that.parameterPatterns);
     }
 
     @Override
     public int hashCode() {
-      return System.identityHashCode(this);
-    }
-
-    @Override
-    public String toString() {
-      return "()";
+      return parameterPatterns.hashCode();
     }
   }
 
@@ -62,8 +73,8 @@
     }
 
     @Override
-    public <T> T match(Supplier<T> onAny, Function<List<KeepTypePattern>, T> onList) {
-      return onAny.get();
+    public boolean isAny() {
+      return true;
     }
 
     @Override
diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepMethodReturnTypePattern.java b/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepMethodReturnTypePattern.java
index 2786945..ccfc183 100644
--- a/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepMethodReturnTypePattern.java
+++ b/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepMethodReturnTypePattern.java
@@ -3,25 +3,31 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.keepanno.ast;
 
-import java.util.function.Function;
-import java.util.function.Supplier;
 
 public abstract class KeepMethodReturnTypePattern {
 
-  private static final SomeType ANY_TYPE_INSTANCE = new SomeType(KeepTypePattern.any());
-
   public static KeepMethodReturnTypePattern any() {
-    return ANY_TYPE_INSTANCE;
+    return SomeType.ANY_TYPE_INSTANCE;
   }
 
   public static KeepMethodReturnTypePattern voidType() {
     return VoidType.getInstance();
   }
 
-  public abstract <T> T match(Supplier<T> onVoid, Function<KeepTypePattern, T> onType);
-
   public boolean isAny() {
-    return match(() -> false, KeepTypePattern::isAny);
+    return isType() && asType().isAny();
+  }
+
+  public boolean isVoid() {
+    return false;
+  }
+
+  public boolean isType() {
+    return asType() != null;
+  }
+
+  public KeepTypePattern asType() {
+    return null;
   }
 
   private static class VoidType extends KeepMethodReturnTypePattern {
@@ -32,8 +38,8 @@
     }
 
     @Override
-    public <T> T match(Supplier<T> onVoid, Function<KeepTypePattern, T> onType) {
-      return onVoid.get();
+    public boolean isVoid() {
+      return true;
     }
 
     @Override
@@ -54,6 +60,8 @@
 
   private static class SomeType extends KeepMethodReturnTypePattern {
 
+    private static final SomeType ANY_TYPE_INSTANCE = new SomeType(KeepTypePattern.any());
+
     private final KeepTypePattern typePattern;
 
     private SomeType(KeepTypePattern typePattern) {
@@ -62,8 +70,8 @@
     }
 
     @Override
-    public <T> T match(Supplier<T> onVoid, Function<KeepTypePattern, T> onType) {
-      return onType.apply(typePattern);
+    public KeepTypePattern asType() {
+      return typePattern;
     }
 
     @Override
diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/keeprules/KeepRuleExtractor.java b/src/keepanno/java/com/android/tools/r8/keepanno/keeprules/KeepRuleExtractor.java
index 2d0df1b..3ab882f 100644
--- a/src/keepanno/java/com/android/tools/r8/keepanno/keeprules/KeepRuleExtractor.java
+++ b/src/keepanno/java/com/android/tools/r8/keepanno/keeprules/KeepRuleExtractor.java
@@ -131,24 +131,31 @@
 
   private static StringBuilder printParameters(
       StringBuilder builder, KeepMethodParametersPattern parametersPattern) {
-    return parametersPattern.match(
-        () -> builder.append("(***)"),
-        list ->
-            builder
-                .append('(')
-                .append(list.stream().map(Object::toString).collect(Collectors.joining(", ")))
-                .append(')'));
+    if (parametersPattern.isAny()) {
+      return builder.append("(***)");
+    }
+    return builder
+        .append('(')
+        .append(
+            parametersPattern.asList().stream()
+                .map(Object::toString)
+                .collect(Collectors.joining(", ")))
+        .append(')');
   }
 
   private static StringBuilder printMethodName(
       StringBuilder builder, KeepMethodNamePattern namePattern) {
-    return namePattern.match(() -> builder.append("*"), builder::append);
+    return namePattern.isAny()
+        ? builder.append("*")
+        : builder.append(namePattern.asExact().getName());
   }
 
   private static StringBuilder printReturnType(
       StringBuilder builder, KeepMethodReturnTypePattern returnTypePattern) {
-    return returnTypePattern.match(
-        () -> builder.append("void"), typePattern -> printType(builder, typePattern));
+    if (returnTypePattern.isVoid()) {
+      return builder.append("void");
+    }
+    return printType(builder, returnTypePattern.asType());
   }
 
   private static StringBuilder printType(StringBuilder builder, KeepTypePattern typePattern) {