Don't soft pin everything when doing -if class * rules
This only solves the problem for -if class * SUBSEQUENT, not the cases
where the conditional contains member specifications.
Bug: b/316100042
Change-Id: Ie59e96669098f467303df8f5e6dbfdd71070c986
diff --git a/src/main/java/com/android/tools/r8/shaking/IfRuleEvaluator.java b/src/main/java/com/android/tools/r8/shaking/IfRuleEvaluator.java
index 1410247..933cc33 100644
--- a/src/main/java/com/android/tools/r8/shaking/IfRuleEvaluator.java
+++ b/src/main/java/com/android/tools/r8/shaking/IfRuleEvaluator.java
@@ -328,7 +328,9 @@
DexItemFactory dexItemFactory = appView.dexItemFactory();
ProguardIfRule materializedRule = rule.materialize(dexItemFactory, preconditions);
- if (enqueuer.getMode().isInitialTreeShaking() && !rule.isUsed()) {
+ if (enqueuer.getMode().isInitialTreeShaking()
+ && !rule.isUsed()
+ && !rule.isTrivalAllClassMatch()) {
// We need to abort class inlining of classes that could be matched by the condition of this
// -if rule.
ClassInlineRule neverClassInlineRuleForCondition =
diff --git a/src/main/java/com/android/tools/r8/shaking/ProguardAccessFlags.java b/src/main/java/com/android/tools/r8/shaking/ProguardAccessFlags.java
index cdf0264..4c35b96 100644
--- a/src/main/java/com/android/tools/r8/shaking/ProguardAccessFlags.java
+++ b/src/main/java/com/android/tools/r8/shaking/ProguardAccessFlags.java
@@ -239,6 +239,10 @@
return this.flags == ((ProguardAccessFlags) obj).flags;
}
+ public boolean isDefaultFlags() {
+ return flags == 0;
+ }
+
@Override
public int hashCode() {
return flags;
diff --git a/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationRule.java b/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationRule.java
index 6099834..01c9118 100644
--- a/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationRule.java
+++ b/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationRule.java
@@ -15,6 +15,7 @@
import com.android.tools.r8.graph.SubtypingInfo;
import com.android.tools.r8.origin.Origin;
import com.android.tools.r8.position.Position;
+import com.android.tools.r8.utils.BooleanBox;
import com.android.tools.r8.utils.IterableUtils;
import com.android.tools.r8.utils.StringUtils;
import com.google.common.collect.ImmutableList;
@@ -60,6 +61,23 @@
memberRules);
}
+ public boolean isTrivalAllClassMatch() {
+ BooleanBox booleanBox = new BooleanBox(true);
+ getClassNames()
+ .forEachTypeMatcher(
+ unused -> booleanBox.set(false),
+ proguardTypeMatcher -> !proguardTypeMatcher.isMatchAnyClassPattern());
+ return booleanBox.get()
+ && getClassAnnotations().isEmpty()
+ && getClassAccessFlags().isDefaultFlags()
+ && getNegatedClassAccessFlags().isDefaultFlags()
+ && !getClassTypeNegated()
+ && getClassType() == ProguardClassType.CLASS
+ && getInheritanceAnnotations().isEmpty()
+ && getInheritanceClassName() == null
+ && getMemberRules().isEmpty();
+ }
+
public boolean isUsed() {
return used;
}
diff --git a/src/main/java/com/android/tools/r8/shaking/ProguardTypeMatcher.java b/src/main/java/com/android/tools/r8/shaking/ProguardTypeMatcher.java
index a8233bf..f9aef9b 100644
--- a/src/main/java/com/android/tools/r8/shaking/ProguardTypeMatcher.java
+++ b/src/main/java/com/android/tools/r8/shaking/ProguardTypeMatcher.java
@@ -43,6 +43,10 @@
// Evaluates this matcher on the given type.
public abstract boolean matches(DexType type);
+ public boolean isMatchAnyClassPattern() {
+ return false;
+ }
+
// Evaluates this matcher on the given type, and on all types that have been merged into the given
// type, if any.
public final boolean matches(DexType type, AppView<?> appView) {
@@ -167,6 +171,11 @@
}
@Override
+ public boolean isMatchAnyClassPattern() {
+ return true;
+ }
+
+ @Override
public boolean matches(DexType type) {
wildcard.setCaptured(type.toSourceString());
return true;
@@ -249,6 +258,11 @@
}
@Override
+ public boolean isMatchAnyClassPattern() {
+ return true;
+ }
+
+ @Override
public boolean matches(DexType type) {
if (type.isClassType()) {
wildcard.setCaptured(type.toSourceString());
diff --git a/src/test/java/com/android/tools/r8/shaking/ifrule/PinningStarPatternTest.java b/src/test/java/com/android/tools/r8/shaking/ifrule/PinningStarPatternTest.java
index ecb11d3..d65f8bd 100644
--- a/src/test/java/com/android/tools/r8/shaking/ifrule/PinningStarPatternTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/ifrule/PinningStarPatternTest.java
@@ -49,11 +49,7 @@
@Test
public void testR8IfStar() throws Exception {
- // TODO(b/316100042): We should not keep A.class.
- testKeepRule(
- "-if class * -keep class **B { *; }",
- ImmutableList.of(),
- ImmutableList.of(B.class, TestClass.class, A.class));
+ testKeepRule("-if class * -keep class **B { *; }", EXPECTED_ABSENT, EXPECTED_PRESENT);
}
@Test