[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();