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",