Mark private methods final after publicizing and stop publicizing clinit
Change-Id: I58b10267fade0b5ec3179632f36449dc24ca94e8
diff --git a/src/main/java/com/android/tools/r8/graph/AccessFlags.java b/src/main/java/com/android/tools/r8/graph/AccessFlags.java
index fe6e49c..825655a 100644
--- a/src/main/java/com/android/tools/r8/graph/AccessFlags.java
+++ b/src/main/java/com/android/tools/r8/graph/AccessFlags.java
@@ -10,6 +10,7 @@
import com.google.common.collect.ImmutableList;
import java.util.List;
import java.util.function.BooleanSupplier;
+import java.util.function.Consumer;
/** Access flags common to classes, methods and fields. */
public abstract class AccessFlags<T extends AccessFlags<T>> implements StructuralItem<T> {
@@ -65,6 +66,13 @@
return AccessFlags::specify;
}
+ public T applyIf(boolean condition, Consumer<T> fn) {
+ if (condition) {
+ fn.accept(self());
+ }
+ return self();
+ }
+
public abstract T copy();
@Override
@@ -231,8 +239,9 @@
demote(Constants.ACC_SYNTHETIC);
}
- public void promoteToFinal() {
+ public T promoteToFinal() {
promote(Constants.ACC_FINAL);
+ return self();
}
public T demoteFromFinal() {
@@ -248,9 +257,10 @@
return isPromoted(Constants.ACC_PUBLIC);
}
- public void promoteToPublic() {
+ public T promoteToPublic() {
demote(Constants.ACC_PRIVATE | Constants.ACC_PROTECTED);
promote(Constants.ACC_PUBLIC);
+ return self();
}
public T withPublic() {
diff --git a/src/main/java/com/android/tools/r8/optimize/accessmodification/AccessModifier.java b/src/main/java/com/android/tools/r8/optimize/accessmodification/AccessModifier.java
index c197b85..b388d09 100644
--- a/src/main/java/com/android/tools/r8/optimize/accessmodification/AccessModifier.java
+++ b/src/main/java/com/android/tools/r8/optimize/accessmodification/AccessModifier.java
@@ -167,23 +167,35 @@
return commitMethod(method, localNamingState, namingState);
}
+ if (method.getDefinition().isClassInitializer()) {
+ return commitMethod(method, localNamingState, namingState);
+ }
+
if (method.getDefinition().isInstanceInitializer()
|| (accessFlags.isPackagePrivate()
&& !traversalState.hasIllegalOverrideOfPackagePrivateMethod(method))
|| accessFlags.isProtected()) {
- method.getAccessFlags().promoteToPublic();
+ accessFlags.promoteToPublic();
return commitMethod(method, localNamingState, namingState);
}
if (accessFlags.isPrivate()) {
if (isRenamingAllowed(method)) {
- method.getAccessFlags().promoteToPublic();
+ accessFlags
+ .promoteToPublic()
+ .applyIf(
+ !method.getHolder().isInterface() && accessFlags.belongsToVirtualPool(),
+ MethodAccessFlags::promoteToFinal);
return commitMethod(method, localNamingState, namingState);
}
assert localNamingState.containsKey(method.getReference());
assert localNamingState.get(method.getReference()) == method.getReference();
if (namingState.isFree(method.getMethodSignature())) {
- method.getAccessFlags().promoteToPublic();
+ accessFlags
+ .promoteToPublic()
+ .applyIf(
+ !method.getHolder().isInterface() && accessFlags.belongsToVirtualPool(),
+ MethodAccessFlags::promoteToFinal);
namingState.addBlockedMethodSignature(method.getMethodSignature());
}
return commitMethod(method, method.getReference());
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/staticizer/ClassStaticizerTest.java b/src/test/java/com/android/tools/r8/ir/optimize/staticizer/ClassStaticizerTest.java
index 911a0c5..5c3fe96 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/staticizer/ClassStaticizerTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/staticizer/ClassStaticizerTest.java
@@ -204,8 +204,8 @@
assertEquals(
Lists.newArrayList(
- "STATIC: String SimpleWithLazyInit.bar$1(String)",
- "STATIC: String SimpleWithLazyInit.foo$1()",
+ "STATIC: String SimpleWithLazyInit.bar(String)",
+ "STATIC: String SimpleWithLazyInit.foo()",
"STATIC: String TrivialTestClass.next()"),
references(clazz, "testSimpleWithThrowingGetter", "void"));
@@ -222,8 +222,8 @@
}
Collections.addAll(
expectedReferencesInTestSimpleWithLazyInit,
- "STATIC: String SimpleWithLazyInit.bar(String)",
- "STATIC: String SimpleWithLazyInit.foo()",
+ "STATIC: String SimpleWithLazyInit.bar$1(String)",
+ "STATIC: String SimpleWithLazyInit.foo$1()",
"STATIC: String TrivialTestClass.next()",
"SimpleWithLazyInit SimpleWithLazyInit.INSTANCE",
"SimpleWithLazyInit SimpleWithLazyInit.INSTANCE",