Clean-up change to repackaging for package private
Change-Id: Ie19dd120c44f1c4dbd50dcaeb63fdc139ae33a72
diff --git a/src/main/java/com/android/tools/r8/graph/DexDefinition.java b/src/main/java/com/android/tools/r8/graph/DexDefinition.java
index 33e0f72..c3e6998 100644
--- a/src/main/java/com/android/tools/r8/graph/DexDefinition.java
+++ b/src/main/java/com/android/tools/r8/graph/DexDefinition.java
@@ -105,7 +105,15 @@
public abstract boolean isStaticMember();
- public boolean isNotProgramDefinition() {
- return isDexClass() ? !isProgramClass() : !asDexEncodedMember().isProgramClass();
+ public boolean isNotProgramDefinition(AppView<?> appView) {
+ if (isDexClass()) {
+ return asDexClass().isNotProgramClass();
+ }
+ DexClass clazz = appView.definitionFor(asDexEncodedMember().getHolderType());
+ return clazz == null || clazz.isNotProgramClass();
+ }
+
+ public DexType getContextType() {
+ return isDexClass() ? asDexClass().type : asDexEncodedMember().getHolderType();
}
}
diff --git a/src/main/java/com/android/tools/r8/repackaging/RepackagingConstraintGraph.java b/src/main/java/com/android/tools/r8/repackaging/RepackagingConstraintGraph.java
index 49107ea..bcbba53 100644
--- a/src/main/java/com/android/tools/r8/repackaging/RepackagingConstraintGraph.java
+++ b/src/main/java/com/android/tools/r8/repackaging/RepackagingConstraintGraph.java
@@ -42,13 +42,13 @@
private final ProgramPackage pkg;
private final Map<DexDefinition, Node> nodes = new IdentityHashMap<>();
private final Set<Node> pinnedNodes = Sets.newIdentityHashSet();
- public final Node LIBRARY_BOUNDARY_NODE;
+ private final Node libraryBoundaryNode;
public RepackagingConstraintGraph(AppView<AppInfoWithLiveness> appView, ProgramPackage pkg) {
this.appView = appView;
this.pkg = pkg;
- LIBRARY_BOUNDARY_NODE = createNode(appView.definitionFor(appView.dexItemFactory().objectType));
- pinnedNodes.add(LIBRARY_BOUNDARY_NODE);
+ libraryBoundaryNode = createNode(appView.definitionFor(appView.dexItemFactory().objectType));
+ pinnedNodes.add(libraryBoundaryNode);
}
/** Returns true if all classes in the package can be repackaged. */
@@ -79,11 +79,14 @@
}
Node getNode(DexDefinition definition) {
- Node node = nodes.get(definition);
- if (node == null && definition.isNotProgramDefinition()) {
- return LIBRARY_BOUNDARY_NODE;
+ if (definition.isNotProgramDefinition(appView)) {
+ String packageDescriptor = definition.getContextType().getPackageDescriptor();
+ if (packageDescriptor.equals(pkg.getPackageDescriptor())) {
+ return libraryBoundaryNode;
+ }
+ return null;
}
- return node;
+ return nodes.get(definition);
}
public void populateConstraints(ExecutorService executorService) throws ExecutionException {
diff --git a/src/main/java/com/android/tools/r8/repackaging/RepackagingUseRegistry.java b/src/main/java/com/android/tools/r8/repackaging/RepackagingUseRegistry.java
index f8006a5..91484f7 100644
--- a/src/main/java/com/android/tools/r8/repackaging/RepackagingUseRegistry.java
+++ b/src/main/java/com/android/tools/r8/repackaging/RepackagingUseRegistry.java
@@ -10,7 +10,7 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.ClassAccessFlags;
import com.android.tools.r8.graph.DexClass;
-import com.android.tools.r8.graph.DexEncodedMember;
+import com.android.tools.r8.graph.DexClassAndMember;
import com.android.tools.r8.graph.DexField;
import com.android.tools.r8.graph.DexMethod;
import com.android.tools.r8.graph.DexProgramClass;
@@ -48,10 +48,6 @@
this.node = constraintGraph.getNode(context.getDefinition());
}
- private Predicate<DexClass> isSamePackagePredicate(DexClass one) {
- return other -> one.type.getPackageDescriptor().equals(other.type.getPackageDescriptor());
- }
-
private boolean isOnlyAccessibleFromSamePackage(DexClass referencedClass) {
ClassAccessFlags accessFlags = referencedClass.getAccessFlags();
if (accessFlags.isPackagePrivate()) {
@@ -64,8 +60,8 @@
return false;
}
- private boolean isOnlyAccessibleFromSamePackage(DexEncodedMember<?, ?> member) {
- AccessFlags<?> accessFlags = member.asDexEncodedMember().getAccessFlags();
+ private boolean isOnlyAccessibleFromSamePackage(DexClassAndMember<?, ?> member) {
+ AccessFlags<?> accessFlags = member.getAccessFlags();
if (accessFlags.isPackagePrivate()) {
return true;
}
@@ -103,11 +99,11 @@
registerClassTypeAccess(successfulResolutionResult.getInitialResolutionHolder());
// Similarly, check access to the resolved member.
- DexEncodedMember<?, ?> resolvedMember = successfulResolutionResult.getResolvedMember();
- if (resolvedMember != null) {
+ DexClassAndMember<?, ?> resolutionPair = successfulResolutionResult.getResolutionPair();
+ if (resolutionPair != null) {
RepackagingConstraintGraph.Node resolvedMemberNode =
- constraintGraph.getNode(resolvedMember.asDexEncodedMember());
- if (resolvedMemberNode != null && isOnlyAccessibleFromSamePackage(resolvedMember)) {
+ constraintGraph.getNode(resolutionPair.getDefinition());
+ if (resolvedMemberNode != null && isOnlyAccessibleFromSamePackage(resolutionPair)) {
node.addNeighbor(resolvedMemberNode);
}
}
@@ -233,10 +229,7 @@
// For references in inner class attributes we add an edge from the context to the referenced
// class even if the referenced class would be accessible from another package, to make sure
// that we don't split such classes into different packages.
- Predicate<DexClass> samePackagePredicate = isSamePackagePredicate(outer);
innerClassAttribute.forEachType(
- type ->
- registerTypeAccess(
- type, clazz -> registerClassTypeAccess(clazz, samePackagePredicate)));
+ type -> registerTypeAccess(type, clazz -> registerClassTypeAccess(clazz, alwaysTrue())));
}
}