Do not warn undetermined identifiers for reflection in library classes.

Bug: 111246805, 72858955
Change-Id: I2e2fcfa9664891e0c2f251bce124f0ea5830c4e8
diff --git a/src/main/java/com/android/tools/r8/naming/IdentifierNameStringMarker.java b/src/main/java/com/android/tools/r8/naming/IdentifierNameStringMarker.java
index 581ac8a..b0f4dc0 100644
--- a/src/main/java/com/android/tools/r8/naming/IdentifierNameStringMarker.java
+++ b/src/main/java/com/android/tools/r8/naming/IdentifierNameStringMarker.java
@@ -6,7 +6,7 @@
 import static com.android.tools.r8.naming.IdentifierNameStringUtils.identifyIdentiferNameString;
 import static com.android.tools.r8.naming.IdentifierNameStringUtils.inferMemberOrTypeFromNameString;
 import static com.android.tools.r8.naming.IdentifierNameStringUtils.isReflectionMethod;
-import static com.android.tools.r8.naming.IdentifierNameStringUtils.warnUndeterminedIdentifier;
+import static com.android.tools.r8.naming.IdentifierNameStringUtils.warnUndeterminedIdentifierIfNecessary;
 
 import com.android.tools.r8.graph.AppInfo;
 import com.android.tools.r8.graph.DexEncodedField;
@@ -32,7 +32,6 @@
 import com.android.tools.r8.ir.code.InvokeMethod;
 import com.android.tools.r8.ir.code.StaticPut;
 import com.android.tools.r8.ir.code.Value;
-import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.shaking.Enqueuer.AppInfoWithLiveness;
 import com.android.tools.r8.utils.InternalOptions;
 import com.google.common.collect.Streams;
@@ -82,7 +81,7 @@
   }
 
   public void decoupleIdentifierNameStringsInMethod(DexEncodedMethod encodedMethod, IRCode code) {
-    Origin origin = appInfo.originFor(code.method.method.getHolder());
+    DexType originHolder = code.method.method.getHolder();
     ListIterator<BasicBlock> blocks = code.listIterator();
     while (blocks.hasNext()) {
       BasicBlock block = blocks.next();
@@ -110,17 +109,15 @@
               ? instruction.asStaticPut().inValue()
               : instruction.asInstancePut().value();
           if (!in.isConstString()) {
-            if (options.proguardConfiguration.isObfuscating()) {
-              warnUndeterminedIdentifier(options.reporter, field, origin, instruction, null);
-            }
+            warnUndeterminedIdentifierIfNecessary(
+                appInfo, options, field, originHolder, instruction, null);
             continue;
           }
           DexString original = in.getConstInstruction().asConstString().getValue();
           DexItemBasedString itemBasedString = inferMemberOrTypeFromNameString(appInfo, original);
           if (itemBasedString == null) {
-            if (options.proguardConfiguration.isObfuscating()) {
-              warnUndeterminedIdentifier(options.reporter, field, origin, instruction, original);
-            }
+            warnUndeterminedIdentifierIfNecessary(
+                appInfo, options, field, originHolder, instruction, original);
             continue;
           }
           // Move the cursor back to $fieldPut
@@ -174,10 +171,8 @@
           if (isReflectionMethod(dexItemFactory, invokedMethod)) {
             DexItemBasedString itemBasedString = identifyIdentiferNameString(appInfo, invoke);
             if (itemBasedString == null) {
-              if (options.proguardConfiguration.isObfuscating()) {
-                warnUndeterminedIdentifier(
-                    options.reporter, invokedMethod, origin, instruction, null);
-              }
+              warnUndeterminedIdentifierIfNecessary(
+                  appInfo, options, invokedMethod, originHolder, instruction, null);
               continue;
             }
             DexType returnType = invoke.getReturnType();
@@ -222,20 +217,16 @@
             for (int i = 0; i < ins.size(); i++) {
               Value in = ins.get(i);
               if (!in.isConstString()) {
-                if (options.proguardConfiguration.isObfuscating()) {
-                  warnUndeterminedIdentifier(
-                      options.reporter, invokedMethod, origin, instruction, null);
-                }
+                warnUndeterminedIdentifierIfNecessary(
+                    appInfo, options, invokedMethod, originHolder, instruction, null);
                 continue;
               }
               DexString original = in.getConstInstruction().asConstString().getValue();
               DexItemBasedString itemBasedString =
                   inferMemberOrTypeFromNameString(appInfo, original);
               if (itemBasedString == null) {
-                if (options.proguardConfiguration.isObfuscating()) {
-                  warnUndeterminedIdentifier(
-                      options.reporter, invokedMethod, origin, instruction, original);
-                }
+                warnUndeterminedIdentifierIfNecessary(
+                    appInfo, options, invokedMethod, originHolder, instruction, original);
                 continue;
               }
               // Move the cursor back to $invoke
diff --git a/src/main/java/com/android/tools/r8/naming/IdentifierNameStringUtils.java b/src/main/java/com/android/tools/r8/naming/IdentifierNameStringUtils.java
index 471b3f8..bf23f59 100644
--- a/src/main/java/com/android/tools/r8/naming/IdentifierNameStringUtils.java
+++ b/src/main/java/com/android/tools/r8/naming/IdentifierNameStringUtils.java
@@ -26,7 +26,7 @@
 import com.android.tools.r8.ir.code.Value;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.position.TextPosition;
-import com.android.tools.r8.utils.Reporter;
+import com.android.tools.r8.utils.InternalOptions;
 import com.android.tools.r8.utils.StringDiagnostic;
 import it.unimi.dsi.fastutil.ints.Int2ObjectArrayMap;
 import java.util.List;
@@ -372,13 +372,24 @@
     return new DexTypeList(types);
   }
 
-  public static void warnUndeterminedIdentifier(
-      Reporter reporter,
+  public static void warnUndeterminedIdentifierIfNecessary(
+      AppInfo appInfo,
+      InternalOptions options,
       DexItem member,
-      Origin origin,
+      DexType originHolder,
       Instruction instruction,
       DexString original) {
     assert member instanceof DexField || member instanceof DexMethod;
+    DexClass originClass = appInfo.definitionFor(originHolder);
+    // If the origin is a library class, it is out of developers' control.
+    if (originClass != null && originClass.isLibraryClass()) {
+      return;
+    }
+    // Undetermined identifiers matter only if minification is enabled.
+    if (!options.proguardConfiguration.isObfuscating()) {
+      return;
+    }
+    Origin origin = appInfo.originFor(originHolder);
     String kind = member instanceof DexField ? "field" : "method";
     String originalMessage = original == null ? "what identifier string flows to "
         : "what '" + original.toString() + "' refers to, which flows to ";
@@ -392,6 +403,6 @@
             ? new StringDiagnostic(message, origin,
                 new TextPosition(0L, instruction.getPosition().line, 1))
             : new StringDiagnostic(message, origin);
-    reporter.warning(diagnostic);
+    options.reporter.warning(diagnostic);
   }
 }
diff --git a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
index 061b9bf..8335cba 100644
--- a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
+++ b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
@@ -5,7 +5,7 @@
 
 import static com.android.tools.r8.naming.IdentifierNameStringUtils.identifyIdentiferNameString;
 import static com.android.tools.r8.naming.IdentifierNameStringUtils.isReflectionMethod;
-import static com.android.tools.r8.naming.IdentifierNameStringUtils.warnUndeterminedIdentifier;
+import static com.android.tools.r8.naming.IdentifierNameStringUtils.warnUndeterminedIdentifierIfNecessary;
 import static com.android.tools.r8.shaking.ProguardConfigurationUtils.buildIdentifierNameStringRule;
 
 import com.android.tools.r8.Diagnostic;
@@ -1359,13 +1359,14 @@
   }
 
   private void handleProguardReflectiveBehavior(DexEncodedMethod method) {
-    Origin origin = appInfo.originFor(method.method.holder);
+    DexType originHolder = method.method.holder;
+    Origin origin = appInfo.originFor(originHolder);
     IRCode code = method.buildIR(appInfo, options, origin);
     code.instructionIterator().forEachRemaining(instr ->
-        handleProguardReflectiveBehavior(instr, origin));
+        handleProguardReflectiveBehavior(instr, originHolder));
   }
 
-  private void handleProguardReflectiveBehavior(Instruction instruction, Origin origin) {
+  private void handleProguardReflectiveBehavior(Instruction instruction, DexType originHolder) {
     if (!instruction.isInvokeMethod()) {
       return;
     }
@@ -1376,9 +1377,8 @@
     }
     DexItemBasedString itemBasedString = identifyIdentiferNameString(appInfo, invoke);
     if (itemBasedString == null) {
-      if (options.proguardConfiguration.isObfuscating()) {
-        warnUndeterminedIdentifier(options.reporter, invokedMethod, origin, instruction, null);
-      }
+      warnUndeterminedIdentifierIfNecessary(
+          appInfo, options, invokedMethod, originHolder, instruction, null);
       return;
     }
     if (itemBasedString.basedOn instanceof DexType) {