Refactor code to use isTypeVisibleInContext()

Change-Id: I66a06db282fc8c1393a97adaf13fff1495af6003
diff --git a/src/main/java/com/android/tools/r8/ir/code/ConstClass.java b/src/main/java/com/android/tools/r8/ir/code/ConstClass.java
index b122429..21fa465 100644
--- a/src/main/java/com/android/tools/r8/ir/code/ConstClass.java
+++ b/src/main/java/com/android/tools/r8/ir/code/ConstClass.java
@@ -4,6 +4,8 @@
 
 package com.android.tools.r8.ir.code;
 
+import static com.android.tools.r8.optimize.MemberRebindingAnalysis.isClassTypeVisibleFromContext;
+
 import com.android.tools.r8.cf.LoadStoreHelper;
 import com.android.tools.r8.cf.TypeVerificationHelper;
 import com.android.tools.r8.cf.code.CfConstClass;
@@ -112,9 +114,7 @@
       return AbstractError.specific(appView.dexItemFactory().noClassDefFoundErrorType);
     }
     // * IllegalAccessError (not visible from the access context).
-    ConstraintWithTarget classVisibility =
-        ConstraintWithTarget.deriveConstraint(context, baseType, clazz.accessFlags, appView);
-    if (classVisibility == ConstraintWithTarget.NEVER) {
+    if (!isClassTypeVisibleFromContext(appView, context, clazz)) {
       return AbstractError.specific(appView.dexItemFactory().illegalAccessErrorType);
     }
 
diff --git a/src/main/java/com/android/tools/r8/ir/code/InvokeNewArray.java b/src/main/java/com/android/tools/r8/ir/code/InvokeNewArray.java
index 4941c86..503bf0e 100644
--- a/src/main/java/com/android/tools/r8/ir/code/InvokeNewArray.java
+++ b/src/main/java/com/android/tools/r8/ir/code/InvokeNewArray.java
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.ir.code;
 
-import static com.android.tools.r8.optimize.MemberRebindingAnalysis.isTypeVisibleFromContext;
+import static com.android.tools.r8.optimize.MemberRebindingAnalysis.isClassTypeVisibleFromContext;
 
 import com.android.tools.r8.cf.LoadStoreHelper;
 import com.android.tools.r8.cf.TypeVerificationHelper;
@@ -169,7 +169,7 @@
     }
 
     // Check if the type is guaranteed to be accessible.
-    if (!isTypeVisibleFromContext(appView, context, clazz)) {
+    if (!isClassTypeVisibleFromContext(appView, context, clazz)) {
       return AbstractError.top();
     }
 
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java b/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java
index 5cbae5e..ccbf3be 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java
@@ -7,6 +7,7 @@
 import static com.android.tools.r8.ir.analysis.ClassInitializationAnalysis.Query.DIRECTLY;
 import static com.android.tools.r8.ir.analysis.type.Nullability.definitelyNotNull;
 import static com.android.tools.r8.ir.analysis.type.Nullability.maybeNull;
+import static com.android.tools.r8.optimize.MemberRebindingAnalysis.isTypeVisibleFromContext;
 
 import com.android.tools.r8.dex.Constants;
 import com.android.tools.r8.errors.CompilationError;
@@ -86,7 +87,6 @@
 import com.android.tools.r8.ir.code.Xor;
 import com.android.tools.r8.ir.conversion.IRConverter;
 import com.android.tools.r8.ir.conversion.OptimizationFeedback;
-import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget;
 import com.android.tools.r8.ir.optimize.SwitchUtils.EnumSwitchInfo;
 import com.android.tools.r8.ir.regalloc.LinearScanRegisterAllocator;
 import com.android.tools.r8.kotlin.Kotlin;
@@ -2061,7 +2061,7 @@
     // If the cast type is not accessible in the current context, we should not remove the cast
     // in order to preserve IllegalAccessError. Note that JVM and ART behave differently: see
     // {@link com.android.tools.r8.ir.optimize.checkcast.IllegalAccessErrorTest}.
-    if (isTypeInaccessibleInCurrentContext(castType, code.method)) {
+    if (!isTypeVisibleFromContext(appView, code.method.method.holder, castType)) {
       return RemoveCheckCastInstructionIfTrivialResult.NO_REMOVALS;
     }
 
@@ -2113,28 +2113,12 @@
     return RemoveCheckCastInstructionIfTrivialResult.NO_REMOVALS;
   }
 
-  private boolean isTypeInaccessibleInCurrentContext(DexType type, DexEncodedMethod context) {
-    DexType baseType = type.toBaseType(appView.dexItemFactory());
-    if (baseType.isPrimitiveType()) {
-      return false;
-    }
-    DexClass clazz = appView.definitionFor(baseType);
-    if (clazz == null) {
-      // Conservatively say yes.
-      return true;
-    }
-    ConstraintWithTarget classVisibility =
-        ConstraintWithTarget.deriveConstraint(
-            context.method.holder, baseType, clazz.accessFlags, appView);
-    return classVisibility == ConstraintWithTarget.NEVER;
-  }
-
   // Returns true if the given instance-of instruction was removed.
   private boolean removeInstanceOfInstructionIfTrivial(
       InstanceOf instanceOf, InstructionIterator it, IRCode code) {
     // If the instance-of type is not accessible in the current context, we should not remove the
     // instance-of instruction in order to preserve IllegalAccessError.
-    if (isTypeInaccessibleInCurrentContext(instanceOf.type(), code.method)) {
+    if (!isTypeVisibleFromContext(appView, code.method.method.holder, instanceOf.type())) {
       return false;
     }
 
diff --git a/src/main/java/com/android/tools/r8/optimize/MemberRebindingAnalysis.java b/src/main/java/com/android/tools/r8/optimize/MemberRebindingAnalysis.java
index 2ba89ba..760904a 100644
--- a/src/main/java/com/android/tools/r8/optimize/MemberRebindingAnalysis.java
+++ b/src/main/java/com/android/tools/r8/optimize/MemberRebindingAnalysis.java
@@ -316,11 +316,21 @@
 
   public static boolean isTypeVisibleFromContext(
       AppView<?> appView, DexType context, DexType type) {
-    DexClass clazz = appView.definitionFor(type);
-    return clazz != null && isTypeVisibleFromContext(appView, context, clazz);
+    DexType baseType = type.toBaseType(appView.dexItemFactory());
+    if (baseType.isPrimitiveType()) {
+      return true;
+    }
+    return isClassTypeVisibleFromContext(appView, context, baseType);
   }
 
-  public static boolean isTypeVisibleFromContext(
+  public static boolean isClassTypeVisibleFromContext(
+      AppView<?> appView, DexType context, DexType type) {
+    assert type.isClassType();
+    DexClass clazz = appView.definitionFor(type);
+    return clazz != null && isClassTypeVisibleFromContext(appView, context, clazz);
+  }
+
+  public static boolean isClassTypeVisibleFromContext(
       AppView<?> appView, DexType context, DexClass clazz) {
     ConstraintWithTarget classVisibility =
         ConstraintWithTarget.deriveConstraint(context, clazz.type, clazz.accessFlags, appView);
@@ -329,7 +339,7 @@
 
   public static boolean isMemberVisibleFromOriginalContext(
       AppView<?> appView, DexType context, DexType holder, AccessFlags<?> memberAccessFlags) {
-    if (!isTypeVisibleFromContext(appView, context, holder)) {
+    if (!isClassTypeVisibleFromContext(appView, context, holder)) {
       return false;
     }
     ConstraintWithTarget memberVisibility =