[ApiModel] Only stub classes in exception handlers

Bug: b/258270051
Bug: b/259076765
Change-Id: I32b01ec1fda259614ff9adc193f751ff45e5c0f3
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 c6d8571..4337302 100644
--- a/src/main/java/com/android/tools/r8/androidapi/ApiReferenceStubber.java
+++ b/src/main/java/com/android/tools/r8/androidapi/ApiReferenceStubber.java
@@ -6,32 +6,28 @@
 
 import static com.android.tools.r8.utils.MapUtils.ignoreKey;
 
-import com.android.tools.r8.dex.code.CfOrDexInstruction;
 import com.android.tools.r8.errors.MissingGlobalSyntheticsConsumerDiagnostic;
 import com.android.tools.r8.errors.Unreachable;
 import com.android.tools.r8.graph.AppInfo;
 import com.android.tools.r8.graph.AppView;
+import com.android.tools.r8.graph.Code;
 import com.android.tools.r8.graph.DexClass;
+import com.android.tools.r8.graph.DexCode.TryHandler;
+import com.android.tools.r8.graph.DexCode.TryHandler.TypeAddrPair;
 import com.android.tools.r8.graph.DexEncodedMethod;
-import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.DexItemFactory;
 import com.android.tools.r8.graph.DexLibraryClass;
-import com.android.tools.r8.graph.DexMethod;
 import com.android.tools.r8.graph.DexProgramClass;
-import com.android.tools.r8.graph.DexReference;
 import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.graph.MethodAccessFlags;
 import com.android.tools.r8.graph.ProgramDefinition;
-import com.android.tools.r8.graph.ProgramMethod;
 import com.android.tools.r8.graph.ThrowExceptionCode;
-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.utils.ThreadUtils;
 import com.android.tools.r8.utils.WorkList;
 import com.google.common.collect.Sets;
 import java.util.Arrays;
-import java.util.ListIterator;
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
@@ -45,108 +41,16 @@
  */
 public class ApiReferenceStubber {
 
-  private class ReferencesToApiLevelUseRegistry extends UseRegistry<ProgramMethod> {
-
-    public ReferencesToApiLevelUseRegistry(ProgramMethod context) {
-      super(appView, context);
-    }
-
-    @Override
-    public void registerInitClass(DexType type) {
-      // Intentionally empty.
-    }
-
-    @Override
-    public void registerInvokeVirtual(DexMethod method) {
-      // Intentionally empty.
-    }
-
-    @Override
-    public void registerInvokeDirect(DexMethod method) {
-      // Intentionally empty.
-    }
-
-    @Override
-    public void registerInvokeStatic(DexMethod method) {
-      // Intentionally empty.
-    }
-
-    @Override
-    public void registerInvokeInterface(DexMethod method) {
-      // Intentionally empty.
-    }
-
-    @Override
-    public void registerInvokeSuper(DexMethod method) {
-      // Intentionally empty.
-    }
-
-    @Override
-    public void registerInstanceFieldRead(DexField field) {
-      // Intentionally empty.
-    }
-
-    @Override
-    public void registerInstanceFieldWrite(DexField field) {
-      // Intentionally empty.
-    }
-
-    @Override
-    public void registerStaticFieldRead(DexField field) {
-      // Intentionally empty.
-    }
-
-    @Override
-    public void registerStaticFieldWrite(DexField field) {
-      // Intentionally empty.
-    }
-
-    @Override
-    public void registerTypeReference(DexType type) {
-      checkReferenceToLibraryClass(type);
-    }
-
-    @Override
-    public void registerInstanceOf(DexType type) {
-      checkReferenceToLibraryClass(type);
-    }
-
-    @Override
-    public void registerConstClass(
-        DexType type,
-        ListIterator<? extends CfOrDexInstruction> iterator,
-        boolean ignoreCompatRules) {
-      checkReferenceToLibraryClass(type);
-    }
-
-    @Override
-    public void registerCheckCast(DexType type, boolean ignoreCompatRules) {
-      checkReferenceToLibraryClass(type);
-    }
-
-    @Override
-    public void registerExceptionGuard(DexType guard) {
-      checkReferenceToLibraryClass(guard);
-    }
-
-    private void checkReferenceToLibraryClass(DexReference reference) {
-      DexType rewrittenType = appView.graphLens().lookupType(reference.getContextType());
-      findReferencedLibraryClasses(rewrittenType, getContext().getContextClass());
-    }
-  }
-
   private final AppView<?> appView;
   private final Map<DexLibraryClass, Set<ProgramDefinition>> referencingContexts =
       new ConcurrentHashMap<>();
   private final Set<DexLibraryClass> libraryClassesToMock = Sets.newConcurrentHashSet();
   private final Set<DexType> seenTypes = Sets.newConcurrentHashSet();
   private final AndroidApiLevelCompute apiLevelCompute;
-  private final DexItemFactory factory;
 
   public ApiReferenceStubber(AppView<?> appView) {
     this.appView = appView;
     apiLevelCompute = appView.apiLevelCompute();
-    factory = appView.dexItemFactory();
   }
 
   public void run(ExecutorService executorService) throws ExecutionException {
@@ -195,7 +99,18 @@
         .forEach(superType -> findReferencedLibraryClasses(superType, clazz));
     clazz.forEachProgramMethodMatching(
         DexEncodedMethod::hasCode,
-        method -> method.registerCodeReferences(new ReferencesToApiLevelUseRegistry(method)));
+        method -> {
+          Code code = method.getDefinition().getCode();
+          if (!code.isDexCode()) {
+            return;
+          }
+          for (TryHandler handler : code.asDexCode().getHandlers()) {
+            for (TypeAddrPair pair : handler.pairs) {
+              DexType rewrittenType = appView.graphLens().lookupType(pair.getType());
+              findReferencedLibraryClasses(rewrittenType, clazz);
+            }
+          }
+        });
   }
 
   private void findReferencedLibraryClasses(DexType type, DexProgramClass context) {