Also consider interface types in the refined type computation
Change-Id: Ief2db6711ff07c2f591131c57210b8cbcaf29d4a
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/type/TypeAnalysis.java b/src/main/java/com/android/tools/r8/ir/analysis/type/TypeAnalysis.java
index f69fadf..dd4265c 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/type/TypeAnalysis.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/type/TypeAnalysis.java
@@ -22,6 +22,7 @@
import java.util.Comparator;
import java.util.Deque;
import java.util.List;
+import java.util.Set;
public class TypeAnalysis {
@@ -192,7 +193,14 @@
DexType staticReceiverType = invoke.getInvokedMethod().holder;
if (lattice.isClassType()) {
- DexType refinedType = lattice.asClassTypeLatticeElement().getClassType();
+ ClassTypeLatticeElement classType = lattice.asClassTypeLatticeElement();
+ DexType refinedType = classType.getClassType();
+ if (refinedType == appView.dexItemFactory().objectType) {
+ Set<DexType> interfaces = classType.getInterfaces();
+ if (interfaces.size() == 1) {
+ refinedType = interfaces.iterator().next();
+ }
+ }
if (appView.appInfo().isSubtype(refinedType, staticReceiverType)) {
return refinedType;
}