[KeepAnno] Remove "none" member pattern

After explicitly splitting AST items in class items and member items
there is no longer a need for "none" to distinguish an item as a class
item.

Bug: b/248408342
Change-Id: Iaa5f298794b710c9645c5295be641b8f94e9e255
diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/asm/KeepEdgeReader.java b/src/keepanno/java/com/android/tools/r8/keepanno/asm/KeepEdgeReader.java
index c346dbd..6da12d5 100644
--- a/src/keepanno/java/com/android/tools/r8/keepanno/asm/KeepEdgeReader.java
+++ b/src/keepanno/java/com/android/tools/r8/keepanno/asm/KeepEdgeReader.java
@@ -1475,7 +1475,7 @@
       if (field != null) {
         return field;
       }
-      return KeepMemberPattern.none();
+      return null;
     }
 
     @Override
@@ -1649,87 +1649,75 @@
 
     @Override
     public void visitEnd() {
+      // Item defined by binding reference.
       if (memberBindingReference != null) {
-        if (!classDeclaration.isDefault()
-            || !memberDeclaration.getValue().isNone()
-            || kind != null) {
+        if (classDeclaration.isDeclared() || memberDeclaration.isDeclared() || kind != null) {
           throw parsingContext.error(
               "Cannot define an item explicitly and via a member-binding reference");
         }
         KeepBindingSymbol symbol = getBindingsHelper().resolveUserBinding(memberBindingReference);
         itemReference = KeepBindingReference.forMember(symbol).toItemReference();
-      } else {
-        KeepMemberPattern memberPattern = memberDeclaration.getValue();
-        // If no explicit kind is set, extract it based on the member pattern.
-        if (kind == null) {
-          if (memberPattern.isMethod()) {
-            kind = ItemKind.ONLY_METHODS;
-          } else if (memberPattern.isField()) {
-            kind = ItemKind.ONLY_FIELDS;
-          } else if (memberPattern.isGeneralMember()) {
-            kind = ItemKind.ONLY_MEMBERS;
-          } else {
-            assert memberPattern.isNone();
-            kind = ItemKind.ONLY_CLASS;
-          }
-        }
+        return;
+      }
 
-        if (kind.isOnlyClass() && !memberPattern.isNone()) {
-          throw parsingContext.error("Item pattern for members is incompatible with kind " + kind);
-        }
-
-        // Refine the member pattern to be as precise as the specified kind.
-        if (kind.requiresMethods() && !memberPattern.isMethod()) {
-          if (memberPattern.isGeneralMember()) {
-            memberPattern =
-                KeepMethodPattern.builder()
-                    .setAccessPattern(
-                        KeepMethodAccessPattern.builder()
-                            .copyOfMemberAccess(memberPattern.getAccessPattern())
-                            .build())
-                    .build();
-          } else if (memberPattern.isNone()) {
-            memberPattern = KeepMethodPattern.allMethods();
-          } else {
-            assert memberPattern.isField();
-            throw parsingContext.error("Item pattern for fields is incompatible with kind " + kind);
-          }
-        }
-
-        if (kind.requiresFields() && !memberPattern.isField()) {
-          if (memberPattern.isGeneralMember()) {
-            memberPattern =
-                KeepFieldPattern.builder()
-                    .setAccessPattern(
-                        KeepFieldAccessPattern.builder()
-                            .copyOfMemberAccess(memberPattern.getAccessPattern())
-                            .build())
-                    .build();
-          } else if (memberPattern.isNone()) {
-            memberPattern = KeepFieldPattern.allFields();
-          } else {
-            assert memberPattern.isMethod();
-            throw parsingContext.error(
-                "Item pattern for methods is incompatible with kind " + kind);
-          }
-        }
-
-        if (kind.requiresMembers() && memberPattern.isNone()) {
-          memberPattern = KeepMemberPattern.allMembers();
-        }
-
-        KeepClassItemReference classReference = classDeclaration.getValue();
-        if (kind.isOnlyClass()) {
-          itemReference = classReference;
+      // If no explicit kind is set, extract it based on the member pattern.
+      KeepMemberPattern memberPattern = memberDeclaration.getValue();
+      if (kind == null) {
+        if (memberPattern == null) {
+          kind = ItemKind.ONLY_CLASS;
+        } else if (memberPattern.isMethod()) {
+          kind = ItemKind.ONLY_METHODS;
+        } else if (memberPattern.isField()) {
+          kind = ItemKind.ONLY_FIELDS;
+        } else if (memberPattern.isGeneralMember()) {
+          kind = ItemKind.ONLY_MEMBERS;
         } else {
-          KeepItemPattern itemPattern =
-              KeepMemberItemPattern.builder()
-                  .setClassReference(classReference)
-                  .setMemberPattern(memberPattern)
-                  .build();
-          itemReference = itemPattern.toItemReference();
+          assert false;
         }
       }
+
+      // If the pattern is only for a class set it and exit.
+      if (kind.isOnlyClass()) {
+        if (memberDeclaration.isDeclared()) {
+          throw parsingContext.error("Item pattern for members is incompatible with kind " + kind);
+        }
+        itemReference = classDeclaration.getValue();
+        return;
+      }
+
+      // At this point the pattern must include members.
+      // If no explicit member pattern is defined the implicit pattern is all members.
+      // Then refine the member pattern to be as precise as the specified kind.
+      assert kind.requiresMembers();
+      if (memberPattern == null) {
+        memberPattern = KeepMemberPattern.allMembers();
+      }
+
+      if (kind.requiresMethods() && !memberPattern.isMethod()) {
+        if (memberPattern.isGeneralMember()) {
+          memberPattern = KeepMethodPattern.builder().copyFromMemberPattern(memberPattern).build();
+        } else {
+          assert memberPattern.isField();
+          throw parsingContext.error("Item pattern for fields is incompatible with kind " + kind);
+        }
+      }
+
+      if (kind.requiresFields() && !memberPattern.isField()) {
+        if (memberPattern.isGeneralMember()) {
+          memberPattern = KeepFieldPattern.builder().copyFromMemberPattern(memberPattern).build();
+        } else {
+          assert memberPattern.isMethod();
+          throw parsingContext.error("Item pattern for methods is incompatible with kind " + kind);
+        }
+      }
+
+      KeepClassItemReference classReference = classDeclaration.getValue();
+      KeepItemPattern itemPattern =
+          KeepMemberItemPattern.builder()
+              .setClassReference(classReference)
+              .setMemberPattern(memberPattern)
+              .build();
+      itemReference = itemPattern.toItemReference();
     }
   }
 
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 332e101..87e2624 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
@@ -169,10 +169,6 @@
   }
 
   private void writeMember(KeepMemberPattern memberPattern, AnnotationVisitor targetVisitor) {
-    if (memberPattern.isNone()) {
-      // Default is "no methods".
-      return;
-    }
     if (memberPattern.isAllMembers()) {
       throw new Unimplemented();
     }
diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepEdge.java b/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepEdge.java
index ce58000..992cf1e 100644
--- a/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepEdge.java
+++ b/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepEdge.java
@@ -71,7 +71,9 @@
  *
  *   ANNOTATED_BY_PATTERN ::= QUALIFIED_CLASS_NAME_PATTERN
  *
- *   MEMBER_PATTERN ::= none | all | FIELD_PATTERN | METHOD_PATTERN
+ *   MEMBER_PATTERN ::= GENERAL_MEMBER_PATTERN | FIELD_PATTERN | METHOD_PATTERN
+ *
+ *   GENERAL_MEMBER_PATTERN ::= MEMBER_ACCESS_PATTERN any
  *
  *   FIELD_PATTERN
  *     ::= FIELD_ACCESS_PATTERN
diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepFieldPattern.java b/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepFieldPattern.java
index 23e27cc..b5b028d 100644
--- a/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepFieldPattern.java
+++ b/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepFieldPattern.java
@@ -27,6 +27,14 @@
       return this;
     }
 
+    public Builder copyFromMemberPattern(KeepMemberPattern memberPattern) {
+      assert memberPattern.isGeneralMember();
+      return setAccessPattern(
+          KeepFieldAccessPattern.builder()
+              .copyOfMemberAccess(memberPattern.getAccessPattern())
+              .build());
+    }
+
     public Builder setAccessPattern(KeepFieldAccessPattern accessPattern) {
       this.accessPattern = accessPattern;
       return self();
diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepMemberPattern.java b/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepMemberPattern.java
index 05c05f8..5cbf53d 100644
--- a/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepMemberPattern.java
+++ b/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepMemberPattern.java
@@ -5,12 +5,8 @@
 
 public abstract class KeepMemberPattern {
 
-  public static KeepMemberPattern none() {
-    return None.getInstance();
-  }
-
   public static KeepMemberPattern allMembers() {
-    return All.getInstance();
+    return Some.ANY;
   }
 
   public static Builder memberBuilder() {
@@ -34,6 +30,9 @@
   }
 
   private static class Some extends KeepMemberPattern {
+    private static final KeepMemberPattern ANY =
+        new Some(KeepMemberAccessPattern.anyMemberAccess());
+
     private final KeepMemberAccessPattern accessPattern;
 
     public Some(KeepMemberAccessPattern accessPattern) {
@@ -68,81 +67,14 @@
     }
   }
 
-  private static class All extends KeepMemberPattern {
-
-    private static final All INSTANCE = new All();
-
-    public static All getInstance() {
-      return INSTANCE;
-    }
-
-    @Override
-    public boolean isAllMembers() {
-      return true;
-    }
-
-    @Override
-    public KeepMemberAccessPattern getAccessPattern() {
-      return KeepMemberAccessPattern.anyMemberAccess();
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-      return this == obj;
-    }
-
-    @Override
-    public int hashCode() {
-      return System.identityHashCode(this);
-    }
-
-    @Override
-    public String toString() {
-      return "<all>";
-    }
-  }
-
-  private static class None extends KeepMemberPattern {
-
-    private static final None INSTANCE = new None();
-
-    public static None getInstance() {
-      return INSTANCE;
-    }
-
-    @Override
-    public boolean isNone() {
-      return true;
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-      return this == obj;
-    }
-
-    @Override
-    public int hashCode() {
-      return System.identityHashCode(this);
-    }
-
-    @Override
-    public String toString() {
-      return "<none>";
-    }
-  }
-
   KeepMemberPattern() {}
 
   public boolean isAllMembers() {
-    return false;
-  }
-
-  public boolean isNone() {
-    return false;
+    return this == Some.ANY;
   }
 
   public final boolean isGeneralMember() {
-    return !isNone() && !isMethod() && !isField();
+    return !isMethod() && !isField();
   }
 
   public final boolean isMethod() {
@@ -161,7 +93,5 @@
     return null;
   }
 
-  public KeepMemberAccessPattern getAccessPattern() {
-    throw new KeepEdgeException("Invalid access to member access pattern");
-  }
+  public abstract KeepMemberAccessPattern getAccessPattern();
 }
diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepMethodPattern.java b/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepMethodPattern.java
index 98ebbb9..0e30b11 100644
--- a/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepMethodPattern.java
+++ b/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepMethodPattern.java
@@ -28,6 +28,14 @@
       return this;
     }
 
+    public Builder copyFromMemberPattern(KeepMemberPattern memberPattern) {
+      assert memberPattern.isGeneralMember();
+      return setAccessPattern(
+          KeepMethodAccessPattern.builder()
+              .copyOfMemberAccess(memberPattern.getAccessPattern())
+              .build());
+    }
+
     public Builder setAccessPattern(KeepMethodAccessPattern accessPattern) {
       this.accessPattern = accessPattern;
       return self();