Remove legacy access modifier
Change-Id: I46c2581ea42a5f002c2ff983732511316e326631
diff --git a/src/main/java/com/android/tools/r8/R8.java b/src/main/java/com/android/tools/r8/R8.java
index 1684062..56d0a8c 100644
--- a/src/main/java/com/android/tools/r8/R8.java
+++ b/src/main/java/com/android/tools/r8/R8.java
@@ -62,7 +62,6 @@
import com.android.tools.r8.naming.ProguardMapMinifier;
import com.android.tools.r8.naming.RecordRewritingNamingLens;
import com.android.tools.r8.naming.signature.GenericSignatureRewriter;
-import com.android.tools.r8.optimize.LegacyAccessModifier;
import com.android.tools.r8.optimize.MemberRebindingAnalysis;
import com.android.tools.r8.optimize.MemberRebindingIdentityLens;
import com.android.tools.r8.optimize.MemberRebindingIdentityLensFactory;
@@ -449,15 +448,6 @@
// to clear the cache, so that we will recompute the type lattice elements.
appView.dexItemFactory().clearTypeElementsCache();
- // TODO(b/132677331): Remove legacy access modifier.
- LegacyAccessModifier.run(appViewWithLiveness, executorService, timing);
- if (appView.graphLens().isPublicizerLens()) {
- // We can now remove redundant bridges. Note that we do not need to update the
- // invoke-targets here, as the existing invokes will simply dispatch to the now
- // visible super-method. MemberRebinding, if run, will then dispatch it correctly.
- new RedundantBridgeRemover(appView.withLiveness()).run(null, executorService, timing);
- }
-
// This pass attempts to reduce the number of nests and nest size to allow further passes, and
// should therefore be run after the publicizer.
new NestReducer(appViewWithLiveness).run(executorService, timing);
diff --git a/src/main/java/com/android/tools/r8/optimize/LegacyAccessModifier.java b/src/main/java/com/android/tools/r8/optimize/LegacyAccessModifier.java
deleted file mode 100644
index 2c82527..0000000
--- a/src/main/java/com/android/tools/r8/optimize/LegacyAccessModifier.java
+++ /dev/null
@@ -1,218 +0,0 @@
-// Copyright (c) 2016, the R8 project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-package com.android.tools.r8.optimize;
-
-import static com.android.tools.r8.dex.Constants.ACC_PRIVATE;
-import static com.android.tools.r8.dex.Constants.ACC_PROTECTED;
-import static com.android.tools.r8.dex.Constants.ACC_PUBLIC;
-import static com.android.tools.r8.graph.DexProgramClass.asProgramClassOrNull;
-
-import com.android.tools.r8.graph.AppView;
-import com.android.tools.r8.graph.DexEncodedMethod;
-import com.android.tools.r8.graph.DexMethod;
-import com.android.tools.r8.graph.DexProgramClass;
-import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.FieldAccessFlags;
-import com.android.tools.r8.graph.InnerClassAttribute;
-import com.android.tools.r8.graph.MethodAccessFlags;
-import com.android.tools.r8.graph.ProgramDefinition;
-import com.android.tools.r8.graph.ProgramField;
-import com.android.tools.r8.graph.ProgramMethod;
-import com.android.tools.r8.graph.SubtypingInfo;
-import com.android.tools.r8.ir.optimize.MemberPoolCollection.MemberPool;
-import com.android.tools.r8.ir.optimize.MethodPoolCollection;
-import com.android.tools.r8.optimize.PublicizerLens.PublicizedLensBuilder;
-import com.android.tools.r8.shaking.AppInfoWithLiveness;
-import com.android.tools.r8.utils.InternalOptions;
-import com.android.tools.r8.utils.MethodSignatureEquivalence;
-import com.android.tools.r8.utils.OptionalBool;
-import com.android.tools.r8.utils.Timing;
-import com.google.common.base.Equivalence.Wrapper;
-import java.util.LinkedHashSet;
-import java.util.Set;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.ExecutorService;
-
-public final class LegacyAccessModifier {
-
- private final AppView<AppInfoWithLiveness> appView;
- private final SubtypingInfo subtypingInfo;
- private final MethodPoolCollection methodPoolCollection;
-
- private final PublicizedLensBuilder lensBuilder = PublicizerLens.createBuilder();
-
- private LegacyAccessModifier(AppView<AppInfoWithLiveness> appView) {
- this.appView = appView;
- this.subtypingInfo = appView.appInfo().computeSubtypingInfo();
- this.methodPoolCollection =
- // We will add private instance methods when we promote them.
- new MethodPoolCollection(
- appView, subtypingInfo, MethodPoolCollection::excludesPrivateInstanceMethod);
- }
-
- /**
- * Marks all package private and protected methods and fields as public. Makes all private static
- * methods public. Makes private instance methods public final instance methods, if possible.
- *
- * <p>This will destructively update the DexApplication passed in as argument.
- */
- public static void run(
- AppView<AppInfoWithLiveness> appView, ExecutorService executorService, Timing timing)
- throws ExecutionException {
- InternalOptions options = appView.options();
- if (options.isAccessModificationEnabled()
- && !options.getAccessModifierOptions().isExperimentalAccessModificationEnabled()) {
- timing.begin("Access modification");
- new LegacyAccessModifier(appView).internalRun(executorService, timing);
- timing.end();
- }
- }
-
- private void internalRun(ExecutorService executorService, Timing timing)
- throws ExecutionException {
- // Phase 1: Collect methods to check if private instance methods don't have conflicts.
- methodPoolCollection.buildAll(executorService, timing);
-
- // Phase 2: Visit classes and promote class/member to public if possible.
- timing.begin("Phase 2: promoteToPublic");
- appView.appInfo().forEachReachableInterface(clazz -> processType(clazz.getType()));
- processType(appView.dexItemFactory().objectType);
- timing.end();
-
- PublicizerLens publicizerLens = lensBuilder.build(appView);
- if (publicizerLens != null) {
- appView.setGraphLens(publicizerLens);
- }
-
- appView.notifyOptimizationFinishedForTesting();
- }
-
- private void doPublicize(ProgramDefinition definition) {
- definition.getAccessFlags().promoteToPublic();
- }
-
- private void processType(DexType type) {
- DexProgramClass clazz = asProgramClassOrNull(appView.definitionFor(type));
- if (clazz != null) {
- processClass(clazz);
- }
- subtypingInfo.forAllImmediateExtendsSubtypes(type, this::processType);
- }
-
- private void processClass(DexProgramClass clazz) {
- if (appView.appInfo().isAccessModificationAllowed(clazz)) {
- doPublicize(clazz);
- }
-
- // Publicize fields.
- clazz.forEachProgramField(this::processField);
-
- // Publicize methods.
- Set<DexEncodedMethod> privateInstanceMethods = new LinkedHashSet<>();
- clazz.forEachProgramMethod(
- method -> {
- if (publicizeMethod(method)) {
- privateInstanceMethods.add(method.getDefinition());
- }
- });
- if (!privateInstanceMethods.isEmpty()) {
- clazz.virtualizeMethods(privateInstanceMethods);
- }
-
- // Publicize inner class attribute.
- InnerClassAttribute attr = clazz.getInnerClassAttributeForThisClass();
- if (attr != null) {
- int accessFlags = ((attr.getAccess() | ACC_PUBLIC) & ~ACC_PRIVATE) & ~ACC_PROTECTED;
- clazz.replaceInnerClassAttributeForThisClass(
- new InnerClassAttribute(
- accessFlags, attr.getInner(), attr.getOuter(), attr.getInnerName()));
- }
- }
-
- private void processField(ProgramField field) {
- if (appView.appInfo().isAccessModificationAllowed(field)) {
- publicizeField(field);
- }
- }
-
- private void publicizeField(ProgramField field) {
- FieldAccessFlags flags = field.getAccessFlags();
- if (!flags.isPublic()) {
- flags.promoteToPublic();
- }
- }
-
- private boolean publicizeMethod(ProgramMethod method) {
- MethodAccessFlags accessFlags = method.getAccessFlags();
- if (accessFlags.isPublic()) {
- return false;
- }
- // If this method is mentioned in keep rules, do not transform (rule applications changed).
- DexEncodedMethod definition = method.getDefinition();
- if (!appView.appInfo().isAccessModificationAllowed(method)) {
- // TODO(b/131130038): Also do not publicize package-private and protected methods that are
- // kept.
- if (definition.isPrivate()) {
- return false;
- }
- }
-
- if (method.getDefinition().isInstanceInitializer() || accessFlags.isProtected()) {
- doPublicize(method);
- return false;
- }
-
- if (accessFlags.isPackagePrivate()) {
- // If we publicize a package private method we have to ensure there is no overrides of it. We
- // could potentially publicize a method if it only has package-private overrides.
- // TODO(b/182136236): See if we can break the hierarchy for clusters.
- MemberPool<DexMethod> memberPool = methodPoolCollection.get(method.getHolder());
- Wrapper<DexMethod> methodKey = MethodSignatureEquivalence.get().wrap(method.getReference());
- if (memberPool.below(
- methodKey,
- false,
- true,
- (clazz, ignored) ->
- !method.getContextType().getPackageName().equals(clazz.getType().getPackageName()))) {
- return false;
- }
- doPublicize(method);
- return false;
- }
-
- assert accessFlags.isPrivate();
-
- if (accessFlags.isStatic()) {
- // For private static methods we can just relax the access to public, since
- // even though JLS prevents from declaring static method in derived class if
- // an instance method with same signature exists in superclass, JVM actually
- // does not take into account access of the static methods.
- doPublicize(method);
- return false;
- }
-
- // We can't publicize private instance methods in interfaces or methods that are copied from
- // interfaces to lambda-desugared classes because this will be added as a new default method.
- // TODO(b/111118390): It might be possible to transform it into static methods, though.
- if (method.getHolder().isInterface() || accessFlags.isSynthetic()) {
- return false;
- }
-
- boolean wasSeen = methodPoolCollection.markIfNotSeen(method.getHolder(), method.getReference());
- if (wasSeen) {
- // We can't do anything further because even renaming is not allowed due to the keep rule.
- if (!appView.appInfo().isMinificationAllowed(method)) {
- return false;
- }
- // TODO(b/111118390): Renaming will enable more private instance methods to be publicized.
- return false;
- }
- lensBuilder.add(method.getReference());
- accessFlags.promoteToFinal();
- doPublicize(method);
- // The method just became public and is therefore not a library override.
- definition.setLibraryMethodOverride(OptionalBool.FALSE);
- return true;
- }
-}
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 b7342dc..ea25b09 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
@@ -63,7 +63,7 @@
AppView<AppInfoWithLiveness> appView, ExecutorService executorService, Timing timing)
throws ExecutionException {
timing.begin("Access modification");
- if (appView.options().getAccessModifierOptions().isExperimentalAccessModificationEnabled()) {
+ if (appView.options().getAccessModifierOptions().isAccessModificationEnabled()) {
new AccessModifier(appView)
.processStronglyConnectedComponents(executorService)
.installLens(executorService, timing);
diff --git a/src/main/java/com/android/tools/r8/optimize/accessmodification/AccessModifierOptions.java b/src/main/java/com/android/tools/r8/optimize/accessmodification/AccessModifierOptions.java
index e944d38..a9d69d6 100644
--- a/src/main/java/com/android/tools/r8/optimize/accessmodification/AccessModifierOptions.java
+++ b/src/main/java/com/android/tools/r8/optimize/accessmodification/AccessModifierOptions.java
@@ -8,8 +8,6 @@
public class AccessModifierOptions {
- private boolean enableExperimentalAccessModification = true;
-
private InternalOptions options;
public AccessModifierOptions(InternalOptions options) {
@@ -20,9 +18,4 @@
return options.hasProguardConfiguration()
&& options.getProguardConfiguration().isAccessModificationAllowed();
}
-
- public boolean isExperimentalAccessModificationEnabled() {
- // TODO(b/132677331): Do not require -allowaccessmodification in R8 full mode.
- return isAccessModificationEnabled() && enableExperimentalAccessModification;
- }
}