Only add covariant library methods if all referenced types exist
Change-Id: I5e908e5c3807322105b1d4149947127758472e56
diff --git a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
index ec4ef3b..761a52e 100644
--- a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
+++ b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
@@ -674,6 +674,17 @@
return definitionFor(type, context, this::recordNonProgramClass, this::reportMissingClass);
}
+ public DexLibraryClass definitionForLibraryClassOrIgnore(DexType type) {
+ assert type.isClassType();
+ ClassResolutionResult classResolutionResult =
+ appInfo().contextIndependentDefinitionForWithResolutionResult(type);
+ return classResolutionResult.hasClassResolutionResult()
+ && !classResolutionResult.isMultipleClassResolutionResult()
+ ? DexLibraryClass.asLibraryClassOrNull(
+ classResolutionResult.toSingleClassWithProgramOverLibrary())
+ : null;
+ }
+
public boolean hasAlternativeLibraryDefinition(DexProgramClass programClass) {
ClassResolutionResult classResolutionResult =
internalDefinitionFor(
@@ -3602,10 +3613,20 @@
if (libraryClass == null) {
return;
}
+ // Check if the covariant method exists on the class.
DexEncodedMethod covariantMethod = libraryClass.lookupMethod(method);
if (covariantMethod != null) {
return;
}
+ // Check if all type references exists otherwise bail out since the bridge could not exist
+ // in the android jar anyway.
+ for (DexType referencedType : method.getReferencedTypes()) {
+ DexType baseReferencedType = referencedType.toBaseType(appView.dexItemFactory());
+ if (baseReferencedType.isClassType()
+ && definitionForLibraryClassOrIgnore(referencedType) == null) {
+ return;
+ }
+ }
libraryClass.addVirtualMethod(
DexEncodedMethod.builder()
.setMethod(method)