Make synthetic names instance fields.
Change-Id: I697a301fd93e4b043a82319b576fa4bfa7955c0e
diff --git a/src/main/java/com/android/tools/r8/androidapi/ApiReferenceStubber.java b/src/main/java/com/android/tools/r8/androidapi/ApiReferenceStubber.java
index 6a2d78d..5725955 100644
--- a/src/main/java/com/android/tools/r8/androidapi/ApiReferenceStubber.java
+++ b/src/main/java/com/android/tools/r8/androidapi/ApiReferenceStubber.java
@@ -21,7 +21,6 @@
import com.android.tools.r8.graph.UseRegistry;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
import com.android.tools.r8.synthesis.CommittedItems;
-import com.android.tools.r8.synthesis.SyntheticNaming.SyntheticKind;
import com.android.tools.r8.utils.ThreadUtils;
import com.android.tools.r8.utils.WorkList;
import com.google.common.collect.Sets;
@@ -156,7 +155,7 @@
public void processClass(DexProgramClass clazz) {
if (appView
.getSyntheticItems()
- .isSyntheticOfKind(clazz.getType(), SyntheticKind.API_MODEL_OUTLINE)) {
+ .isSyntheticOfKind(clazz.getType(), kinds -> kinds.API_MODEL_OUTLINE)) {
return;
}
findReferencedLibraryClasses(clazz.type);
@@ -235,7 +234,7 @@
.appInfo()
.getSyntheticItems()
.ensureFixedClassFromType(
- SyntheticKind.API_MODEL_STUB,
+ kinds -> kinds.API_MODEL_STUB,
libraryClass.getType(),
appView,
classBuilder -> {
diff --git a/src/main/java/com/android/tools/r8/graph/DexAnnotation.java b/src/main/java/com/android/tools/r8/graph/DexAnnotation.java
index 4ff028a..5a2bffc 100644
--- a/src/main/java/com/android/tools/r8/graph/DexAnnotation.java
+++ b/src/main/java/com/android/tools/r8/graph/DexAnnotation.java
@@ -13,7 +13,7 @@
import com.android.tools.r8.graph.DexValue.DexValueString;
import com.android.tools.r8.graph.DexValue.DexValueType;
import com.android.tools.r8.ir.desugar.CovariantReturnTypeAnnotationTransformer;
-import com.android.tools.r8.synthesis.SyntheticNaming;
+import com.android.tools.r8.synthesis.SyntheticItems;
import com.android.tools.r8.synthesis.SyntheticNaming.SyntheticKind;
import com.android.tools.r8.utils.InternalOptions;
import com.android.tools.r8.utils.Pair;
@@ -399,12 +399,12 @@
}
public static boolean hasSynthesizedClassAnnotation(
- DexAnnotationSet annotations, DexItemFactory factory) {
- return getSynthesizedClassAnnotationInfo(annotations, factory) != null;
+ DexAnnotationSet annotations, DexItemFactory factory, SyntheticItems synthetics) {
+ return getSynthesizedClassAnnotationInfo(annotations, factory, synthetics) != null;
}
public static SyntheticKind getSynthesizedClassAnnotationInfo(
- DexAnnotationSet annotations, DexItemFactory factory) {
+ DexAnnotationSet annotations, DexItemFactory factory, SyntheticItems synthetics) {
if (annotations.size() != 1) {
return null;
}
@@ -425,7 +425,7 @@
return null;
}
SyntheticKind kind =
- SyntheticNaming.SyntheticKind.fromId(kindElement.value.asDexValueInt().getValue());
+ synthetics.getNaming().fromId(kindElement.value.asDexValueInt().getValue());
return kind;
}
diff --git a/src/main/java/com/android/tools/r8/graph/DexItemFactory.java b/src/main/java/com/android/tools/r8/graph/DexItemFactory.java
index 34e4809..6259d4c 100644
--- a/src/main/java/com/android/tools/r8/graph/DexItemFactory.java
+++ b/src/main/java/com/android/tools/r8/graph/DexItemFactory.java
@@ -35,6 +35,7 @@
import com.android.tools.r8.references.ClassReference;
import com.android.tools.r8.references.FieldReference;
import com.android.tools.r8.references.MethodReference;
+import com.android.tools.r8.synthesis.SyntheticNaming;
import com.android.tools.r8.utils.ArrayUtils;
import com.android.tools.r8.utils.DescriptorUtils;
import com.android.tools.r8.utils.Int2StructuralItemArrayMap;
@@ -682,6 +683,12 @@
public final StringConcatFactoryMembers stringConcatFactoryMembers =
new StringConcatFactoryMembers();
+ private final SyntheticNaming syntheticNaming = new SyntheticNaming();
+
+ public SyntheticNaming getSyntheticNaming() {
+ return syntheticNaming;
+ }
+
public final BiMap<DexType, DexType> primitiveToBoxed = HashBiMap.create(
ImmutableMap.<DexType, DexType>builder()
.put(booleanType, boxedBooleanType)
diff --git a/src/main/java/com/android/tools/r8/graph/JarClassFileReader.java b/src/main/java/com/android/tools/r8/graph/JarClassFileReader.java
index ee7bc18..afbda8d 100644
--- a/src/main/java/com/android/tools/r8/graph/JarClassFileReader.java
+++ b/src/main/java/com/android/tools/r8/graph/JarClassFileReader.java
@@ -124,7 +124,9 @@
}
reader.accept(
new CreateDexClassVisitor<>(origin, classKind, reader.b, application, classConsumer),
- new Attribute[] {SyntheticMarker.getMarkerAttributePrototype()},
+ new Attribute[] {
+ SyntheticMarker.getMarkerAttributePrototype(application.getFactory().getSyntheticNaming())
+ },
parsingOptions);
// Read marker.
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/SyntheticArgumentClass.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/SyntheticArgumentClass.java
index 88a4755..ec19e83 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/SyntheticArgumentClass.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/SyntheticArgumentClass.java
@@ -8,7 +8,7 @@
import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
-import com.android.tools.r8.synthesis.SyntheticNaming.SyntheticKind;
+import com.android.tools.r8.synthesis.SyntheticItems.SyntheticKindSelector;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
@@ -50,21 +50,22 @@
this.appView = appView;
}
- private DexProgramClass synthesizeClass(DexProgramClass context, SyntheticKind syntheticKind) {
+ private DexProgramClass synthesizeClass(
+ DexProgramClass context, SyntheticKindSelector syntheticKindSelector) {
return appView
.getSyntheticItems()
- .createFixedClass(syntheticKind, context, appView, builder -> {});
+ .createFixedClass(syntheticKindSelector, context, appView, builder -> {});
}
public SyntheticArgumentClass build(Collection<MergeGroup> mergeGroups) {
DexProgramClass context = getDeterministicContext(mergeGroups);
List<DexType> syntheticArgumentTypes = new ArrayList<>();
syntheticArgumentTypes.add(
- synthesizeClass(context, SyntheticKind.HORIZONTAL_INIT_TYPE_ARGUMENT_1).getType());
+ synthesizeClass(context, kinds -> kinds.HORIZONTAL_INIT_TYPE_ARGUMENT_1).getType());
syntheticArgumentTypes.add(
- synthesizeClass(context, SyntheticKind.HORIZONTAL_INIT_TYPE_ARGUMENT_2).getType());
+ synthesizeClass(context, kinds -> kinds.HORIZONTAL_INIT_TYPE_ARGUMENT_2).getType());
syntheticArgumentTypes.add(
- synthesizeClass(context, SyntheticKind.HORIZONTAL_INIT_TYPE_ARGUMENT_3).getType());
+ synthesizeClass(context, kinds -> kinds.HORIZONTAL_INIT_TYPE_ARGUMENT_3).getType());
return new SyntheticArgumentClass(syntheticArgumentTypes);
}
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java b/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java
index b799580b..67f2c14 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java
@@ -94,7 +94,7 @@
&& getMethodProviderOrNull(instruction.asInvoke().getMethod()) != null
&& !appView
.getSyntheticItems()
- .isSyntheticOfKind(context.getContextType(), SyntheticKind.BACKPORT_WITH_FORWARDING);
+ .isSyntheticOfKind(context.getContextType(), kinds -> kinds.BACKPORT_WITH_FORWARDING);
}
public static List<DexMethod> generateListOfBackportedMethods(
@@ -1575,8 +1575,8 @@
this.methodName = methodName;
}
- protected SyntheticKind getSyntheticKind() {
- return SyntheticNaming.SyntheticKind.BACKPORT;
+ protected SyntheticKind getSyntheticKind(SyntheticNaming naming) {
+ return naming.BACKPORT;
}
@Override
@@ -1596,7 +1596,7 @@
return appView
.getSyntheticItems()
.createMethod(
- getSyntheticKind(),
+ this::getSyntheticKind,
methodProcessingContext.createUniqueContext(),
appView,
builder ->
@@ -1644,8 +1644,8 @@
}
@Override
- protected SyntheticKind getSyntheticKind() {
- return SyntheticKind.BACKPORT_WITH_FORWARDING;
+ protected SyntheticKind getSyntheticKind(SyntheticNaming naming) {
+ return naming.BACKPORT_WITH_FORWARDING;
}
}
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/apimodel/ApiInvokeOutlinerDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/apimodel/ApiInvokeOutlinerDesugaring.java
index aa2ecfa..e642655 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/apimodel/ApiInvokeOutlinerDesugaring.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/apimodel/ApiInvokeOutlinerDesugaring.java
@@ -28,7 +28,6 @@
import com.android.tools.r8.ir.desugar.FreshLocalProvider;
import com.android.tools.r8.ir.desugar.LocalStackAllocator;
import com.android.tools.r8.ir.synthetic.ForwardMethodBuilder;
-import com.android.tools.r8.synthesis.SyntheticNaming.SyntheticKind;
import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.TraversalContinuation;
import com.google.common.collect.ImmutableList;
@@ -171,7 +170,7 @@
return appView
.getSyntheticItems()
.createMethod(
- SyntheticKind.API_MODEL_OUTLINE,
+ kinds -> kinds.API_MODEL_OUTLINE,
context,
appView,
syntheticMethodBuilder -> {
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/constantdynamic/ConstantDynamicInstructionDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/constantdynamic/ConstantDynamicInstructionDesugaring.java
index 1d55e7e..8853e8b 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/constantdynamic/ConstantDynamicInstructionDesugaring.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/constantdynamic/ConstantDynamicInstructionDesugaring.java
@@ -17,7 +17,6 @@
import com.android.tools.r8.ir.desugar.CfInstructionDesugaringEventConsumer;
import com.android.tools.r8.ir.desugar.FreshLocalProvider;
import com.android.tools.r8.ir.desugar.LocalStackAllocator;
-import com.android.tools.r8.synthesis.SyntheticNaming.SyntheticKind;
import com.android.tools.r8.utils.Box;
import java.util.Collection;
import java.util.HashMap;
@@ -117,7 +116,7 @@
appView
.getSyntheticItems()
.createClass(
- SyntheticKind.CONST_DYNAMIC,
+ kinds -> kinds.CONST_DYNAMIC,
methodProcessingContext.createUniqueContext(),
appView,
builder ->
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryAPIConverter.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryAPIConverter.java
index 520b5ea..f041fe3 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryAPIConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryAPIConverter.java
@@ -36,7 +36,6 @@
import com.android.tools.r8.ir.desugar.LocalStackAllocator;
import com.android.tools.r8.ir.desugar.desugaredlibrary.apiconversion.DesugaredLibraryWrapperSynthesizerEventConsumer.DesugaredLibraryClasspathWrapperSynthesizeEventConsumer;
import com.android.tools.r8.ir.synthetic.DesugaredLibraryAPIConversionCfCodeProvider.APIConversionCfCodeProvider;
-import com.android.tools.r8.synthesis.SyntheticNaming.SyntheticKind;
import com.android.tools.r8.utils.DescriptorUtils;
import com.android.tools.r8.utils.StringDiagnostic;
import com.google.common.collect.Iterables;
@@ -126,7 +125,7 @@
static boolean isAPIConversionSyntheticType(
DexType type, DesugaredLibraryWrapperSynthesizer wrapperSynthesizor, AppView<?> appView) {
return wrapperSynthesizor.isSyntheticWrapper(type)
- || appView.getSyntheticItems().isSyntheticOfKind(type, SyntheticKind.API_CONVERSION);
+ || appView.getSyntheticItems().isSyntheticOfKind(type, kinds -> kinds.API_CONVERSION);
}
public static boolean isVivifiedType(DexType type) {
@@ -429,7 +428,7 @@
appView
.getSyntheticItems()
.createMethod(
- SyntheticKind.API_CONVERSION_PARAMETERS,
+ kinds -> kinds.API_CONVERSION_PARAMETERS,
methodProcessingContext.createUniqueContext(),
appView,
builder ->
@@ -534,7 +533,7 @@
appView
.getSyntheticItems()
.createMethod(
- SyntheticKind.API_CONVERSION,
+ kinds -> kinds.API_CONVERSION,
methodProcessingContext.createUniqueContext(),
appView,
builder ->
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryEnumConversionSynthesizer.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryEnumConversionSynthesizer.java
index 60a2281..d69a158 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryEnumConversionSynthesizer.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryEnumConversionSynthesizer.java
@@ -21,7 +21,6 @@
import com.android.tools.r8.synthesis.SyntheticClasspathClassBuilder;
import com.android.tools.r8.synthesis.SyntheticMethodBuilder;
import com.android.tools.r8.synthesis.SyntheticMethodBuilder.SyntheticCodeGenerator;
-import com.android.tools.r8.synthesis.SyntheticNaming.SyntheticKind;
import com.android.tools.r8.synthesis.SyntheticProgramClassBuilder;
import com.google.common.collect.Iterables;
@@ -116,7 +115,7 @@
DexProgramClass enumConversion =
appView
.getSyntheticItems()
- .getExistingFixedClass(SyntheticKind.ENUM_CONVERSION, clazz, appView);
+ .getExistingFixedClass(kinds -> kinds.ENUM_CONVERSION, clazz, appView);
DexMethod method =
factory.createMethod(
enumConversion.type, factory.createProto(destType, srcType), factory.convertMethodName);
@@ -137,7 +136,7 @@
return appView
.getSyntheticItems()
.ensureFixedClass(
- SyntheticKind.ENUM_CONVERSION,
+ kinds -> kinds.ENUM_CONVERSION,
programContext,
appView,
builder -> buildEnumMethodsWithCode(builder, enumFields, type, vivifiedType),
@@ -150,14 +149,14 @@
if (context.isProgramClass()) {
return appView
.getSyntheticItems()
- .getExistingFixedClass(SyntheticKind.ENUM_CONVERSION, context, appView);
+ .getExistingFixedClass(kinds -> kinds.ENUM_CONVERSION, context, appView);
}
DexType type = context.type;
DexType vivifiedType = vivifiedTypeFor(context.type, appView);
return appView
.getSyntheticItems()
.ensureFixedClasspathClass(
- SyntheticKind.ENUM_CONVERSION,
+ kinds -> kinds.ENUM_CONVERSION,
context.asClasspathOrLibraryClass(),
appView,
builder -> buildEnumMethodsWithoutCode(builder, type, vivifiedType),
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryWrapperSynthesizer.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryWrapperSynthesizer.java
index e1fbb96..79f1ff2 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryWrapperSynthesizer.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryWrapperSynthesizer.java
@@ -40,8 +40,8 @@
import com.android.tools.r8.position.MethodPosition;
import com.android.tools.r8.position.Position;
import com.android.tools.r8.synthesis.SyntheticClassBuilder;
+import com.android.tools.r8.synthesis.SyntheticItems.SyntheticKindSelector;
import com.android.tools.r8.synthesis.SyntheticMethodBuilder;
-import com.android.tools.r8.synthesis.SyntheticNaming.SyntheticKind;
import com.android.tools.r8.utils.StringDiagnostic;
import java.util.ArrayList;
import java.util.Collection;
@@ -108,8 +108,8 @@
}
public boolean isSyntheticWrapper(DexType type) {
- return appView.getSyntheticItems().isSyntheticOfKind(type, SyntheticKind.WRAPPER)
- || appView.getSyntheticItems().isSyntheticOfKind(type, SyntheticKind.VIVIFIED_WRAPPER);
+ return appView.getSyntheticItems().isSyntheticOfKind(type, kinds -> kinds.WRAPPER)
+ || appView.getSyntheticItems().isSyntheticOfKind(type, kinds -> kinds.VIVIFIED_WRAPPER);
}
public boolean shouldConvert(DexType type, DexMethod method) {
@@ -202,7 +202,7 @@
appView
.getSyntheticItems()
.createMethod(
- SyntheticKind.ARRAY_CONVERSION,
+ kinds -> kinds.ARRAY_CONVERSION,
contextSupplier.get(),
appView,
builder ->
@@ -351,7 +351,7 @@
DexType vivifiedType = vivifiedTypeFor(type);
DexClass wrapper =
ensureClasspathWrapper(
- SyntheticKind.WRAPPER,
+ kinds -> kinds.WRAPPER,
vivifiedType,
type,
classpathOrLibraryContext,
@@ -363,7 +363,7 @@
DesugaredLibraryWrapperSynthesizer::codeForClasspathMethod));
DexClass vivifiedWrapper =
ensureClasspathWrapper(
- SyntheticKind.VIVIFIED_WRAPPER,
+ kinds -> kinds.VIVIFIED_WRAPPER,
type,
vivifiedType,
classpathOrLibraryContext,
@@ -382,8 +382,8 @@
DexClass vivifiedWrapper;
DexClass wrapper;
assert appView.options().isDesugaredLibraryCompilation();
- wrapper = getExistingProgramWrapper(context, SyntheticKind.WRAPPER);
- vivifiedWrapper = getExistingProgramWrapper(context, SyntheticKind.VIVIFIED_WRAPPER);
+ wrapper = getExistingProgramWrapper(context, kinds -> kinds.WRAPPER);
+ vivifiedWrapper = getExistingProgramWrapper(context, kinds -> kinds.VIVIFIED_WRAPPER);
DexField wrapperField = getWrapperUniqueField(wrapper);
DexField vivifiedWrapperField = getWrapperUniqueField(vivifiedWrapper);
return new WrapperConversions(
@@ -391,8 +391,9 @@
getConversion(vivifiedWrapper, wrapperField.type, vivifiedWrapperField.type));
}
- private DexProgramClass getExistingProgramWrapper(DexClass context, SyntheticKind kind) {
- return appView.getSyntheticItems().getExistingFixedClass(kind, context, appView);
+ private DexProgramClass getExistingProgramWrapper(
+ DexClass context, SyntheticKindSelector kindSelector) {
+ return appView.getSyntheticItems().getExistingFixedClass(kindSelector, context, appView);
}
private DexMethod getConversion(DexClass wrapper, DexType returnType, DexType argType) {
@@ -412,7 +413,7 @@
}
private DexProgramClass ensureProgramWrapper(
- SyntheticKind kind,
+ SyntheticKindSelector kindSelector,
DexType wrappingType,
DexType wrappedType,
DexProgramClass programContext,
@@ -422,7 +423,7 @@
return appView
.getSyntheticItems()
.ensureFixedClass(
- kind,
+ kindSelector,
programContext,
appView,
builder -> buildWrapper(wrappingType, wrappedType, programContext, builder),
@@ -432,7 +433,7 @@
}
private DexClasspathClass ensureClasspathWrapper(
- SyntheticKind kind,
+ SyntheticKindSelector kindSelector,
DexType wrappingType,
DexType wrappedType,
ClasspathOrLibraryClass classpathOrLibraryContext,
@@ -442,7 +443,7 @@
return appView
.getSyntheticItems()
.ensureFixedClasspathClass(
- kind,
+ kindSelector,
classpathOrLibraryContext,
appView,
builder -> {
@@ -459,7 +460,10 @@
}
private void getExistingProgramConversionMethod(
- SyntheticKind kind, DexProgramClass context, DexClass wrapper, DexClass reverseWrapper) {
+ SyntheticKindSelector kindSelector,
+ DexProgramClass context,
+ DexClass wrapper,
+ DexClass reverseWrapper) {
DexField wrapperField = getWrapperUniqueField(wrapper);
DexField reverseWrapperField = getWrapperUniqueField(reverseWrapper);
DexProto proto = factory.createProto(reverseWrapperField.type, wrapperField.type);
@@ -468,7 +472,7 @@
.ensureFixedClassMethod(
factory.convertMethodName,
proto,
- kind,
+ kindSelector,
context,
appView,
ignored -> {},
@@ -694,18 +698,18 @@
DexProgramClass programContext = context.asProgramClass();
DexClass wrapper =
ensureProgramWrapper(
- SyntheticKind.WRAPPER, vivifiedTypeFor(type), type, programContext, eventConsumer);
+ kinds -> kinds.WRAPPER, vivifiedTypeFor(type), type, programContext, eventConsumer);
DexClass vivifiedWrapper =
ensureProgramWrapper(
- SyntheticKind.VIVIFIED_WRAPPER,
+ kinds -> kinds.VIVIFIED_WRAPPER,
type,
vivifiedTypeFor(type),
programContext,
eventConsumer);
getExistingProgramConversionMethod(
- SyntheticKind.WRAPPER, programContext, wrapper, vivifiedWrapper);
+ kinds -> kinds.WRAPPER, programContext, wrapper, vivifiedWrapper);
getExistingProgramConversionMethod(
- SyntheticKind.VIVIFIED_WRAPPER, programContext, vivifiedWrapper, wrapper);
+ kinds -> kinds.VIVIFIED_WRAPPER, programContext, vivifiedWrapper, wrapper);
}
private void ensureProgramWrappersVirtualMethods(
@@ -713,7 +717,7 @@
Iterable<DexMethod> methods,
CfClassSynthesizerDesugaringEventConsumer eventConsumer,
ClassSynthesisDesugaringContext processingContext) {
- DexProgramClass wrapper = getExistingProgramWrapper(context, SyntheticKind.WRAPPER);
+ DexProgramClass wrapper = getExistingProgramWrapper(context, kinds -> kinds.WRAPPER);
DexEncodedField wrapperField = getWrapperUniqueEncodedField(wrapper);
wrapper.addVirtualMethods(
synthesizeVirtualMethodsForTypeWrapper(
@@ -726,7 +730,7 @@
eventConsumer,
() -> processingContext.createUniqueContext(wrapper))));
DexProgramClass vivifiedWrapper =
- getExistingProgramWrapper(context, SyntheticKind.VIVIFIED_WRAPPER);
+ getExistingProgramWrapper(context, kinds -> kinds.VIVIFIED_WRAPPER);
DexEncodedField vivifiedWrapperField = getWrapperUniqueEncodedField(vivifiedWrapper);
vivifiedWrapper.addVirtualMethods(
synthesizeVirtualMethodsForVivifiedTypeWrapper(
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/DesugaredLibraryRetargeterSyntheticHelper.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/DesugaredLibraryRetargeterSyntheticHelper.java
index 6102e1a..1fa4b75 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/DesugaredLibraryRetargeterSyntheticHelper.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/DesugaredLibraryRetargeterSyntheticHelper.java
@@ -19,6 +19,7 @@
import com.android.tools.r8.ir.desugar.desugaredlibrary.retargeter.DesugaredLibraryRetargeterSynthesizerEventConsumer.DesugaredLibraryRetargeterL8SynthesizerEventConsumer;
import com.android.tools.r8.ir.synthetic.EmulateDispatchSyntheticCfCodeProvider;
import com.android.tools.r8.synthesis.SyntheticClassBuilder;
+import com.android.tools.r8.synthesis.SyntheticItems.SyntheticKindSelector;
import com.android.tools.r8.synthesis.SyntheticNaming.SyntheticKind;
import java.util.LinkedHashMap;
@@ -46,7 +47,7 @@
.ensureFixedClasspathMethodFromType(
retarget.getName(),
retarget.getProto(),
- SyntheticKind.RETARGET_STUB,
+ kinds -> kinds.RETARGET_STUB,
retarget.getHolderType(),
appView,
ignored -> {},
@@ -70,14 +71,20 @@
return ensureRetargetMethod(forwardingMethod(descriptor), eventConsumer);
}
+ private boolean verifyKind(DerivedMethod method, SyntheticKindSelector kindSelector) {
+ SyntheticKind kind = kindSelector.select(appView.getSyntheticItems().getNaming());
+ assert method.getHolderKind().equals(kind);
+ return true;
+ }
+
private DexMethod emulatedHolderDispatchMethod(DexType holder, DerivedMethod method) {
- assert method.getHolderKind() == SyntheticKind.RETARGET_CLASS;
+ assert verifyKind(method, kinds -> kinds.RETARGET_CLASS);
DexProto newProto = appView.dexItemFactory().prependHolderToProto(method.getMethod());
return appView.dexItemFactory().createMethod(holder, newProto, method.getName());
}
DexMethod emulatedInterfaceDispatchMethod(DexType holder, DerivedMethod method) {
- assert method.getHolderKind() == SyntheticKind.RETARGET_INTERFACE;
+ assert verifyKind(method, kinds -> kinds.RETARGET_INTERFACE);
return appView.dexItemFactory().createMethod(holder, method.getProto(), method.getName());
}
@@ -102,7 +109,7 @@
appView
.getSyntheticItems()
.getExistingFixedClass(
- emulatedDispatchMethod.getHolderKind(), holderContext, appView);
+ ignored -> emulatedDispatchMethod.getHolderKind(), holderContext, appView);
DexMethod dispatchMethod =
emulatedHolderDispatchMethod(syntheticClass.type, emulatedDispatchMethod);
assert syntheticClass.lookupMethod(dispatchMethod) != null;
@@ -115,7 +122,7 @@
appView
.getSyntheticItems()
.ensureFixedClasspathClass(
- SyntheticKind.RETARGET_CLASS,
+ kinds -> kinds.RETARGET_CLASS,
context,
appView,
classBuilder ->
@@ -140,7 +147,7 @@
appView
.getSyntheticItems()
.ensureFixedClass(
- emulatedDispatchMethod.getHolderKind(),
+ ignored -> emulatedDispatchMethod.getHolderKind(),
holderContext,
appView,
classBuilder -> buildHolderDispatchMethod(classBuilder, itfClass, descriptor, null),
@@ -156,14 +163,14 @@
if (appView.options().isDesugaredLibraryCompilation()) {
return appView
.getSyntheticItems()
- .getExistingFixedClass(itfMethod.getHolderKind(), itfContext, appView);
+ .getExistingFixedClass(ignored -> itfMethod.getHolderKind(), itfContext, appView);
}
ClasspathOrLibraryClass context = itfContext.asClasspathOrLibraryClass();
assert context != null;
return appView
.getSyntheticItems()
.ensureFixedClasspathClass(
- SyntheticKind.RETARGET_INTERFACE,
+ kinds -> kinds.RETARGET_INTERFACE,
context,
appView,
classBuilder -> buildInterfaceDispatchMethod(classBuilder, descriptor),
@@ -180,7 +187,7 @@
return appView
.getSyntheticItems()
.ensureFixedClass(
- itfMethod.getHolderKind(),
+ ignore -> itfMethod.getHolderKind(),
itfContext,
appView,
classBuilder -> buildInterfaceDispatchMethod(classBuilder, descriptor),
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/HumanToMachineEmulatedInterfaceConverter.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/HumanToMachineEmulatedInterfaceConverter.java
index 182202b..5f385c5 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/HumanToMachineEmulatedInterfaceConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/HumanToMachineEmulatedInterfaceConverter.java
@@ -16,7 +16,7 @@
import com.android.tools.r8.ir.desugar.desugaredlibrary.machinespecification.EmulatedDispatchMethodDescriptor;
import com.android.tools.r8.ir.desugar.desugaredlibrary.machinespecification.EmulatedInterfaceDescriptor;
import com.android.tools.r8.ir.desugar.desugaredlibrary.machinespecification.MachineRewritingFlags;
-import com.android.tools.r8.synthesis.SyntheticNaming.SyntheticKind;
+import com.android.tools.r8.synthesis.SyntheticNaming;
import com.android.tools.r8.utils.WorkList;
import com.google.common.collect.Sets;
import java.util.ArrayList;
@@ -68,7 +68,8 @@
private EmulatedDispatchMethodDescriptor computeEmulatedDispatchDescriptor(
DexMethod method, HumanRewritingFlags rewritingFlags, AppInfoWithClassHierarchy appInfo) {
- DerivedMethod forwardingMethod = new DerivedMethod(method, SyntheticKind.COMPANION_CLASS);
+ SyntheticNaming syntheticNaming = appInfo.getSyntheticItems().getNaming();
+ DerivedMethod forwardingMethod = new DerivedMethod(method, syntheticNaming.COMPANION_CLASS);
DexMethod itfDexMethod =
appInfo
.dexItemFactory()
@@ -78,7 +79,7 @@
method.getName());
DerivedMethod interfaceMethod = new DerivedMethod(itfDexMethod);
DerivedMethod dispatchMethod =
- new DerivedMethod(method, SyntheticKind.EMULATED_INTERFACE_CLASS);
+ new DerivedMethod(method, syntheticNaming.EMULATED_INTERFACE_CLASS);
LinkedHashMap<DexType, DerivedMethod> dispatchCases = getDispatchCases(rewritingFlags, method);
return new EmulatedDispatchMethodDescriptor(
interfaceMethod, dispatchMethod, forwardingMethod, dispatchCases);
@@ -109,6 +110,7 @@
}
}
if (subInterfaces != null) {
+ SyntheticNaming syntheticNaming = appInfo.getSyntheticItems().getNaming();
for (int i = subInterfaces.size() - 1; i >= 0; i--) {
DexClass subInterfaceClass = appInfo.definitionFor(subInterfaces.get(i));
assert subInterfaceClass != null;
@@ -119,7 +121,8 @@
assert result.isDefaultMethod();
DexMethod reference = result.getReference();
extraDispatchCases.put(
- subInterfaceClass.type, new DerivedMethod(reference, SyntheticKind.COMPANION_CLASS));
+ subInterfaceClass.type,
+ new DerivedMethod(reference, syntheticNaming.COMPANION_CLASS));
}
}
} else {
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/HumanToMachineRetargetConverter.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/HumanToMachineRetargetConverter.java
index 6db6518..f64a3d0 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/HumanToMachineRetargetConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/HumanToMachineRetargetConverter.java
@@ -15,7 +15,7 @@
import com.android.tools.r8.ir.desugar.desugaredlibrary.machinespecification.DerivedMethod;
import com.android.tools.r8.ir.desugar.desugaredlibrary.machinespecification.EmulatedDispatchMethodDescriptor;
import com.android.tools.r8.ir.desugar.desugaredlibrary.machinespecification.MachineRewritingFlags;
-import com.android.tools.r8.synthesis.SyntheticNaming.SyntheticKind;
+import com.android.tools.r8.synthesis.SyntheticNaming;
import com.android.tools.r8.utils.TraversalContinuation;
import com.google.common.collect.Sets;
import java.util.LinkedHashMap;
@@ -123,11 +123,12 @@
return;
}
// TODO(b/184026720): Implement library boundaries.
+ SyntheticNaming syntheticNaming = appInfo.getSyntheticItems().getNaming();
DerivedMethod forwardingMethod = new DerivedMethod(forwardingDexMethod);
DerivedMethod interfaceMethod =
- new DerivedMethod(src.getReference(), SyntheticKind.RETARGET_INTERFACE);
+ new DerivedMethod(src.getReference(), syntheticNaming.RETARGET_INTERFACE);
DerivedMethod dispatchMethod =
- new DerivedMethod(src.getReference(), SyntheticKind.RETARGET_CLASS);
+ new DerivedMethod(src.getReference(), syntheticNaming.RETARGET_CLASS);
LinkedHashMap<DexType, DerivedMethod> dispatchCases = new LinkedHashMap<>();
builder.putEmulatedVirtualRetarget(
src.getReference(),
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceDesugaringForTesting.java b/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceDesugaringForTesting.java
index dab2a94..65379b5 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceDesugaringForTesting.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceDesugaringForTesting.java
@@ -4,12 +4,12 @@
package com.android.tools.r8.ir.desugar.itf;
-import com.android.tools.r8.synthesis.SyntheticNaming.SyntheticKind;
-
public class InterfaceDesugaringForTesting {
+ public static final String EMULATED_INTERFACE_CLASS_SUFFIX = "$-EL";
+
public static String getEmulateLibraryClassNameSuffix() {
- return SyntheticKind.EMULATED_INTERFACE_CLASS.getDescriptor();
+ return EMULATED_INTERFACE_CLASS_SUFFIX;
}
public static String getCompanionClassNameSuffix() {
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceDesugaringSyntheticHelper.java b/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceDesugaringSyntheticHelper.java
index 5d007195..dc739bb 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceDesugaringSyntheticHelper.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceDesugaringSyntheticHelper.java
@@ -41,6 +41,7 @@
import com.android.tools.r8.ir.desugar.desugaredlibrary.machinespecification.EmulatedInterfaceDescriptor;
import com.android.tools.r8.ir.desugar.itf.EmulatedInterfaceSynthesizerEventConsumer.ClasspathEmulatedInterfaceSynthesizerEventConsumer;
import com.android.tools.r8.synthesis.SyntheticClassBuilder;
+import com.android.tools.r8.synthesis.SyntheticItems.SyntheticKindSelector;
import com.android.tools.r8.synthesis.SyntheticMethodBuilder;
import com.android.tools.r8.synthesis.SyntheticNaming.SyntheticKind;
import com.android.tools.r8.utils.InternalOptions;
@@ -120,8 +121,14 @@
return true;
}
+ public boolean verifyKind(DerivedMethod method, SyntheticKindSelector kindSelector) {
+ SyntheticKind kind = kindSelector.select(appView.getSyntheticItems().getNaming());
+ assert method.getHolderKind().equals(kind);
+ return true;
+ }
+
DexMethod emulatedInterfaceDispatchMethod(DerivedMethod method, DexType holder) {
- assert method.getHolderKind() == SyntheticKind.EMULATED_INTERFACE_CLASS;
+ assert verifyKind(method, kinds -> kinds.EMULATED_INTERFACE_CLASS);
DexProto newProto = appView.dexItemFactory().prependHolderToProto(method.getMethod());
return appView.dexItemFactory().createMethod(holder, newProto, method.getName());
}
@@ -168,7 +175,7 @@
return appView
.getSyntheticItems()
.ensureFixedClasspathClassFromType(
- SyntheticKind.EMULATED_INTERFACE_MARKER_CLASS,
+ kinds -> kinds.EMULATED_INTERFACE_MARKER_CLASS,
type,
appView,
SyntheticClassBuilder::setInterface,
@@ -247,7 +254,7 @@
if (method.getHolderKind() == null) {
return method.getMethod();
}
- assert method.getHolderKind() == SyntheticKind.COMPANION_CLASS;
+ assert verifyKind(method, kinds -> kinds.COMPANION_CLASS);
DexClassAndMethod resolvedMethod =
appView.appInfoForDesugaring().resolveMethod(method.getMethod(), true).getResolutionPair();
return ensureDefaultAsMethodOfCompanionClassStub(resolvedMethod).getReference();
@@ -256,20 +263,20 @@
DexClassAndMethod ensureEmulatedInterfaceDispatchMethod(
DerivedMethod emulatedDispatchMethod,
ClasspathEmulatedInterfaceSynthesizerEventConsumer eventConsumer) {
- assert emulatedDispatchMethod.getHolderKind() == SyntheticKind.EMULATED_INTERFACE_CLASS;
+ assert verifyKind(emulatedDispatchMethod, kinds -> kinds.EMULATED_INTERFACE_CLASS);
DexClassAndMethod method =
appView
.appInfoForDesugaring()
.resolveMethod(emulatedDispatchMethod.getMethod(), true)
.getResolutionPair();
- assert emulatedDispatchMethod.getHolderKind() == SyntheticKind.EMULATED_INTERFACE_CLASS;
+ assert verifyKind(emulatedDispatchMethod, kinds -> kinds.EMULATED_INTERFACE_CLASS);
if (method.isProgramMethod()) {
assert appView.options().isDesugaredLibraryCompilation();
DexProgramClass emulatedInterface =
appView
.getSyntheticItems()
.getExistingFixedClass(
- SyntheticKind.EMULATED_INTERFACE_CLASS,
+ kinds -> kinds.EMULATED_INTERFACE_CLASS,
method.asProgramMethod().getHolder(),
appView);
DexMethod emulatedInterfaceMethod =
@@ -286,7 +293,7 @@
.ensureFixedClasspathClassMethod(
emulatedInterfaceMethod.getName(),
emulatedInterfaceMethod.getProto(),
- SyntheticKind.EMULATED_INTERFACE_CLASS,
+ kinds -> kinds.EMULATED_INTERFACE_CLASS,
method.getHolder().asClasspathOrLibraryClass(),
appView,
classBuilder -> {},
@@ -420,7 +427,7 @@
.ensureFixedClasspathClassMethod(
companionMethodReference.getName(),
companionMethodReference.getProto(),
- SyntheticKind.COMPANION_CLASS,
+ kinds -> kinds.COMPANION_CLASS,
context,
appView,
classBuilder -> {},
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceMethodRewriter.java b/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceMethodRewriter.java
index 85efd2b..2ae7d7d 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceMethodRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceMethodRewriter.java
@@ -43,7 +43,6 @@
import com.android.tools.r8.ir.synthetic.ForwardMethodBuilder;
import com.android.tools.r8.origin.Origin;
import com.android.tools.r8.position.MethodPosition;
-import com.android.tools.r8.synthesis.SyntheticNaming;
import com.android.tools.r8.utils.InternalOptions;
import com.android.tools.r8.utils.collections.ProgramMethodSet;
import com.android.tools.r8.utils.structural.Ordered;
@@ -382,7 +381,7 @@
appView
.getSyntheticItems()
.createMethod(
- SyntheticNaming.SyntheticKind.STATIC_INTERFACE_CALL,
+ kind -> kind.STATIC_INTERFACE_CALL,
methodProcessingContext.createUniqueContext(),
appView,
syntheticMethodBuilder ->
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceProcessor.java b/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceProcessor.java
index 06f2d76..5d14741 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceProcessor.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceProcessor.java
@@ -26,7 +26,6 @@
import com.android.tools.r8.graph.NestedGraphLens;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.synthesis.SyntheticMethodBuilder;
-import com.android.tools.r8.synthesis.SyntheticNaming.SyntheticKind;
import com.android.tools.r8.utils.Pair;
import com.android.tools.r8.utils.collections.BidirectionalManyToManyRepresentativeMap;
import com.android.tools.r8.utils.collections.BidirectionalManyToOneRepresentativeMap;
@@ -96,7 +95,7 @@
.ensureFixedClassMethod(
methodName,
methodProto,
- SyntheticKind.COMPANION_CLASS,
+ kinds -> kinds.COMPANION_CLASS,
iface,
appView,
builder ->
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/itf/ProgramEmulatedInterfaceSynthesizer.java b/src/main/java/com/android/tools/r8/ir/desugar/itf/ProgramEmulatedInterfaceSynthesizer.java
index 8d14980..b8b50d9 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/itf/ProgramEmulatedInterfaceSynthesizer.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/itf/ProgramEmulatedInterfaceSynthesizer.java
@@ -18,7 +18,6 @@
import com.android.tools.r8.ir.desugar.itf.EmulatedInterfaceSynthesizerEventConsumer.L8ProgramEmulatedInterfaceSynthesizerEventConsumer;
import com.android.tools.r8.ir.synthetic.EmulateDispatchSyntheticCfCodeProvider;
import com.android.tools.r8.synthesis.SyntheticMethodBuilder;
-import com.android.tools.r8.synthesis.SyntheticNaming;
import com.android.tools.r8.synthesis.SyntheticProgramClassBuilder;
import com.android.tools.r8.utils.StringDiagnostic;
import java.util.LinkedHashMap;
@@ -48,7 +47,7 @@
return appView
.getSyntheticItems()
.ensureFixedClass(
- SyntheticNaming.SyntheticKind.EMULATED_INTERFACE_CLASS,
+ kinds -> kinds.EMULATED_INTERFACE_CLASS,
emulatedInterface,
appView,
builder ->
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/lambda/LambdaInstructionDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/lambda/LambdaInstructionDesugaring.java
index f7e8d1a..d336a16 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/lambda/LambdaInstructionDesugaring.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/lambda/LambdaInstructionDesugaring.java
@@ -30,7 +30,6 @@
import com.android.tools.r8.ir.desugar.LambdaClass;
import com.android.tools.r8.ir.desugar.LambdaDescriptor;
import com.android.tools.r8.ir.desugar.LocalStackAllocator;
-import com.android.tools.r8.synthesis.SyntheticNaming;
import com.android.tools.r8.utils.Box;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Sets;
@@ -165,7 +164,7 @@
appView
.getSyntheticItems()
.createClass(
- SyntheticNaming.SyntheticKind.LAMBDA,
+ kinds -> kinds.LAMBDA,
methodProcessingContext.createUniqueContext(),
appView,
builder ->
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/nest/NestBasedAccessDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/nest/NestBasedAccessDesugaring.java
index 8f658a3..4da9973 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/nest/NestBasedAccessDesugaring.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/nest/NestBasedAccessDesugaring.java
@@ -36,7 +36,6 @@
import com.android.tools.r8.ir.desugar.FreshLocalProvider;
import com.android.tools.r8.ir.desugar.LocalStackAllocator;
import com.android.tools.r8.ir.desugar.ProgramAdditions;
-import com.android.tools.r8.synthesis.SyntheticNaming.SyntheticKind;
import com.android.tools.r8.utils.BooleanUtils;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterables;
@@ -444,7 +443,7 @@
return appView
.getSyntheticItems()
.createFixedClass(
- SyntheticKind.INIT_TYPE_ARGUMENT,
+ kinds -> kinds.INIT_TYPE_ARGUMENT,
method.asProgramMethod().getHolder(),
appView,
builder -> {})
@@ -454,7 +453,7 @@
return appView
.getSyntheticItems()
.ensureFixedClasspathClass(
- SyntheticKind.INIT_TYPE_ARGUMENT,
+ kinds -> kinds.INIT_TYPE_ARGUMENT,
method.asClasspathMethod().getHolder(),
appView,
ignored -> {},
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/records/RecordDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/records/RecordDesugaring.java
index a6fcf97..3f17800 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/records/RecordDesugaring.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/records/RecordDesugaring.java
@@ -51,7 +51,6 @@
import com.android.tools.r8.ir.synthetic.RecordCfCodeProvider.RecordEqualsCfCodeProvider;
import com.android.tools.r8.ir.synthetic.RecordCfCodeProvider.RecordGetFieldsAsObjectsCfCodeProvider;
import com.android.tools.r8.ir.synthetic.SyntheticCfCodeProvider;
-import com.android.tools.r8.synthesis.SyntheticNaming;
import com.android.tools.r8.utils.InternalOptions;
import com.google.common.collect.ImmutableList;
import java.util.ArrayList;
@@ -285,7 +284,7 @@
return appView
.getSyntheticItems()
.createMethod(
- SyntheticNaming.SyntheticKind.RECORD_HELPER,
+ kinds -> kinds.RECORD_HELPER,
methodProcessingContext.createUniqueContext(),
appView,
builder ->
@@ -374,7 +373,7 @@
appView
.getSyntheticItems()
.ensureFixedClassFromType(
- SyntheticNaming.SyntheticKind.RECORD_TAG,
+ kinds -> kinds.RECORD_TAG,
factory.recordType,
appView,
builder -> {
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/twr/TwrInstructionDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/twr/TwrInstructionDesugaring.java
index 476859a..017ba89 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/twr/TwrInstructionDesugaring.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/twr/TwrInstructionDesugaring.java
@@ -22,7 +22,7 @@
import com.android.tools.r8.ir.desugar.FreshLocalProvider;
import com.android.tools.r8.ir.desugar.LocalStackAllocator;
import com.android.tools.r8.ir.desugar.backports.BackportedMethods;
-import com.android.tools.r8.synthesis.SyntheticNaming.SyntheticKind;
+import com.android.tools.r8.synthesis.SyntheticItems.SyntheticKindSelector;
import com.android.tools.r8.utils.InternalOptions;
import com.google.common.collect.ImmutableList;
import java.util.Collection;
@@ -82,7 +82,7 @@
DexProto proto =
factory.createProto(factory.voidType, factory.throwableType, factory.throwableType);
return createAndCallSyntheticMethod(
- SyntheticKind.BACKPORT,
+ kinds -> kinds.BACKPORT,
proto,
BackportedMethods::ThrowableMethods_addSuppressed,
methodProcessingContext,
@@ -98,7 +98,7 @@
factory.createProto(
factory.createArrayType(1, factory.throwableType), factory.throwableType);
return createAndCallSyntheticMethod(
- SyntheticKind.BACKPORT,
+ kinds -> kinds.BACKPORT,
proto,
BackportedMethods::ThrowableMethods_getSuppressed,
methodProcessingContext,
@@ -111,7 +111,7 @@
MethodProcessingContext methodProcessingContext) {
// Synthesize a new method.
return createAndCallSyntheticMethod(
- SyntheticKind.TWR_CLOSE_RESOURCE,
+ kinds -> kinds.TWR_CLOSE_RESOURCE,
twrCloseResourceProto,
BackportedMethods::CloseResourceMethod_closeResourceImpl,
methodProcessingContext,
@@ -120,7 +120,7 @@
}
private ImmutableList<CfInstruction> createAndCallSyntheticMethod(
- SyntheticKind kind,
+ SyntheticKindSelector kindSelector,
DexProto proto,
BiFunction<InternalOptions, DexMethod, CfCode> generator,
MethodProcessingContext methodProcessingContext,
@@ -130,7 +130,7 @@
appView
.getSyntheticItems()
.createMethod(
- kind,
+ kindSelector,
methodProcessingContext.createUniqueContext(),
appView,
builder ->
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/OutlinerImpl.java b/src/main/java/com/android/tools/r8/ir/optimize/OutlinerImpl.java
index 3edb51f..f04e328 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/OutlinerImpl.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/OutlinerImpl.java
@@ -68,7 +68,6 @@
import com.android.tools.r8.naming.ClassNameMapper;
import com.android.tools.r8.origin.Origin;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
-import com.android.tools.r8.synthesis.SyntheticNaming.SyntheticKind;
import com.android.tools.r8.utils.InternalOptions;
import com.android.tools.r8.utils.InternalOptions.OutlineOptions;
import com.android.tools.r8.utils.ListUtils;
@@ -1525,7 +1524,7 @@
appView
.getSyntheticItems()
.createMethod(
- SyntheticKind.OUTLINE,
+ kinds -> kinds.OUTLINE,
methodProcessingContext.createUniqueContext(),
appView,
builder -> {
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/ServiceLoaderRewriter.java b/src/main/java/com/android/tools/r8/ir/optimize/ServiceLoaderRewriter.java
index 260a5a3..1288379 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/ServiceLoaderRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/ServiceLoaderRewriter.java
@@ -24,7 +24,6 @@
import com.android.tools.r8.ir.code.Value;
import com.android.tools.r8.ir.desugar.ServiceLoaderSourceCode;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
-import com.android.tools.r8.synthesis.SyntheticNaming.SyntheticKind;
import com.android.tools.r8.utils.BooleanBox;
import com.android.tools.r8.utils.ListUtils;
import com.google.common.collect.ImmutableList;
@@ -198,7 +197,7 @@
appView
.getSyntheticItems()
.createMethod(
- SyntheticKind.SERVICE_LOADER,
+ kinds -> kinds.SERVICE_LOADER,
methodProcessingContext.createUniqueContext(),
appView,
builder ->
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/UtilityMethodsForCodeOptimizations.java b/src/main/java/com/android/tools/r8/ir/optimize/UtilityMethodsForCodeOptimizations.java
index 5639925..257fd7d 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/UtilityMethodsForCodeOptimizations.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/UtilityMethodsForCodeOptimizations.java
@@ -17,7 +17,6 @@
import com.android.tools.r8.ir.conversion.MethodProcessor;
import com.android.tools.r8.ir.optimize.templates.CfUtilityMethodsForCodeOptimizations;
import com.android.tools.r8.synthesis.SyntheticItems;
-import com.android.tools.r8.synthesis.SyntheticNaming;
import com.android.tools.r8.utils.InternalOptions;
public class UtilityMethodsForCodeOptimizations {
@@ -36,7 +35,7 @@
SyntheticItems syntheticItems = appView.getSyntheticItems();
ProgramMethod syntheticMethod =
syntheticItems.createMethod(
- SyntheticNaming.SyntheticKind.TO_STRING_IF_NOT_NULL,
+ kinds -> kinds.TO_STRING_IF_NOT_NULL,
methodProcessingContext.createUniqueContext(),
appView,
builder ->
@@ -65,7 +64,7 @@
UniqueContext positionContext = methodProcessingContext.createUniqueContext();
ProgramMethod syntheticMethod =
syntheticItems.createMethod(
- SyntheticNaming.SyntheticKind.THROW_CCE_IF_NOT_NULL,
+ kinds -> kinds.THROW_CCE_IF_NOT_NULL,
positionContext,
appView,
builder ->
@@ -95,7 +94,7 @@
SyntheticItems syntheticItems = appView.getSyntheticItems();
ProgramMethod syntheticMethod =
syntheticItems.createMethod(
- SyntheticNaming.SyntheticKind.THROW_IAE,
+ kinds -> kinds.THROW_IAE,
methodProcessingContext.createUniqueContext(),
appView,
builder ->
@@ -123,7 +122,7 @@
SyntheticItems syntheticItems = appView.getSyntheticItems();
ProgramMethod syntheticMethod =
syntheticItems.createMethod(
- SyntheticNaming.SyntheticKind.THROW_ICCE,
+ kinds -> kinds.THROW_ICCE,
methodProcessingContext.createUniqueContext(),
appView,
builder ->
@@ -153,7 +152,7 @@
SyntheticItems syntheticItems = appView.getSyntheticItems();
ProgramMethod syntheticMethod =
syntheticItems.createMethod(
- SyntheticNaming.SyntheticKind.THROW_NSME,
+ kinds -> kinds.THROW_NSME,
methodProcessingContext.createUniqueContext(),
appView,
builder ->
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingTreeFixer.java b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingTreeFixer.java
index 3c8bdbc..e19e0b6 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingTreeFixer.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingTreeFixer.java
@@ -48,7 +48,6 @@
import com.android.tools.r8.ir.optimize.info.OptimizationFeedbackIgnore;
import com.android.tools.r8.ir.optimize.info.field.InstanceFieldInitializationInfo;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
-import com.android.tools.r8.synthesis.SyntheticNaming.SyntheticKind;
import com.android.tools.r8.utils.ImmutableArrayUtils;
import com.android.tools.r8.utils.OptionalBool;
import com.android.tools.r8.utils.SetUtils;
@@ -178,7 +177,7 @@
appView
.getSyntheticItems()
.createMethod(
- SyntheticKind.ENUM_UNBOXING_CHECK_NOT_ZERO_METHOD,
+ kinds -> kinds.ENUM_UNBOXING_CHECK_NOT_ZERO_METHOD,
// Use the context of the checkNotNull() method to ensure the method is placed
// in the same feature split.
processorContext
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/enums/LocalEnumUnboxingUtilityClass.java b/src/main/java/com/android/tools/r8/ir/optimize/enums/LocalEnumUnboxingUtilityClass.java
index ed8958d..6741924 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/enums/LocalEnumUnboxingUtilityClass.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/enums/LocalEnumUnboxingUtilityClass.java
@@ -22,7 +22,6 @@
import com.android.tools.r8.ir.synthetic.EnumUnboxingCfCodeProvider;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
import com.android.tools.r8.synthesis.SyntheticMethodBuilder.SyntheticCodeGenerator;
-import com.android.tools.r8.synthesis.SyntheticNaming.SyntheticKind;
public class LocalEnumUnboxingUtilityClass extends EnumUnboxingUtilityClass {
@@ -123,7 +122,7 @@
.ensureFixedClassMethod(
methodName,
methodProto,
- SyntheticKind.ENUM_UNBOXING_LOCAL_UTILITY_CLASS,
+ kinds -> kinds.ENUM_UNBOXING_LOCAL_UTILITY_CLASS,
getSynthesizingContext(),
appView,
emptyConsumer(),
@@ -174,7 +173,7 @@
appView
.getSyntheticItems()
.createFixedClass(
- SyntheticKind.ENUM_UNBOXING_LOCAL_UTILITY_CLASS,
+ kinds -> kinds.ENUM_UNBOXING_LOCAL_UTILITY_CLASS,
enumToUnbox,
appView,
builder -> builder.setUseSortedMethodBacking(true));
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/enums/SharedEnumUnboxingUtilityClass.java b/src/main/java/com/android/tools/r8/ir/optimize/enums/SharedEnumUnboxingUtilityClass.java
index 096c2cf..55d5c50 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/enums/SharedEnumUnboxingUtilityClass.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/enums/SharedEnumUnboxingUtilityClass.java
@@ -36,7 +36,6 @@
import com.android.tools.r8.shaking.AppInfoWithLiveness;
import com.android.tools.r8.shaking.FieldAccessInfoCollectionModifier;
import com.android.tools.r8.synthesis.SyntheticMethodBuilder.SyntheticCodeGenerator;
-import com.android.tools.r8.synthesis.SyntheticNaming.SyntheticKind;
import com.android.tools.r8.utils.ConsumerUtils;
import com.google.common.collect.ImmutableList;
import java.util.ArrayList;
@@ -139,7 +138,7 @@
.ensureFixedClassMethod(
methodName,
methodProto,
- SyntheticKind.ENUM_UNBOXING_SHARED_UTILITY_CLASS,
+ kinds -> kinds.ENUM_UNBOXING_SHARED_UTILITY_CLASS,
getSynthesizingContext(),
appView,
ConsumerUtils.emptyConsumer(),
@@ -202,7 +201,7 @@
appView
.getSyntheticItems()
.createFixedClass(
- SyntheticKind.ENUM_UNBOXING_SHARED_UTILITY_CLASS,
+ kinds -> kinds.ENUM_UNBOXING_SHARED_UTILITY_CLASS,
synthesizingContext,
appView,
classBuilder -> {
diff --git a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorProgramOptimizer.java b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorProgramOptimizer.java
index 4599085..1ab29eb 100644
--- a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorProgramOptimizer.java
+++ b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorProgramOptimizer.java
@@ -39,7 +39,6 @@
import com.android.tools.r8.shaking.AppInfoWithLiveness;
import com.android.tools.r8.shaking.KeepFieldInfo;
import com.android.tools.r8.shaking.KeepMethodInfo;
-import com.android.tools.r8.synthesis.SyntheticNaming.SyntheticKind;
import com.android.tools.r8.utils.AccessUtils;
import com.android.tools.r8.utils.BooleanBox;
import com.android.tools.r8.utils.IntBox;
@@ -812,7 +811,7 @@
appView
.getSyntheticItems()
.createClass(
- SyntheticKind.NON_FIXED_INIT_TYPE_ARGUMENT,
+ kinds -> kinds.NON_FIXED_INIT_TYPE_ARGUMENT,
processorContext.createMethodProcessingContext(method).createUniqueContext(),
appView)
.getType();
diff --git a/src/main/java/com/android/tools/r8/shaking/MainDexDirectReferenceTracer.java b/src/main/java/com/android/tools/r8/shaking/MainDexDirectReferenceTracer.java
index 91efed4..06ceb79 100644
--- a/src/main/java/com/android/tools/r8/shaking/MainDexDirectReferenceTracer.java
+++ b/src/main/java/com/android/tools/r8/shaking/MainDexDirectReferenceTracer.java
@@ -48,7 +48,7 @@
consumer.accept(type);
// Super and interfaces are live, no need to add them.
if (!DexAnnotation.hasSynthesizedClassAnnotation(
- clazz.annotations(), appView.dexItemFactory())) {
+ clazz.annotations(), appView.dexItemFactory(), appView.getSyntheticItems())) {
traceAnnotationsDirectDependencies(clazz.annotations());
}
clazz.forEachField(field -> consumer.accept(field.getReference().type));
diff --git a/src/main/java/com/android/tools/r8/synthesis/CommittedSyntheticsCollection.java b/src/main/java/com/android/tools/r8/synthesis/CommittedSyntheticsCollection.java
index ef9ae30..177fde7 100644
--- a/src/main/java/com/android/tools/r8/synthesis/CommittedSyntheticsCollection.java
+++ b/src/main/java/com/android/tools/r8/synthesis/CommittedSyntheticsCollection.java
@@ -107,7 +107,7 @@
ImmutableSet<DexType> allSyntheticInputs =
newSyntheticInputs == null ? parent.syntheticInputs : newSyntheticInputs.build();
return new CommittedSyntheticsCollection(
- allNonLegacyMethods, allNonLegacyClasses, allSyntheticInputs);
+ parent.naming, allNonLegacyMethods, allNonLegacyClasses, allSyntheticInputs);
}
}
@@ -122,8 +122,7 @@
return ImmutableMap.copyOf(newSynthetics);
}
- private static final CommittedSyntheticsCollection EMPTY =
- new CommittedSyntheticsCollection(ImmutableMap.of(), ImmutableMap.of(), ImmutableSet.of());
+ private final SyntheticNaming naming;
/** Mapping from synthetic type to its synthetic method item description. */
private final ImmutableMap<DexType, List<SyntheticMethodReference>> nonLegacyMethods;
@@ -135,15 +134,21 @@
public final ImmutableSet<DexType> syntheticInputs;
public CommittedSyntheticsCollection(
+ SyntheticNaming naming,
ImmutableMap<DexType, List<SyntheticMethodReference>> nonLegacyMethods,
ImmutableMap<DexType, List<SyntheticProgramClassReference>> nonLegacyClasses,
ImmutableSet<DexType> syntheticInputs) {
+ this.naming = naming;
this.nonLegacyMethods = nonLegacyMethods;
this.nonLegacyClasses = nonLegacyClasses;
this.syntheticInputs = syntheticInputs;
assert verifySyntheticInputsSubsetOfSynthetics();
}
+ SyntheticNaming getNaming() {
+ return naming;
+ }
+
private boolean verifySyntheticInputsSubsetOfSynthetics() {
Set<DexType> synthetics =
ImmutableSet.<DexType>builder()
@@ -158,8 +163,9 @@
return true;
}
- public static CommittedSyntheticsCollection empty() {
- return EMPTY;
+ public static CommittedSyntheticsCollection empty(SyntheticNaming naming) {
+ return new CommittedSyntheticsCollection(
+ naming, ImmutableMap.of(), ImmutableMap.of(), ImmutableSet.of());
}
Builder builder() {
@@ -234,7 +240,7 @@
if (removed.isEmpty()) {
return this;
}
- Builder builder = CommittedSyntheticsCollection.empty().builder();
+ Builder builder = CommittedSyntheticsCollection.empty(naming).builder();
boolean changed = false;
for (SyntheticMethodReference reference : IterableUtils.flatten(nonLegacyMethods.values())) {
if (removed.contains(reference.getHolder())) {
@@ -264,6 +270,7 @@
CommittedSyntheticsCollection rewriteWithLens(NonIdentityGraphLens lens) {
ImmutableSet.Builder<DexType> syntheticInputsBuilder = ImmutableSet.builder();
return new CommittedSyntheticsCollection(
+ naming,
rewriteItems(nonLegacyMethods, lens, syntheticInputsBuilder),
rewriteItems(nonLegacyClasses, lens, syntheticInputsBuilder),
syntheticInputsBuilder.build());
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 bcf892c..07f65be 100644
--- a/src/main/java/com/android/tools/r8/synthesis/SyntheticFinalization.java
+++ b/src/main/java/com/android/tools/r8/synthesis/SyntheticFinalization.java
@@ -270,7 +270,8 @@
new CommittedItems(
SyntheticItems.INVALID_ID_AFTER_SYNTHETIC_FINALIZATION,
application,
- new CommittedSyntheticsCollection(finalMethods, finalClasses, finalInputSynthetics),
+ new CommittedSyntheticsCollection(
+ synthetics.getNaming(), finalMethods, finalClasses, finalInputSynthetics),
ImmutableList.of()),
syntheticFinalizationGraphLens,
PrunedItems.builder().setPrunedApp(application).addRemovedClasses(prunedSynthetics).build(),
diff --git a/src/main/java/com/android/tools/r8/synthesis/SyntheticItems.java b/src/main/java/com/android/tools/r8/synthesis/SyntheticItems.java
index 887941c..48ff52a 100644
--- a/src/main/java/com/android/tools/r8/synthesis/SyntheticItems.java
+++ b/src/main/java/com/android/tools/r8/synthesis/SyntheticItems.java
@@ -55,9 +55,15 @@
static final int INVALID_ID_AFTER_SYNTHETIC_FINALIZATION = -1;
+ private final SyntheticNaming naming;
+
/** Globally incremented id for the next internal synthetic class. */
private int nextSyntheticId;
+ public SyntheticNaming getNaming() {
+ return naming;
+ }
+
/** Collection of pending items. */
private static class PendingSynthetics {
@@ -100,13 +106,16 @@
// Empty collection for use only in tests and utilities.
public static SyntheticItems empty() {
- return new SyntheticItems(-1, CommittedSyntheticsCollection.empty());
+ return new SyntheticItems(-1, CommittedSyntheticsCollection.empty(null));
}
// Only for use from initial AppInfo/AppInfoWithClassHierarchy create functions. */
public static CommittedItems createInitialSyntheticItems(DexApplication application) {
return new CommittedItems(
- 0, application, CommittedSyntheticsCollection.empty(), ImmutableList.of());
+ 0,
+ application,
+ CommittedSyntheticsCollection.empty(application.dexItemFactory().getSyntheticNaming()),
+ ImmutableList.of());
}
// Only for conversion to a mutable synthetic items collection.
@@ -117,6 +126,7 @@
private SyntheticItems(int nextSyntheticId, CommittedSyntheticsCollection committed) {
this.nextSyntheticId = nextSyntheticId;
this.committed = committed;
+ this.naming = committed.getNaming();
}
public static void collectSyntheticInputs(AppView<?> appView) {
@@ -245,11 +255,11 @@
Iterable<SyntheticReference<?, ?, ?>> references = committed.getNonLegacyItems(clazz.getType());
if (!Iterables.isEmpty(references)) {
assert Iterables.size(references) == 1;
- return references.iterator().next().getKind() == SyntheticKind.LAMBDA;
+ return references.iterator().next().getKind() == naming.LAMBDA;
}
SyntheticDefinition<?, ?, ?> definition = pending.nonLegacyDefinitions.get(clazz.getType());
if (definition != null) {
- return definition.getKind() == SyntheticKind.LAMBDA;
+ return definition.getKind() == naming.LAMBDA;
}
assert false;
return false;
@@ -268,7 +278,8 @@
return isSyntheticClass(clazz.type);
}
- public boolean isSyntheticOfKind(DexType type, SyntheticKind kind) {
+ public boolean isSyntheticOfKind(DexType type, SyntheticKindSelector kindSelector) {
+ SyntheticKind kind = kindSelector.select(naming);
return pending.containsTypeOfKind(type, kind) || committed.containsTypeOfKind(type, kind);
}
@@ -278,7 +289,7 @@
public FeatureSplit getContextualFeatureSplit(
DexType type, ClassToFeatureSplitMap classToFeatureSplitMap) {
- if (isSyntheticOfKind(type, SyntheticKind.ENUM_UNBOXING_SHARED_UTILITY_CLASS)) {
+ if (isSyntheticOfKind(type, kinds -> kinds.ENUM_UNBOXING_SHARED_UTILITY_CLASS)) {
// Use the startup base if there is one, such that we don't merge non-startup classes with the
// shared utility class in case it is used during startup. The use of base startup allows for
// merging startup classes with the shared utility class, however, which could be bad for
@@ -341,14 +352,14 @@
committed
.getNonLegacyMethods()
.getOrDefault(method.getHolderType(), Collections.emptyList())) {
- if (reference.getKind() == SyntheticKind.STATIC_INTERFACE_CALL) {
+ if (reference.getKind().equals(naming.STATIC_INTERFACE_CALL)) {
return true;
}
}
SyntheticDefinition<?, ?, ?> definition =
pending.nonLegacyDefinitions.get(method.getHolderType());
if (definition != null) {
- return definition.getKind() == SyntheticKind.STATIC_INTERFACE_CALL;
+ return definition.getKind().equals(naming.STATIC_INTERFACE_CALL);
}
return false;
}
@@ -364,7 +375,7 @@
if (definition != null) {
references = Iterables.concat(references, IterableUtils.singleton(definition.toReference()));
}
- if (Iterables.any(references, reference -> reference.getKind() == SyntheticKind.LAMBDA)) {
+ if (Iterables.any(references, reference -> reference.getKind().equals(naming.LAMBDA))) {
assert ifIsLambda.test(clazz);
} else {
assert ifNotLambda.test(clazz);
@@ -489,15 +500,16 @@
}
public DexProgramClass createClass(
- SyntheticKind kind, UniqueContext context, AppView<?> appView) {
- return createClass(kind, context, appView, ConsumerUtils.emptyConsumer());
+ SyntheticKindSelector kindSelector, UniqueContext context, AppView<?> appView) {
+ return createClass(kindSelector, context, appView, ConsumerUtils.emptyConsumer());
}
public DexProgramClass createClass(
- SyntheticKind kind,
+ SyntheticKindSelector kindSelector,
UniqueContext context,
AppView<?> appView,
Consumer<SyntheticProgramClassBuilder> fn) {
+ SyntheticKind kind = kindSelector.select(naming);
// Obtain the outer synthesizing context in the case the context itself is synthetic.
// This is to ensure a flat input-type -> synthetic-item mapping.
SynthesizingContext outerContext = getSynthesizingContext(context.getClassContext(), appView);
@@ -511,10 +523,11 @@
// TODO(b/172194101): Make this take a unique context.
public DexProgramClass createFixedClass(
- SyntheticKind kind,
+ SyntheticKindSelector kindSelector,
DexProgramClass context,
AppView<?> appView,
Consumer<SyntheticProgramClassBuilder> fn) {
+ SyntheticKind kind = kindSelector.select(naming);
SynthesizingContext outerContext = internalGetOuterContext(context, appView);
Function<SynthesizingContext, DexType> contextToType =
c -> SyntheticNaming.createFixedType(kind, c, appView.dexItemFactory());
@@ -523,7 +536,8 @@
}
public DexProgramClass getExistingFixedClass(
- SyntheticKind kind, DexClass context, AppView<?> appView) {
+ SyntheticKindSelector kindSelector, DexClass context, AppView<?> appView) {
+ SyntheticKind kind = kindSelector.select(naming);
assert kind.isFixedSuffixSynthetic();
SynthesizingContext outerContext = internalGetOuterContext(context, appView);
DexType type = SyntheticNaming.createFixedType(kind, outerContext, appView.dexItemFactory());
@@ -542,17 +556,23 @@
: SynthesizingContext.fromNonSyntheticInputContext(context.asClasspathOrLibraryClass());
}
+ @FunctionalInterface
+ public interface SyntheticKindSelector {
+ SyntheticKind select(SyntheticNaming naming);
+ }
+
/**
* Ensure that a fixed synthetic class exists.
*
* <p>This method is thread safe and will synchronize based on the context of the fixed synthetic.
*/
public DexProgramClass ensureFixedClass(
- SyntheticKind kind,
+ SyntheticKindSelector kindSelector,
DexClass context,
AppView<?> appView,
Consumer<SyntheticProgramClassBuilder> fn,
Consumer<DexProgramClass> onCreationConsumer) {
+ SyntheticKind kind = kindSelector.select(naming);
assert kind.isFixedSuffixSynthetic();
SynthesizingContext outerContext = internalGetOuterContext(context, appView);
return internalEnsureFixedProgramClass(kind, fn, onCreationConsumer, outerContext, appView);
@@ -561,7 +581,7 @@
public ProgramMethod ensureFixedClassMethod(
DexString name,
DexProto proto,
- SyntheticKind kind,
+ SyntheticKindSelector kindSelector,
ProgramDefinition context,
AppView<?> appView,
Consumer<SyntheticProgramClassBuilder> buildClassCallback,
@@ -569,7 +589,7 @@
return ensureFixedClassMethod(
name,
proto,
- kind,
+ kindSelector,
context,
appView,
buildClassCallback,
@@ -580,15 +600,16 @@
public ProgramMethod ensureFixedClassMethod(
DexString name,
DexProto proto,
- SyntheticKind kind,
+ SyntheticKindSelector kindSelector,
ProgramDefinition context,
AppView<?> appView,
Consumer<SyntheticProgramClassBuilder> buildClassCallback,
Consumer<SyntheticMethodBuilder> buildMethodCallback,
Consumer<ProgramMethod> newMethodCallback) {
+ SyntheticKind kind = kindSelector.select(naming);
DexProgramClass clazz =
ensureFixedClass(
- kind, context.getContextClass(), appView, buildClassCallback, emptyConsumer());
+ kindSelector, context.getContextClass(), appView, buildClassCallback, emptyConsumer());
DexMethod methodReference = appView.dexItemFactory().createMethod(clazz.getType(), proto, name);
DexEncodedMethod methodDefinition =
internalEnsureMethod(
@@ -642,18 +663,19 @@
}
public DexClasspathClass ensureFixedClasspathClassFromType(
- SyntheticKind kind,
+ SyntheticKindSelector kindSelector,
DexType contextType,
AppView<?> appView,
Consumer<SyntheticClasspathClassBuilder> classConsumer,
Consumer<DexClasspathClass> onCreationConsumer) {
+ SyntheticKind kind = kindSelector.select(naming);
SynthesizingContext outerContext = SynthesizingContext.fromType(contextType);
return internalEnsureFixedClasspathClass(
kind, classConsumer, onCreationConsumer, outerContext, appView);
}
public DexClasspathClass ensureFixedClasspathClass(
- SyntheticKind kind,
+ SyntheticKindSelector kindSelector,
ClasspathOrLibraryClass context,
AppView<?> appView,
Consumer<SyntheticClasspathClassBuilder> classConsumer,
@@ -662,13 +684,13 @@
// This is to ensure a flat input-type -> synthetic-item mapping.
SynthesizingContext outerContext = SynthesizingContext.fromNonSyntheticInputContext(context);
return internalEnsureFixedClasspathClass(
- kind, classConsumer, onCreationConsumer, outerContext, appView);
+ kindSelector.select(naming), classConsumer, onCreationConsumer, outerContext, appView);
}
public ClasspathMethod ensureFixedClasspathMethodFromType(
DexString methodName,
DexProto methodProto,
- SyntheticKind kind,
+ SyntheticKindSelector kindSelector,
DexType contextType,
AppView<?> appView,
Consumer<SyntheticClasspathClassBuilder> classConsumer,
@@ -676,15 +698,15 @@
Consumer<SyntheticMethodBuilder> buildMethodCallback) {
DexClasspathClass clazz =
ensureFixedClasspathClassFromType(
- kind, contextType, appView, classConsumer, onCreationConsumer);
+ kindSelector, contextType, appView, classConsumer, onCreationConsumer);
return internalEnsureFixedClasspathMethod(
- methodName, methodProto, kind, appView, buildMethodCallback, clazz);
+ methodName, methodProto, kindSelector.select(naming), appView, buildMethodCallback, clazz);
}
public ClasspathMethod ensureFixedClasspathClassMethod(
DexString methodName,
DexProto methodProto,
- SyntheticKind kind,
+ SyntheticKindSelector kindSelector,
ClasspathOrLibraryClass context,
AppView<?> appView,
Consumer<SyntheticClasspathClassBuilder> buildClassCallback,
@@ -692,9 +714,9 @@
Consumer<SyntheticMethodBuilder> buildMethodCallback) {
DexClasspathClass clazz =
ensureFixedClasspathClass(
- kind, context, appView, buildClassCallback, onClassCreationCallback);
+ kindSelector, context, appView, buildClassCallback, onClassCreationCallback);
return internalEnsureFixedClasspathMethod(
- methodName, methodProto, kind, appView, buildMethodCallback, clazz);
+ methodName, methodProto, kindSelector.select(naming), appView, buildMethodCallback, clazz);
}
private ClasspathMethod internalEnsureFixedClasspathMethod(
@@ -748,26 +770,28 @@
}
public DexProgramClass ensureFixedClassFromType(
- SyntheticKind kind,
+ SyntheticKindSelector kindSelector,
DexType contextType,
AppView<?> appView,
Consumer<SyntheticProgramClassBuilder> fn,
Consumer<DexProgramClass> onCreationConsumer) {
+ SyntheticKind kind = kindSelector.select(naming);
SynthesizingContext outerContext = SynthesizingContext.fromType(contextType);
return internalEnsureFixedProgramClass(kind, fn, onCreationConsumer, outerContext, appView);
}
/** Create a single synthetic method item. */
public ProgramMethod createMethod(
- SyntheticKind kind,
+ SyntheticKindSelector kindSelector,
UniqueContext context,
AppView<?> appView,
Consumer<SyntheticMethodBuilder> fn) {
- return createMethod(kind, context.getClassContext(), appView, fn, context::getSyntheticSuffix);
+ return createMethod(
+ kindSelector, context.getClassContext(), appView, fn, context::getSyntheticSuffix);
}
private ProgramMethod createMethod(
- SyntheticKind kind,
+ SyntheticKindSelector kindSelector,
ProgramDefinition context,
AppView<?> appView,
Consumer<SyntheticMethodBuilder> fn,
@@ -776,6 +800,7 @@
// Obtain the outer synthesizing context in the case the context itself is synthetic.
// This is to ensure a flat input-type -> synthetic-item mapping.
SynthesizingContext outerContext = getSynthesizingContext(context, appView);
+ SyntheticKind kind = kindSelector.select(naming);
DexType type =
SyntheticNaming.createInternalType(
kind, outerContext, syntheticIdSupplier.get(), appView.dexItemFactory());
@@ -868,7 +893,7 @@
// single kind of a synthetic which is required for marking synthetics. This check could be
// relaxed to ensure that all kinds are equivalent if merging is possible.
assert !it.hasNext();
- SyntheticMarker.writeMarkerAttribute(writer, kind);
+ SyntheticMarker.writeMarkerAttribute(writer, kind, appView.getSyntheticItems());
}
}
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 728947e..c21954b 100644
--- a/src/main/java/com/android/tools/r8/synthesis/SyntheticMarker.java
+++ b/src/main/java/com/android/tools/r8/synthesis/SyntheticMarker.java
@@ -25,12 +25,13 @@
private static final String SYNTHETIC_MARKER_ATTRIBUTE_TYPE_NAME =
"com.android.tools.r8.SynthesizedClass";
- public static Attribute getMarkerAttributePrototype() {
- return MarkerAttribute.PROTOTYPE;
+ public static Attribute getMarkerAttributePrototype(SyntheticNaming syntheticNaming) {
+ return new MarkerAttribute(null, syntheticNaming);
}
- public static void writeMarkerAttribute(ClassWriter writer, SyntheticKind kind) {
- writer.visitAttribute(new MarkerAttribute(kind));
+ public static void writeMarkerAttribute(
+ ClassWriter writer, SyntheticKind kind, SyntheticItems syntheticItems) {
+ writer.visitAttribute(new MarkerAttribute(kind, syntheticItems.getNaming()));
}
public static SyntheticMarker readMarkerAttribute(Attribute attribute) {
@@ -43,13 +44,13 @@
private static class MarkerAttribute extends Attribute {
- private static final MarkerAttribute PROTOTYPE = new MarkerAttribute(null);
-
private SyntheticKind kind;
+ private final SyntheticNaming syntheticNaming;
- public MarkerAttribute(SyntheticKind kind) {
+ public MarkerAttribute(SyntheticKind kind, SyntheticNaming syntheticNaming) {
super(SYNTHETIC_MARKER_ATTRIBUTE_TYPE_NAME);
this.kind = kind;
+ this.syntheticNaming = syntheticNaming;
}
@Override
@@ -62,8 +63,8 @@
Label[] labels) {
short id = classReader.readShort(offset);
assert id >= 0;
- SyntheticKind kind = SyntheticKind.fromId(id);
- return new MarkerAttribute(kind);
+ SyntheticKind kind = syntheticNaming.fromId(id);
+ return new MarkerAttribute(kind, syntheticNaming);
}
@Override
@@ -103,7 +104,7 @@
SyntheticMarker marker = internalStripMarkerFromClass(clazz, appView);
assert marker != NO_MARKER
|| !DexAnnotation.hasSynthesizedClassAnnotation(
- clazz.annotations(), appView.dexItemFactory());
+ clazz.annotations(), appView.dexItemFactory(), appView.getSyntheticItems());
return marker;
}
@@ -117,7 +118,7 @@
}
SyntheticKind kind =
DexAnnotation.getSynthesizedClassAnnotationInfo(
- clazz.annotations(), appView.dexItemFactory());
+ clazz.annotations(), appView.dexItemFactory(), appView.getSyntheticItems());
if (kind == null) {
return NO_MARKER;
}
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 0e80d65..e95c6a1 100644
--- a/src/main/java/com/android/tools/r8/synthesis/SyntheticNaming.java
+++ b/src/main/java/com/android/tools/r8/synthesis/SyntheticNaming.java
@@ -6,6 +6,7 @@
import com.android.tools.r8.errors.Unreachable;
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.DexType;
+import com.android.tools.r8.ir.desugar.itf.InterfaceDesugaringForTesting;
import com.android.tools.r8.references.ClassReference;
import com.android.tools.r8.references.Reference;
import com.android.tools.r8.utils.DescriptorUtils;
@@ -17,6 +18,83 @@
public class SyntheticNaming {
+ public SyntheticNaming() {}
+
+ private KindGenerator generator = new KindGenerator();
+
+ // Global synthetics.
+ public final SyntheticKind RECORD_TAG = generator.forGlobalClass();
+ public final SyntheticKind API_MODEL_STUB = generator.forGlobalClass();
+
+ // Classpath only synthetics in the global type namespace.
+ public final SyntheticKind RETARGET_STUB = generator.forGlobalClasspathClass();
+ public final SyntheticKind EMULATED_INTERFACE_MARKER_CLASS = generator.forGlobalClasspathClass();
+
+ // Fixed suffix synthetics. Each has a hygienic prefix type.
+ public final SyntheticKind ENUM_UNBOXING_LOCAL_UTILITY_CLASS =
+ generator.forFixedClass("$EnumUnboxingLocalUtility");
+ public final SyntheticKind ENUM_UNBOXING_SHARED_UTILITY_CLASS =
+ generator.forFixedClass("$EnumUnboxingSharedUtility");
+ public final SyntheticKind COMPANION_CLASS = generator.forFixedClass("$-CC");
+ public final SyntheticKind EMULATED_INTERFACE_CLASS =
+ generator.forFixedClass(InterfaceDesugaringForTesting.EMULATED_INTERFACE_CLASS_SUFFIX);
+ public final SyntheticKind RETARGET_CLASS = generator.forFixedClass("RetargetClass");
+ public final SyntheticKind RETARGET_INTERFACE = generator.forFixedClass("RetargetInterface");
+ public final SyntheticKind WRAPPER = generator.forFixedClass("$Wrapper");
+ public final SyntheticKind VIVIFIED_WRAPPER = generator.forFixedClass("$VivifiedWrapper");
+ public final SyntheticKind INIT_TYPE_ARGUMENT = generator.forFixedClass("-IA");
+ public final SyntheticKind HORIZONTAL_INIT_TYPE_ARGUMENT_1 =
+ generator.forFixedClass(SYNTHETIC_CLASS_SEPARATOR + "IA$1");
+ public final SyntheticKind HORIZONTAL_INIT_TYPE_ARGUMENT_2 =
+ generator.forFixedClass(SYNTHETIC_CLASS_SEPARATOR + "IA$2");
+ public final SyntheticKind HORIZONTAL_INIT_TYPE_ARGUMENT_3 =
+ generator.forFixedClass(SYNTHETIC_CLASS_SEPARATOR + "IA$3");
+ public final SyntheticKind ENUM_CONVERSION = generator.forFixedClass("$EnumConversion");
+
+ // Locally generated synthetic classes.
+ public final SyntheticKind LAMBDA = generator.forInstanceClass("Lambda");
+
+ // TODO(b/214901256): Sharing of synthetic classes may lead to duplicate method errors.
+ public final SyntheticKind NON_FIXED_INIT_TYPE_ARGUMENT =
+ generator.forNonSharableInstanceClass("$IA");
+ public final SyntheticKind CONST_DYNAMIC = generator.forInstanceClass("$Condy");
+
+ // Method synthetics.
+ public final SyntheticKind ENUM_UNBOXING_CHECK_NOT_ZERO_METHOD =
+ generator.forSingleMethod("CheckNotZero");
+ public final SyntheticKind RECORD_HELPER = generator.forSingleMethod("Record");
+ public final SyntheticKind BACKPORT = generator.forSingleMethod("Backport");
+ public final SyntheticKind BACKPORT_WITH_FORWARDING =
+ generator.forSingleMethod("BackportWithForwarding");
+ public final SyntheticKind STATIC_INTERFACE_CALL =
+ generator.forSingleMethod("StaticInterfaceCall");
+ public final SyntheticKind TO_STRING_IF_NOT_NULL = generator.forSingleMethod("ToStringIfNotNull");
+ public final SyntheticKind THROW_CCE_IF_NOT_NULL = generator.forSingleMethod("ThrowCCEIfNotNull");
+ public final SyntheticKind THROW_IAE = generator.forSingleMethod("ThrowIAE");
+ public final SyntheticKind THROW_ICCE = generator.forSingleMethod("ThrowICCE");
+ public final SyntheticKind THROW_NSME = generator.forSingleMethod("ThrowNSME");
+ public final SyntheticKind TWR_CLOSE_RESOURCE = generator.forSingleMethod("TwrCloseResource");
+ public final SyntheticKind SERVICE_LOADER = generator.forSingleMethod("ServiceLoad");
+ public final SyntheticKind OUTLINE = generator.forSingleMethod("Outline");
+ public final SyntheticKind API_CONVERSION = generator.forSingleMethod("APIConversion");
+ public final SyntheticKind API_CONVERSION_PARAMETERS =
+ generator.forSingleMethod("APIConversionParameters");
+ public final SyntheticKind ARRAY_CONVERSION = generator.forSingleMethod("$ArrayConversion");
+ public final SyntheticKind API_MODEL_OUTLINE = generator.forSingleMethod("ApiModelOutline");
+
+ private final List<SyntheticKind> ALL_KINDS = generator.getAllKinds();
+
+ public Collection<SyntheticKind> kinds() {
+ return ALL_KINDS;
+ }
+
+ public SyntheticKind fromId(int id) {
+ if (0 < id && id <= ALL_KINDS.size()) {
+ return ALL_KINDS.get(id - 1);
+ }
+ return null;
+ }
+
private static class KindGenerator {
private int nextId = 1;
private List<SyntheticKind> kinds = new ArrayList<>();
@@ -34,8 +112,13 @@
return register(new SyntheticMethodKind(getNextId(), descriptor));
}
+ // TODO(b/214901256): Remove once fixed.
+ SyntheticKind forNonSharableInstanceClass(String descriptor) {
+ return register(new SyntheticClassKind(getNextId(), descriptor, false));
+ }
+
SyntheticKind forInstanceClass(String descriptor) {
- return register(new SyntheticClassKind(getNextId(), descriptor));
+ return register(new SyntheticClassKind(getNextId(), descriptor, true));
}
SyntheticKind forFixedClass(String descriptor) {
@@ -68,98 +151,6 @@
*/
public abstract static class SyntheticKind implements Ordered<SyntheticKind> {
- public static final SyntheticKind ENUM_UNBOXING_LOCAL_UTILITY_CLASS,
- ENUM_UNBOXING_SHARED_UTILITY_CLASS,
- RECORD_TAG,
- COMPANION_CLASS,
- EMULATED_INTERFACE_CLASS,
- RETARGET_CLASS,
- RETARGET_STUB,
- RETARGET_INTERFACE,
- WRAPPER,
- VIVIFIED_WRAPPER,
- LAMBDA,
- INIT_TYPE_ARGUMENT,
- HORIZONTAL_INIT_TYPE_ARGUMENT_1,
- HORIZONTAL_INIT_TYPE_ARGUMENT_2,
- HORIZONTAL_INIT_TYPE_ARGUMENT_3,
- NON_FIXED_INIT_TYPE_ARGUMENT,
- ENUM_UNBOXING_CHECK_NOT_ZERO_METHOD,
- RECORD_HELPER,
- BACKPORT,
- BACKPORT_WITH_FORWARDING,
- STATIC_INTERFACE_CALL,
- TO_STRING_IF_NOT_NULL,
- THROW_CCE_IF_NOT_NULL,
- THROW_IAE,
- THROW_ICCE,
- THROW_NSME,
- TWR_CLOSE_RESOURCE,
- SERVICE_LOADER,
- OUTLINE,
- API_CONVERSION,
- API_CONVERSION_PARAMETERS,
- EMULATED_INTERFACE_MARKER_CLASS,
- CONST_DYNAMIC,
- ENUM_CONVERSION,
- ARRAY_CONVERSION,
- API_MODEL_OUTLINE,
- API_MODEL_STUB;
-
- private static final List<SyntheticKind> ALL_KINDS;
-
- static {
- KindGenerator generator = new KindGenerator();
- // Global synthetics.
- RECORD_TAG = generator.forGlobalClass();
- API_MODEL_STUB = generator.forGlobalClass();
-
- // Classpath only synthetics in the global type namespace.
- RETARGET_STUB = generator.forGlobalClasspathClass();
- EMULATED_INTERFACE_MARKER_CLASS = generator.forGlobalClasspathClass();
-
- // Fixed suffix synthetics. Each has a hygienic prefix type.
- ENUM_UNBOXING_LOCAL_UTILITY_CLASS = generator.forFixedClass("$EnumUnboxingLocalUtility");
- ENUM_UNBOXING_SHARED_UTILITY_CLASS = generator.forFixedClass("$EnumUnboxingSharedUtility");
- COMPANION_CLASS = generator.forFixedClass("$-CC");
- EMULATED_INTERFACE_CLASS = generator.forFixedClass("$-EL");
- RETARGET_CLASS = generator.forFixedClass("RetargetClass");
- RETARGET_INTERFACE = generator.forFixedClass("RetargetInterface");
- WRAPPER = generator.forFixedClass("$Wrapper");
- VIVIFIED_WRAPPER = generator.forFixedClass("$VivifiedWrapper");
- INIT_TYPE_ARGUMENT = generator.forFixedClass("-IA");
- HORIZONTAL_INIT_TYPE_ARGUMENT_1 = generator.forFixedClass(SYNTHETIC_CLASS_SEPARATOR + "IA$1");
- HORIZONTAL_INIT_TYPE_ARGUMENT_2 = generator.forFixedClass(SYNTHETIC_CLASS_SEPARATOR + "IA$2");
- HORIZONTAL_INIT_TYPE_ARGUMENT_3 = generator.forFixedClass(SYNTHETIC_CLASS_SEPARATOR + "IA$3");
- ENUM_CONVERSION = generator.forFixedClass("$EnumConversion");
-
- // Locally generated synthetic classes.
- LAMBDA = generator.forInstanceClass("Lambda");
- NON_FIXED_INIT_TYPE_ARGUMENT = generator.forInstanceClass("$IA");
- CONST_DYNAMIC = generator.forInstanceClass("$Condy");
-
- // Method synthetics.
- ENUM_UNBOXING_CHECK_NOT_ZERO_METHOD = generator.forSingleMethod("CheckNotZero");
- RECORD_HELPER = generator.forSingleMethod("Record");
- BACKPORT = generator.forSingleMethod("Backport");
- BACKPORT_WITH_FORWARDING = generator.forSingleMethod("BackportWithForwarding");
- STATIC_INTERFACE_CALL = generator.forSingleMethod("StaticInterfaceCall");
- TO_STRING_IF_NOT_NULL = generator.forSingleMethod("ToStringIfNotNull");
- THROW_CCE_IF_NOT_NULL = generator.forSingleMethod("ThrowCCEIfNotNull");
- THROW_IAE = generator.forSingleMethod("ThrowIAE");
- THROW_ICCE = generator.forSingleMethod("ThrowICCE");
- THROW_NSME = generator.forSingleMethod("ThrowNSME");
- TWR_CLOSE_RESOURCE = generator.forSingleMethod("TwrCloseResource");
- SERVICE_LOADER = generator.forSingleMethod("ServiceLoad");
- OUTLINE = generator.forSingleMethod("Outline");
- API_CONVERSION = generator.forSingleMethod("APIConversion");
- API_CONVERSION_PARAMETERS = generator.forSingleMethod("APIConversionParameters");
- ARRAY_CONVERSION = generator.forSingleMethod("$ArrayConversion");
- API_MODEL_OUTLINE = generator.forSingleMethod("ApiModelOutline");
-
- ALL_KINDS = generator.getAllKinds();
- }
-
private final int id;
private final String descriptor;
@@ -183,18 +174,6 @@
return Equatable.equalsImpl(this, o);
}
- public static Collection<SyntheticKind> values() {
- return ALL_KINDS;
- }
-
- public static SyntheticKind fromId(int id) {
- if (0 < id && id <= ALL_KINDS.size()) {
- return ALL_KINDS.get(id - 1);
- }
- assert false;
- return null;
- }
-
public int getId() {
return id;
}
@@ -256,17 +235,17 @@
private static class SyntheticClassKind extends SyntheticKind {
- public SyntheticClassKind(int id, String descriptor) {
+ // TODO(b/214901256): Remove once fixed.
+ private final boolean sharable;
+
+ public SyntheticClassKind(int id, String descriptor, boolean sharable) {
super(id, descriptor);
+ this.sharable = sharable;
}
@Override
public boolean isShareable() {
- if (this == NON_FIXED_INIT_TYPE_ARGUMENT) {
- // TODO(b/214901256): Sharing of synthetic classes may lead to duplicate method errors.
- return false;
- }
- return true;
+ return sharable;
}
@Override
@@ -304,7 +283,7 @@
String descriptor,
boolean mayOverridesNonProgramType,
boolean allowSyntheticContext) {
- super(id, descriptor);
+ super(id, descriptor, false);
this.mayOverridesNonProgramType = mayOverridesNonProgramType;
this.allowSyntheticContext = allowSyntheticContext;
}
diff --git a/src/test/java/com/android/tools/r8/synthesis/SyntheticItemsTestUtils.java b/src/test/java/com/android/tools/r8/synthesis/SyntheticItemsTestUtils.java
index 18fb93b..b53f301 100644
--- a/src/test/java/com/android/tools/r8/synthesis/SyntheticItemsTestUtils.java
+++ b/src/test/java/com/android/tools/r8/synthesis/SyntheticItemsTestUtils.java
@@ -16,6 +16,10 @@
public class SyntheticItemsTestUtils {
+ // Private copy of the synthetic namings. This is not the compiler instance, but checking on the
+ // id/descriptor content is safe.
+ private static final SyntheticNaming naming = new SyntheticNaming();
+
public static String syntheticMethodName() {
return SyntheticNaming.INTERNAL_SYNTHETIC_METHOD_NAME;
}
@@ -38,8 +42,7 @@
}
public static MethodReference syntheticBackportMethod(Class<?> clazz, int id, Method method) {
- ClassReference syntheticHolder =
- syntheticClass(clazz, SyntheticNaming.SyntheticKind.BACKPORT, id);
+ ClassReference syntheticHolder = syntheticClass(clazz, naming.BACKPORT, id);
MethodReference originalMethod = Reference.methodFromMethod(method);
return Reference.methodFromDescriptor(
syntheticHolder.getDescriptor(),
@@ -48,15 +51,15 @@
}
public static ClassReference syntheticOutlineClass(Class<?> clazz, int id) {
- return syntheticClass(clazz, SyntheticKind.OUTLINE, id);
+ return syntheticClass(clazz, naming.OUTLINE, id);
}
public static ClassReference syntheticOutlineClass(ClassReference clazz, int id) {
- return syntheticClass(clazz, SyntheticKind.OUTLINE, id);
+ return syntheticClass(clazz, naming.OUTLINE, id);
}
public static ClassReference syntheticLambdaClass(Class<?> clazz, int id) {
- return syntheticClass(clazz, SyntheticNaming.SyntheticKind.LAMBDA, id);
+ return syntheticClass(clazz, naming.LAMBDA, id);
}
public static MethodReference syntheticLambdaMethod(Class<?> clazz, int id, Method method) {
@@ -69,12 +72,11 @@
}
public static boolean isEnumUnboxingSharedUtilityClass(ClassReference reference) {
- return SyntheticNaming.isSynthetic(
- reference, null, SyntheticKind.ENUM_UNBOXING_SHARED_UTILITY_CLASS);
+ return SyntheticNaming.isSynthetic(reference, null, naming.ENUM_UNBOXING_SHARED_UTILITY_CLASS);
}
public static boolean isExternalSynthetic(ClassReference reference) {
- for (SyntheticKind kind : SyntheticKind.values()) {
+ for (SyntheticKind kind : naming.kinds()) {
if (kind.isGlobal()) {
continue;
}
@@ -92,52 +94,48 @@
}
public static boolean isInternalLambda(ClassReference reference) {
- return SyntheticNaming.isSynthetic(reference, Phase.INTERNAL, SyntheticKind.LAMBDA);
+ return SyntheticNaming.isSynthetic(reference, Phase.INTERNAL, naming.LAMBDA);
}
public static boolean isExternalLambda(ClassReference reference) {
- return SyntheticNaming.isSynthetic(reference, Phase.EXTERNAL, SyntheticKind.LAMBDA);
+ return SyntheticNaming.isSynthetic(reference, Phase.EXTERNAL, naming.LAMBDA);
}
public static boolean isExternalStaticInterfaceCall(ClassReference reference) {
- return SyntheticNaming.isSynthetic(
- reference, Phase.EXTERNAL, SyntheticKind.STATIC_INTERFACE_CALL);
+ return SyntheticNaming.isSynthetic(reference, Phase.EXTERNAL, naming.STATIC_INTERFACE_CALL);
}
public static boolean isExternalTwrCloseMethod(ClassReference reference) {
- return SyntheticNaming.isSynthetic(reference, Phase.EXTERNAL, SyntheticKind.TWR_CLOSE_RESOURCE);
+ return SyntheticNaming.isSynthetic(reference, Phase.EXTERNAL, naming.TWR_CLOSE_RESOURCE);
}
public static boolean isMaybeExternalSuppressedExceptionMethod(ClassReference reference) {
// The suppressed exception methods are grouped with the backports.
- return SyntheticNaming.isSynthetic(reference, Phase.EXTERNAL, SyntheticKind.BACKPORT);
+ return SyntheticNaming.isSynthetic(reference, Phase.EXTERNAL, naming.BACKPORT);
}
public static boolean isExternalOutlineClass(ClassReference reference) {
- return SyntheticNaming.isSynthetic(reference, Phase.EXTERNAL, SyntheticKind.OUTLINE);
+ return SyntheticNaming.isSynthetic(reference, Phase.EXTERNAL, naming.OUTLINE);
}
public static boolean isInitializerTypeArgument(ClassReference reference) {
- return SyntheticNaming.isSynthetic(reference, null, SyntheticKind.INIT_TYPE_ARGUMENT);
+ return SyntheticNaming.isSynthetic(reference, null, naming.INIT_TYPE_ARGUMENT);
}
public static boolean isExternalNonFixedInitializerTypeArgument(ClassReference reference) {
return SyntheticNaming.isSynthetic(
- reference, Phase.EXTERNAL, SyntheticKind.NON_FIXED_INIT_TYPE_ARGUMENT);
+ reference, Phase.EXTERNAL, naming.NON_FIXED_INIT_TYPE_ARGUMENT);
}
public static boolean isHorizontalInitializerTypeArgument(ClassReference reference) {
- return SyntheticNaming.isSynthetic(
- reference, null, SyntheticKind.HORIZONTAL_INIT_TYPE_ARGUMENT_1)
- || SyntheticNaming.isSynthetic(
- reference, null, SyntheticKind.HORIZONTAL_INIT_TYPE_ARGUMENT_2)
- || SyntheticNaming.isSynthetic(
- reference, null, SyntheticKind.HORIZONTAL_INIT_TYPE_ARGUMENT_3);
+ return SyntheticNaming.isSynthetic(reference, null, naming.HORIZONTAL_INIT_TYPE_ARGUMENT_1)
+ || SyntheticNaming.isSynthetic(reference, null, naming.HORIZONTAL_INIT_TYPE_ARGUMENT_2)
+ || SyntheticNaming.isSynthetic(reference, null, naming.HORIZONTAL_INIT_TYPE_ARGUMENT_3);
}
public static boolean isWrapper(ClassReference reference) {
- return SyntheticNaming.isSynthetic(reference, null, SyntheticKind.WRAPPER)
- || SyntheticNaming.isSynthetic(reference, null, SyntheticKind.VIVIFIED_WRAPPER);
+ return SyntheticNaming.isSynthetic(reference, null, naming.WRAPPER)
+ || SyntheticNaming.isSynthetic(reference, null, naming.VIVIFIED_WRAPPER);
}
public static Matcher<String> containsInternalSyntheticReference() {
@@ -149,7 +147,6 @@
}
public static boolean isInternalThrowNSME(MethodReference method) {
- return SyntheticNaming.isSynthetic(
- method.getHolderClass(), Phase.INTERNAL, SyntheticKind.THROW_NSME);
+ return SyntheticNaming.isSynthetic(method.getHolderClass(), Phase.INTERNAL, naming.THROW_NSME);
}
}