[ApiModel] Account for try-catch ranges

Bug: 207812068
Change-Id: I6494955ca198562ab9b9cee731056aa1b4d4002c
diff --git a/src/main/java/com/android/tools/r8/shaking/DefaultEnqueuerUseRegistry.java b/src/main/java/com/android/tools/r8/shaking/DefaultEnqueuerUseRegistry.java
index a5b539b..597a07d 100644
--- a/src/main/java/com/android/tools/r8/shaking/DefaultEnqueuerUseRegistry.java
+++ b/src/main/java/com/android/tools/r8/shaking/DefaultEnqueuerUseRegistry.java
@@ -181,6 +181,7 @@
 
   @Override
   public void registerExceptionGuard(DexType guard) {
+    setMaxApiReferenceLevel(guard);
     enqueuer.traceExceptionGuard(guard, getContext());
   }
 
diff --git a/src/test/java/com/android/tools/r8/apimodel/ApiModelNoInliningOfTryCatchReferenceTest.java b/src/test/java/com/android/tools/r8/apimodel/ApiModelNoInliningOfTryCatchReferenceTest.java
index 5b78b3c..9565973 100644
--- a/src/test/java/com/android/tools/r8/apimodel/ApiModelNoInliningOfTryCatchReferenceTest.java
+++ b/src/test/java/com/android/tools/r8/apimodel/ApiModelNoInliningOfTryCatchReferenceTest.java
@@ -5,6 +5,7 @@
 package com.android.tools.r8.apimodel;
 
 import static com.android.tools.r8.apimodel.ApiModelingTestHelper.setMockApiLevelForClass;
+import static com.android.tools.r8.apimodel.ApiModelingTestHelper.setMockApiLevelForDefaultInstanceInitializer;
 import static org.junit.Assert.assertEquals;
 
 import com.android.tools.r8.NeverInline;
@@ -35,7 +36,6 @@
   @Test
   public void testR8() throws Exception {
     Method tryCatch = TestClass.class.getDeclaredMethod("testTryCatch");
-    Method callTestClass = Caller.class.getDeclaredMethod("callTestClass");
     testForR8(parameters.getBackend())
         .addProgramClasses(Main.class, TestClass.class, Caller.class, KeptClass.class)
         .addLibraryClasses(ApiException.class)
@@ -45,19 +45,28 @@
             Reference.methodFromMethod(KeptClass.class.getDeclaredMethod("keptMethodThatMayThrow")))
         .addKeepMainRule(Main.class)
         .apply(setMockApiLevelForClass(ApiException.class, exceptionApiLevel))
+        .apply(setMockApiLevelForDefaultInstanceInitializer(ApiException.class, exceptionApiLevel))
         .apply(ApiModelingTestHelper::enableApiCallerIdentification)
         .enableInliningAnnotations()
         .addHorizontallyMergedClassesInspector(
-            // TODO(b/207812068): The classes should not be merged.
-            inspector -> inspector.assertClassesMerged(TestClass.class, Caller.class))
+            horizontallyMergedClassesInspector -> {
+              if (parameters.isDexRuntime()
+                  && parameters.getApiLevel().isGreaterThanOrEqualTo(exceptionApiLevel)) {
+                horizontallyMergedClassesInspector.assertClassesMerged(
+                    TestClass.class, Caller.class);
+              } else {
+                horizontallyMergedClassesInspector.assertNoClassesMerged();
+              }
+            })
         .apply(
             ApiModelingTestHelper.addTracedApiReferenceLevelCallBack(
                 (reference, apiLevel) -> {
                   if (reference.equals(Reference.methodFromMethod(tryCatch))) {
-                    // TODO(b/207812068): The api level should be
-                    //  max(exceptionApiLevel, parameters.getApiLevel()).
                     assertEquals(
-                        parameters.isCfRuntime() ? AndroidApiLevel.B : parameters.getApiLevel(),
+                        exceptionApiLevel.max(
+                            parameters.isCfRuntime()
+                                ? AndroidApiLevel.B
+                                : parameters.getApiLevel()),
                         apiLevel);
                   }
                 }))
@@ -89,6 +98,9 @@
   public static class KeptClass {
 
     public static void keptMethodThatMayThrow() {
+      if (System.currentTimeMillis() == 0) {
+        throw new ApiException();
+      }
       System.out.println("Hello World");
     }
   }