Explicitly consider globals when computing external type and prefix.
Change-Id: I489b14e49ecf0f0bef840d4c308e5ffc1c2e4a61
diff --git a/src/main/java/com/android/tools/r8/synthesis/SyntheticFinalization.java b/src/main/java/com/android/tools/r8/synthesis/SyntheticFinalization.java
index 07f65be..ef3cdbd 100644
--- a/src/main/java/com/android/tools/r8/synthesis/SyntheticFinalization.java
+++ b/src/main/java/com/android/tools/r8/synthesis/SyntheticFinalization.java
@@ -315,7 +315,7 @@
// Check that the prefix of each synthetic is never itself synthetic.
committed.forEachNonLegacyItem(
item -> {
- if (item.getKind().allowSyntheticContext()) {
+ if (item.getKind().isGlobal()) {
return;
}
String prefix =
diff --git a/src/main/java/com/android/tools/r8/synthesis/SyntheticMarker.java b/src/main/java/com/android/tools/r8/synthesis/SyntheticMarker.java
index c21954b..ceb9a37 100644
--- a/src/main/java/com/android/tools/r8/synthesis/SyntheticMarker.java
+++ b/src/main/java/com/android/tools/r8/synthesis/SyntheticMarker.java
@@ -147,6 +147,9 @@
private static DexType getSyntheticContextType(
DexType type, SyntheticKind kind, DexItemFactory factory) {
+ if (kind.isGlobal()) {
+ return type;
+ }
String prefix = SyntheticNaming.getPrefixForExternalSyntheticType(kind, type);
return factory.createType(DescriptorUtils.getDescriptorFromClassBinaryName(prefix));
}
diff --git a/src/main/java/com/android/tools/r8/synthesis/SyntheticNaming.java b/src/main/java/com/android/tools/r8/synthesis/SyntheticNaming.java
index e95c6a1..37e327f 100644
--- a/src/main/java/com/android/tools/r8/synthesis/SyntheticNaming.java
+++ b/src/main/java/com/android/tools/r8/synthesis/SyntheticNaming.java
@@ -122,15 +122,15 @@
}
SyntheticKind forFixedClass(String descriptor) {
- return register(new SyntheticFixedClassKind(getNextId(), descriptor, false, false));
+ return register(new SyntheticFixedClassKind(getNextId(), descriptor, false));
}
SyntheticKind forGlobalClass() {
- return register(new SyntheticFixedClassKind(getNextId(), "", true, true));
+ return register(new SyntheticFixedClassKind(getNextId(), "", true));
}
SyntheticKind forGlobalClasspathClass() {
- return register(new SyntheticFixedClassKind(getNextId(), "", false, false));
+ return register(new SyntheticFixedClassKind(getNextId(), "", false));
}
List<SyntheticKind> getAllKinds() {
@@ -192,7 +192,6 @@
public abstract boolean isMayOverridesNonProgramType();
- public abstract boolean allowSyntheticContext();
}
private static class SyntheticMethodKind extends SyntheticKind {
@@ -227,10 +226,6 @@
return false;
}
- @Override
- public boolean allowSyntheticContext() {
- return false;
- }
}
private static class SyntheticClassKind extends SyntheticKind {
@@ -268,24 +263,14 @@
return false;
}
- @Override
- public boolean allowSyntheticContext() {
- return false;
- }
}
private static class SyntheticFixedClassKind extends SyntheticClassKind {
private final boolean mayOverridesNonProgramType;
- private final boolean allowSyntheticContext;
- private SyntheticFixedClassKind(
- int id,
- String descriptor,
- boolean mayOverridesNonProgramType,
- boolean allowSyntheticContext) {
+ private SyntheticFixedClassKind(int id, String descriptor, boolean mayOverridesNonProgramType) {
super(id, descriptor, false);
this.mayOverridesNonProgramType = mayOverridesNonProgramType;
- this.allowSyntheticContext = allowSyntheticContext;
}
@Override
@@ -308,10 +293,6 @@
return mayOverridesNonProgramType;
}
- @Override
- public boolean allowSyntheticContext() {
- return allowSyntheticContext;
- }
}
private static final String SYNTHETIC_CLASS_SEPARATOR = "$$";
@@ -333,6 +314,9 @@
static String getPrefixForExternalSyntheticType(SyntheticKind kind, DexType type) {
String binaryName = type.toBinaryName();
+ if (kind.isGlobal()) {
+ return binaryName;
+ }
int index =
binaryName.lastIndexOf(
kind.isFixedSuffixSynthetic() ? kind.descriptor : SYNTHETIC_CLASS_SEPARATOR);