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);
- }
}