Revert "Fix incorrect accessibility check in inliner"

This reverts commit dde2500f111af5c1fa5d8885f8616cad6b756817.

Reason for revert: Changes test expectations

Change-Id: I5b034df5105a33099a7f6a3579fa81e0d6aae949
diff --git a/src/main/java/com/android/tools/r8/graph/AccessControl.java b/src/main/java/com/android/tools/r8/graph/AccessControl.java
index 788b358..854c5e7 100644
--- a/src/main/java/com/android/tools/r8/graph/AccessControl.java
+++ b/src/main/java/com/android/tools/r8/graph/AccessControl.java
@@ -38,14 +38,6 @@
   public static OptionalBool isMethodAccessible(
       DexEncodedMethod method,
       DexClass holder,
-      ProgramMethod context,
-      AppView<? extends AppInfoWithClassHierarchy> appView) {
-    return isMethodAccessible(method, holder, context.getHolder(), appView.appInfo());
-  }
-
-  public static OptionalBool isMethodAccessible(
-      DexEncodedMethod method,
-      DexClass holder,
       DexProgramClass context,
       AppInfoWithClassHierarchy appInfo) {
     return isMemberAccessible(method.accessFlags, holder, context, appInfo);
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/DefaultInliningOracle.java b/src/main/java/com/android/tools/r8/ir/optimize/DefaultInliningOracle.java
index c4bf62f..5893a3b 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/DefaultInliningOracle.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/DefaultInliningOracle.java
@@ -15,7 +15,6 @@
 import com.android.tools.r8.graph.DexMethod;
 import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.graph.ProgramMethod;
-import com.android.tools.r8.graph.ResolutionResult.SingleResolutionResult;
 import com.android.tools.r8.ir.analysis.ClassInitializationAnalysis;
 import com.android.tools.r8.ir.code.BasicBlock;
 import com.android.tools.r8.ir.code.IRCode;
@@ -114,7 +113,6 @@
   @Override
   public boolean passesInliningConstraints(
       InvokeMethod invoke,
-      SingleResolutionResult resolutionResult,
       ProgramMethod singleTarget,
       Reason reason,
       WhyAreYouNotInliningReporter whyAreYouNotInliningReporter) {
@@ -169,7 +167,7 @@
     }
 
     // Abort inlining attempt if method -> target access is not right.
-    if (resolutionResult.isAccessibleFrom(method, appView.appInfo()).isPossiblyFalse()) {
+    if (!inliner.hasInliningAccess(method, singleTarget)) {
       whyAreYouNotInliningReporter.reportInaccessible();
       return false;
     }
@@ -256,7 +254,6 @@
   @Override
   public InlineAction computeInlining(
       InvokeMethod invoke,
-      SingleResolutionResult resolutionResult,
       ProgramMethod singleTarget,
       ProgramMethod context,
       ClassInitializationAnalysis classInitializationAnalysis,
@@ -280,8 +277,7 @@
       return null;
     }
 
-    if (!passesInliningConstraints(
-        invoke, resolutionResult, singleTarget, reason, whyAreYouNotInliningReporter)) {
+    if (!passesInliningConstraints(invoke, singleTarget, reason, whyAreYouNotInliningReporter)) {
       return null;
     }
 
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/ForcedInliningOracle.java b/src/main/java/com/android/tools/r8/ir/optimize/ForcedInliningOracle.java
index eea6b7c..a48dece 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/ForcedInliningOracle.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/ForcedInliningOracle.java
@@ -7,7 +7,6 @@
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.graph.ProgramMethod;
-import com.android.tools.r8.graph.ResolutionResult.SingleResolutionResult;
 import com.android.tools.r8.ir.analysis.ClassInitializationAnalysis;
 import com.android.tools.r8.ir.code.BasicBlock;
 import com.android.tools.r8.ir.code.IRCode;
@@ -43,7 +42,6 @@
   @Override
   public boolean passesInliningConstraints(
       InvokeMethod invoke,
-      SingleResolutionResult resolutionResult,
       ProgramMethod candidate,
       Reason reason,
       WhyAreYouNotInliningReporter whyAreYouNotInliningReporter) {
@@ -62,18 +60,15 @@
   @Override
   public InlineAction computeInlining(
       InvokeMethod invoke,
-      SingleResolutionResult resolutionResult,
       ProgramMethod singleTarget,
       ProgramMethod context,
       ClassInitializationAnalysis classInitializationAnalysis,
       WhyAreYouNotInliningReporter whyAreYouNotInliningReporter) {
-    return computeForInvoke(invoke, resolutionResult, whyAreYouNotInliningReporter);
+    return computeForInvoke(invoke, whyAreYouNotInliningReporter);
   }
 
   private InlineAction computeForInvoke(
-      InvokeMethod invoke,
-      SingleResolutionResult resolutionResult,
-      WhyAreYouNotInliningReporter whyAreYouNotInliningReporter) {
+      InvokeMethod invoke, WhyAreYouNotInliningReporter whyAreYouNotInliningReporter) {
     Inliner.InliningInfo info = invokesToInline.get(invoke);
     if (info == null) {
       return null;
@@ -85,7 +80,7 @@
     // with neverInline() flag.
     assert !info.target.getDefinition().getOptimizationInfo().neverInline();
     assert passesInliningConstraints(
-        invoke, resolutionResult, info.target, Reason.FORCE, whyAreYouNotInliningReporter);
+        invoke, info.target, Reason.FORCE, whyAreYouNotInliningReporter);
     return new InlineAction(info.target, invoke, Reason.FORCE);
   }
 
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/Inliner.java b/src/main/java/com/android/tools/r8/ir/optimize/Inliner.java
index 3d9a25e..2589e6a 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/Inliner.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/Inliner.java
@@ -20,7 +20,6 @@
 import com.android.tools.r8.graph.GraphLense;
 import com.android.tools.r8.graph.NestMemberClassAttribute;
 import com.android.tools.r8.graph.ProgramMethod;
-import com.android.tools.r8.graph.ResolutionResult.SingleResolutionResult;
 import com.android.tools.r8.ir.analysis.ClassInitializationAnalysis;
 import com.android.tools.r8.ir.analysis.proto.ProtoInliningReasonStrategy;
 import com.android.tools.r8.ir.analysis.type.Nullability;
@@ -200,6 +199,29 @@
     return false;
   }
 
+  boolean hasInliningAccess(ProgramMethod context, ProgramMethod target) {
+    if (!isVisibleWithFlags(target.getHolderType(), context, target.getDefinition().accessFlags)) {
+      return false;
+    }
+    // The class needs also to be visible for us to have access.
+    return isVisibleWithFlags(target.getHolderType(), context, target.getHolder().accessFlags);
+  }
+
+  private boolean isVisibleWithFlags(DexType target, ProgramMethod context, AccessFlags<?> flags) {
+    if (flags.isPublic()) {
+      return true;
+    }
+    if (flags.isPrivate()) {
+      return NestUtils.sameNest(target, context.getHolderType(), appView);
+    }
+    if (flags.isProtected()) {
+      return appView.appInfo().isSubtype(context.getHolderType(), target)
+          || target.isSamePackage(context.getHolderType());
+    }
+    // package-private
+    return target.isSamePackage(context.getHolderType());
+  }
+
   public synchronized boolean isDoubleInlineSelectedTarget(ProgramMethod method) {
     return doubleInlineSelectedTargets.contains(method);
   }
@@ -953,17 +975,6 @@
         if (current.isInvokeMethod()) {
           InvokeMethod invoke = current.asInvokeMethod();
           // TODO(b/142116551): This should be equivalent to invoke.lookupSingleTarget()!
-
-          SingleResolutionResult resolutionResult =
-              appView
-                  .appInfo()
-                  .resolveMethod(invoke.getInvokedMethod(), invoke.isInvokeInterface())
-                  .asSingleResolution();
-          if (resolutionResult == null) {
-            continue;
-          }
-
-          // TODO(b/156853206): Should not duplicate resolution.
           ProgramMethod singleTarget = oracle.lookupSingleTarget(invoke, context);
           if (singleTarget == null) {
             WhyAreYouNotInliningReporter.handleInvokeWithUnknownTarget(invoke, appView, context);
@@ -978,7 +989,6 @@
           InlineAction action =
               oracle.computeInlining(
                   invoke,
-                  resolutionResult,
                   singleTarget,
                   context,
                   classInitializationAnalysis,
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/InliningOracle.java b/src/main/java/com/android/tools/r8/ir/optimize/InliningOracle.java
index 5518ab7..a9e4736 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/InliningOracle.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/InliningOracle.java
@@ -5,7 +5,6 @@
 package com.android.tools.r8.ir.optimize;
 
 import com.android.tools.r8.graph.ProgramMethod;
-import com.android.tools.r8.graph.ResolutionResult.SingleResolutionResult;
 import com.android.tools.r8.ir.analysis.ClassInitializationAnalysis;
 import com.android.tools.r8.ir.code.InvokeMethod;
 import com.android.tools.r8.ir.optimize.Inliner.InlineAction;
@@ -24,14 +23,12 @@
 
   boolean passesInliningConstraints(
       InvokeMethod invoke,
-      SingleResolutionResult resolutionResult,
       ProgramMethod candidate,
       Reason reason,
       WhyAreYouNotInliningReporter whyAreYouNotInliningReporter);
 
   InlineAction computeInlining(
       InvokeMethod invoke,
-      SingleResolutionResult resolutionResult,
       ProgramMethod singleTarget,
       ProgramMethod context,
       ClassInitializationAnalysis classInitializationAnalysis,
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/classinliner/InlineCandidateProcessor.java b/src/main/java/com/android/tools/r8/ir/optimize/classinliner/InlineCandidateProcessor.java
index 2742a6e..1355477 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/classinliner/InlineCandidateProcessor.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/classinliner/InlineCandidateProcessor.java
@@ -19,7 +19,6 @@
 import com.android.tools.r8.graph.DexProgramClass;
 import com.android.tools.r8.graph.ProgramMethod;
 import com.android.tools.r8.graph.ResolutionResult;
-import com.android.tools.r8.graph.ResolutionResult.SingleResolutionResult;
 import com.android.tools.r8.ir.analysis.ClassInitializationAnalysis;
 import com.android.tools.r8.ir.analysis.type.ClassTypeElement;
 import com.android.tools.r8.ir.analysis.type.Nullability;
@@ -283,16 +282,6 @@
 
         if (user.isInvokeMethod()) {
           InvokeMethod invokeMethod = user.asInvokeMethod();
-          SingleResolutionResult resolutionResult =
-              appView
-                  .appInfo()
-                  .resolveMethod(invokeMethod.getInvokedMethod(), invokeMethod.isInvokeInterface())
-                  .asSingleResolution();
-          if (resolutionResult == null) {
-            return user; // Not eligible.
-          }
-
-          // TODO(b/156853206): Avoid duplicating resolution.
           DexEncodedMethod singleTargetMethod = invokeMethod.lookupSingleTarget(appView, method);
           if (singleTargetMethod == null) {
             return user; // Not eligible.
@@ -332,7 +321,7 @@
             InvokeMethodWithReceiver invoke = user.asInvokeMethodWithReceiver();
             InliningInfo inliningInfo =
                 isEligibleDirectVirtualMethodCall(
-                    invoke, resolutionResult, singleTarget, indirectUsers, defaultOracle);
+                    invoke, singleTarget, indirectUsers, defaultOracle);
             if (inliningInfo != null) {
               methodCallsOnInstance.put(invoke, inliningInfo);
               continue;
@@ -890,7 +879,6 @@
 
   private InliningInfo isEligibleDirectVirtualMethodCall(
       InvokeMethodWithReceiver invoke,
-      SingleResolutionResult resolutionResult,
       ProgramMethod singleTarget,
       Set<Instruction> indirectUsers,
       Supplier<InliningOracle> defaultOracle) {
@@ -908,11 +896,7 @@
     if (singleTarget.getDefinition().isLibraryMethodOverride().isTrue()) {
       InliningOracle inliningOracle = defaultOracle.get();
       if (!inliningOracle.passesInliningConstraints(
-          invoke,
-          resolutionResult,
-          singleTarget,
-          Reason.SIMPLE,
-          NopWhyAreYouNotInliningReporter.getInstance())) {
+          invoke, singleTarget, Reason.SIMPLE, NopWhyAreYouNotInliningReporter.getInstance())) {
         return null;
       }
     }
@@ -936,16 +920,13 @@
       Pair<Type, DexMethod> invokeInfo = eligibility.callsReceiver.get(0);
       Type invokeType = invokeInfo.getFirst();
       DexMethod indirectlyInvokedMethod = invokeInfo.getSecond();
-      SingleResolutionResult indirectResolutionResult =
-          appView
-              .appInfo()
-              .resolveMethodOn(eligibleClass, indirectlyInvokedMethod)
-              .asSingleResolution();
-      if (indirectResolutionResult == null) {
+      ResolutionResult resolutionResult =
+          appView.appInfo().resolveMethodOn(eligibleClass, indirectlyInvokedMethod);
+      if (!resolutionResult.isSingleResolution()) {
         return null;
       }
       ProgramMethod indirectSingleTarget =
-          indirectResolutionResult.getResolutionPair().asProgramMethod();
+          resolutionResult.asSingleResolution().getResolutionPair().asProgramMethod();
       if (!isEligibleIndirectVirtualMethodCall(
           indirectlyInvokedMethod, invokeType, indirectSingleTarget)) {
         return null;
@@ -1214,28 +1195,24 @@
         return false;
       }
 
-      SingleResolutionResult resolutionResult =
-          appView
-              .appInfo()
-              .resolveMethod(invoke.getInvokedMethod(), invoke.isInvokeInterface())
-              .asSingleResolution();
-      if (resolutionResult == null) {
-        return false;
-      }
-
       // Check if the method is inline-able by standard inliner.
-      // TODO(b/156853206): Should not duplicate resolution.
-      ProgramMethod singleTarget = invoke.lookupSingleProgramTarget(appView, method);
+      DexEncodedMethod singleTarget = invoke.lookupSingleTarget(appView, method);
       if (singleTarget == null) {
         return false;
       }
 
+      DexProgramClass holder = asProgramClassOrNull(appView.definitionForHolder(singleTarget));
+      if (holder == null) {
+        return false;
+      }
+
+      ProgramMethod singleTargetMethod = new ProgramMethod(holder, singleTarget);
+
       InliningOracle oracle = defaultOracle.get();
       InlineAction inlineAction =
           oracle.computeInlining(
               invoke,
-              resolutionResult,
-              singleTarget,
+              singleTargetMethod,
               method,
               ClassInitializationAnalysis.trivial(),
               NopWhyAreYouNotInliningReporter.getInstance());