Merge "Minor refactor of -identifiernamestring warnings"
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 830391a..9db99ae 100644
--- a/src/main/java/com/android/tools/r8/naming/IdentifierNameStringMarker.java
+++ b/src/main/java/com/android/tools/r8/naming/IdentifierNameStringMarker.java
@@ -6,9 +6,9 @@
 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.warnUndeterminedIdentifierIfNecessary;
 
 import com.android.tools.r8.graph.AppInfo;
+import com.android.tools.r8.graph.DexClass;
 import com.android.tools.r8.graph.DexEncodedField;
 import com.android.tools.r8.graph.DexEncodedMethod;
 import com.android.tools.r8.graph.DexField;
@@ -32,8 +32,11 @@
 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.position.TextPosition;
 import com.android.tools.r8.shaking.Enqueuer.AppInfoWithLiveness;
 import com.android.tools.r8.utils.InternalOptions;
+import com.android.tools.r8.utils.StringDiagnostic;
 import com.google.common.collect.Streams;
 import it.unimi.dsi.fastutil.objects.Object2BooleanMap;
 import java.util.Arrays;
@@ -105,24 +108,19 @@
           if (!identifierNameStrings.containsKey(field)) {
             continue;
           }
-          boolean isExplicitRule = identifierNameStrings.getBoolean(field);
           Value in = instruction.isStaticPut()
               ? instruction.asStaticPut().inValue()
               : instruction.asInstancePut().value();
           if (!in.isConstString()) {
-            if (isExplicitRule) {
-              warnUndeterminedIdentifierIfNecessary(
-                  appInfo, options, field, originHolder, 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 (isExplicitRule) {
-              warnUndeterminedIdentifierIfNecessary(
-                  appInfo, options, field, originHolder, instruction, original);
-            }
+            warnUndeterminedIdentifierIfNecessary(
+                appInfo, options, field, originHolder, instruction, original);
             continue;
           }
           // Move the cursor back to $fieldPut
@@ -171,16 +169,13 @@
           if (!identifierNameStrings.containsKey(invokedMethod)) {
             continue;
           }
-          boolean isExplicitRule = identifierNameStrings.getBoolean(invokedMethod);
           List<Value> ins = invoke.arguments();
           Value[] changes = new Value [ins.size()];
           if (isReflectionMethod(dexItemFactory, invokedMethod)) {
             DexItemBasedString itemBasedString = identifyIdentiferNameString(appInfo, invoke);
             if (itemBasedString == null) {
-              if (isExplicitRule) {
-                warnUndeterminedIdentifierIfNecessary(
-                    appInfo, options, invokedMethod, originHolder, instruction, null);
-              }
+              warnUndeterminedIdentifierIfNecessary(
+                  appInfo, options, invokedMethod, originHolder, instruction, null);
               continue;
             }
             DexType returnType = invoke.getReturnType();
@@ -225,20 +220,16 @@
             for (int i = 0; i < ins.size(); i++) {
               Value in = ins.get(i);
               if (!in.isConstString()) {
-                if (isExplicitRule) {
-                  warnUndeterminedIdentifierIfNecessary(
-                      appInfo, options, invokedMethod, originHolder, 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 (isExplicitRule) {
-                  warnUndeterminedIdentifierIfNecessary(
-                      appInfo, options, invokedMethod, originHolder, instruction, original);
-                }
+                warnUndeterminedIdentifierIfNecessary(
+                    appInfo, options, invokedMethod, originHolder, instruction, original);
                 continue;
               }
               // Move the cursor back to $invoke
@@ -292,4 +283,43 @@
       }
     }
   }
+
+  private void warnUndeterminedIdentifierIfNecessary(
+      AppInfo appInfo,
+      InternalOptions options,
+      DexItem member,
+      DexType originHolder,
+      Instruction instruction,
+      DexString original) {
+    assert member instanceof DexField || member instanceof DexMethod;
+    // Only issue warnings for -identifiernamestring rules explicitly added by the user.
+    boolean matchedByExplicitRule = identifierNameStrings.getBoolean(member);
+    if (!matchedByExplicitRule) {
+      return;
+    }
+    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 ";
+    String message =
+        "Cannot determine " + originalMessage + member.toSourceString()
+            + " that is specified in -identifiernamestring rules."
+            + " Thus, not all identifier strings flowing to that " + kind
+            + " are renamed, which can cause resolution failures at runtime.";
+    StringDiagnostic diagnostic =
+        instruction.getPosition().line >= 1
+            ? new StringDiagnostic(message, origin,
+            new TextPosition(0L, instruction.getPosition().line, 1))
+            : new StringDiagnostic(message, origin);
+    options.reporter.warning(diagnostic);
+  }
 }
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 bf23f59..4c64cf6 100644
--- a/src/main/java/com/android/tools/r8/naming/IdentifierNameStringUtils.java
+++ b/src/main/java/com/android/tools/r8/naming/IdentifierNameStringUtils.java
@@ -9,7 +9,6 @@
 import com.android.tools.r8.graph.DexClass;
 import com.android.tools.r8.graph.DexEncodedField;
 import com.android.tools.r8.graph.DexEncodedMethod;
-import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.DexItem;
 import com.android.tools.r8.graph.DexItemBasedString;
 import com.android.tools.r8.graph.DexItemFactory;
@@ -24,10 +23,6 @@
 import com.android.tools.r8.ir.code.InstructionIterator;
 import com.android.tools.r8.ir.code.InvokeMethod;
 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.InternalOptions;
-import com.android.tools.r8.utils.StringDiagnostic;
 import it.unimi.dsi.fastutil.ints.Int2ObjectArrayMap;
 import java.util.List;
 import java.util.Map;
@@ -371,38 +366,4 @@
     }
     return new DexTypeList(types);
   }
-
-  public static void warnUndeterminedIdentifierIfNecessary(
-      AppInfo appInfo,
-      InternalOptions options,
-      DexItem member,
-      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 ";
-    String message =
-        "Cannot determine " + originalMessage + member.toSourceString()
-            + " that is specified in -identifiernamestring rules."
-            + " Thus, not all identifier strings flowing to that " + kind
-            + " are renamed, which can cause resolution failures at runtime.";
-    StringDiagnostic diagnostic =
-        instruction.getPosition().line >= 1
-            ? new StringDiagnostic(message, origin,
-                new TextPosition(0L, instruction.getPosition().line, 1))
-            : new StringDiagnostic(message, origin);
-    options.reporter.warning(diagnostic);
-  }
 }