Provide access to try/catch guards in code inspector

Change-Id: I5d3a00372a16f56e2cf658b69556340da945e8f5
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/CfTryCatchSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/CfTryCatchSubject.java
index 3e47f3b..d6bac64 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/CfTryCatchSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/CfTryCatchSubject.java
@@ -11,12 +11,17 @@
 import com.android.tools.r8.graph.CfCode;
 import com.android.tools.r8.graph.DexItemFactory;
 import com.android.tools.r8.graph.DexType;
+import java.util.Collection;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 class CfTryCatchSubject implements TryCatchSubject {
+  private final CodeInspector inspector;
   private final CfCode cfCode;
   private final CfTryCatch tryCatch;
 
-  CfTryCatchSubject(CfCode cfCode, CfTryCatch tryCatch) {
+  CfTryCatchSubject(CodeInspector inspector, CfCode cfCode, CfTryCatch tryCatch) {
+    this.inspector = inspector;
     this.cfCode = cfCode;
     this.tryCatch = tryCatch;
   }
@@ -62,6 +67,16 @@
   }
 
   @Override
+  public Stream<TypeSubject> streamGuards() {
+    return tryCatch.guards.stream().map(type -> new TypeSubject(inspector, type));
+  }
+
+  @Override
+  public Collection<TypeSubject> guards() {
+    return streamGuards().collect(Collectors.toList());
+  }
+
+  @Override
   public int getNumberOfHandlers() {
     return tryCatch.guards.size();
   }
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/CodeInspector.java b/src/test/java/com/android/tools/r8/utils/codeinspector/CodeInspector.java
index 2a4c7c5..f43c01c 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/CodeInspector.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/CodeInspector.java
@@ -386,11 +386,11 @@
   }
 
   TryCatchSubject createTryCatchSubject(DexCode code, Try tryElement, TryHandler tryHandler) {
-    return new DexTryCatchSubject(code, tryElement, tryHandler);
+    return new DexTryCatchSubject(this, code, tryElement, tryHandler);
   }
 
   TryCatchSubject createTryCatchSubject(CfCode code, CfTryCatch tryCatch) {
-    return new CfTryCatchSubject(code, tryCatch);
+    return new CfTryCatchSubject(this, code, tryCatch);
   }
 
   TryCatchIterator createTryCatchIterator(MethodSubject method) {
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/DexTryCatchSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/DexTryCatchSubject.java
index 4a96ff1..4624c33 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/DexTryCatchSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/DexTryCatchSubject.java
@@ -9,13 +9,20 @@
 import com.android.tools.r8.graph.DexCode.Try;
 import com.android.tools.r8.graph.DexCode.TryHandler;
 import com.android.tools.r8.graph.DexCode.TryHandler.TypeAddrPair;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 class DexTryCatchSubject implements TryCatchSubject {
+  private final CodeInspector inspector;
   private final DexCode dexCode;
   private final Try tryElement;
   private final TryHandler tryHandler;
 
-  DexTryCatchSubject(DexCode dexCode, Try tryElement, TryHandler tryHandler) {
+  DexTryCatchSubject(
+      CodeInspector inspector, DexCode dexCode, Try tryElement, TryHandler tryHandler) {
+    this.inspector = inspector;
     this.dexCode = dexCode;
     this.tryElement = tryElement;
     this.tryHandler = tryHandler;
@@ -45,6 +52,18 @@
   }
 
   @Override
+  public Stream<TypeSubject> streamGuards() {
+    return Arrays.stream(tryHandler.pairs)
+        .map(pair -> pair.type)
+        .map(type -> new TypeSubject(inspector, type));
+  }
+
+  @Override
+  public Collection<TypeSubject> guards() {
+    return streamGuards().collect(Collectors.toList());
+  }
+
+  @Override
   public int getNumberOfHandlers() {
     if (tryHandler.catchAllAddr != NO_HANDLER) {
       return tryHandler.pairs.length + 1;
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/MethodSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/MethodSubject.java
index b158404..72b71b0 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/MethodSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/MethodSubject.java
@@ -89,6 +89,10 @@
     return Streams.stream(iterateInstructions());
   }
 
+  public Stream<TryCatchSubject> streamTryCatches() {
+    return Streams.stream(iterateTryCatches());
+  }
+
   public void getLineNumberForInstruction(InstructionSubject subject) {
     assert hasLineNumberTable();
     getLineNumberTable().getLineForInstruction(subject);
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/TryCatchSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/TryCatchSubject.java
index 73e9ef1..d34f4e9 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/TryCatchSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/TryCatchSubject.java
@@ -3,10 +3,17 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.utils.codeinspector;
 
+import java.util.Collection;
+import java.util.stream.Stream;
+
 public interface TryCatchSubject {
   RangeSubject getRange();
   boolean isCatching(String exceptionType);
   boolean hasCatchAll();
 
+  Stream<TypeSubject> streamGuards();
+
+  Collection<TypeSubject> guards();
+
   int getNumberOfHandlers();
 }