Unified way to disable get*Name() computation for some tests.
Change-Id: I1136442257c7f22dc48be5318ce9edc12fd67a33
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/string/StringOptimizer.java b/src/main/java/com/android/tools/r8/ir/optimize/string/StringOptimizer.java
index 80963a7..11dd773 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/string/StringOptimizer.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/string/StringOptimizer.java
@@ -557,10 +557,6 @@
|| invokedMethod == appView.dexItemFactory().stringMethods.length) {
return true;
}
- // Heuristic: if the call target has the same method name, it could be still local.
- if (invokedMethod.name == context.name) {
- return true;
- }
// Add more cases to filter out, if any.
return false;
}
diff --git a/src/main/java/com/android/tools/r8/utils/InternalOptions.java b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
index 0a34142..e318b47 100644
--- a/src/main/java/com/android/tools/r8/utils/InternalOptions.java
+++ b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
@@ -31,8 +31,6 @@
import com.android.tools.r8.graph.DexMethod;
import com.android.tools.r8.graph.DexString;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.EnclosingMethodAttribute;
-import com.android.tools.r8.graph.InnerClassAttribute;
import com.android.tools.r8.ir.code.IRCode;
import com.android.tools.r8.ir.optimize.Inliner;
import com.android.tools.r8.origin.Origin;
@@ -42,6 +40,7 @@
import com.android.tools.r8.shaking.ProguardConfigurationRule;
import com.android.tools.r8.utils.IROrdering.IdentityIROrdering;
import com.android.tools.r8.utils.IROrdering.NondeterministicIROrdering;
+import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Equivalence.Wrapper;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
@@ -539,30 +538,6 @@
return ImmutableSet.of();
}
- private static class InvalidNonMemberClassInfo {
- final EnclosingMethodAttribute enclosingMember;
- final InnerClassAttribute innerClassAttribute;
-
- InvalidNonMemberClassInfo(
- EnclosingMethodAttribute enclosingMember,
- InnerClassAttribute innerClassAttribute) {
- this.enclosingMember = enclosingMember;
- this.innerClassAttribute = innerClassAttribute;
- }
-
- @Override
- public String toString() {
- List<String> attrs = new ArrayList<>();
- if (enclosingMember != null) {
- attrs.add(" EnclosingMethod: " + enclosingMember.toString());
- }
- if (innerClassAttribute != null) {
- attrs.add(" InnerClasses: " + innerClassAttribute.toString());
- }
- return StringUtils.join(attrs, System.lineSeparator());
- }
- }
-
public static class InvalidParameterAnnotationInfo {
final DexMethod method;
@@ -1033,6 +1008,13 @@
}
}
+ @VisibleForTesting
+ public void disableNameReflectionOptimization() {
+ // Use this util to disable get*Name() computation if the main intention of tests is checking
+ // const-class, e.g., canonicalization, or some test classes' only usages are get*Name().
+ enableNameReflectionOptimization = false;
+ }
+
private boolean hasMinApi(AndroidApiLevel level) {
assert isGeneratingDex();
return minApiLevel >= level.getLevel();
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/canonicalization/ConstClassCanonicalizationTest.java b/src/test/java/com/android/tools/r8/ir/optimize/canonicalization/ConstClassCanonicalizationTest.java
index 8e6472a..1867272 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/canonicalization/ConstClassCanonicalizationTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/canonicalization/ConstClassCanonicalizationTest.java
@@ -172,7 +172,7 @@
testForD8()
.debug()
.addProgramClassesAndInnerClasses(MAIN)
- .addOptionsModification(this::configure)
+ .addOptionsModification(InternalOptions::disableNameReflectionOptimization)
.setMinApi(parameters.getRuntime())
.run(parameters.getRuntime(), MAIN)
.assertSuccessWithOutput(JAVA_OUTPUT);
@@ -182,7 +182,7 @@
testForD8()
.release()
.addProgramClassesAndInnerClasses(MAIN)
- .addOptionsModification(this::configure)
+ .addOptionsModification(InternalOptions::disableNameReflectionOptimization)
.setMinApi(parameters.getRuntime())
.run(parameters.getRuntime(), MAIN)
.assertSuccessWithOutput(JAVA_OUTPUT);
@@ -197,7 +197,7 @@
.addKeepMainRule(MAIN)
.addKeepAllAttributes()
.noMinification()
- .addOptionsModification(this::configure)
+ .addOptionsModification(InternalOptions::disableNameReflectionOptimization)
.setMinApi(parameters.getRuntime())
.run(parameters.getRuntime(), MAIN)
.assertSuccessWithOutput(JAVA_OUTPUT);
@@ -211,9 +211,4 @@
parameters.isCfRuntime() ? ORIGINAL_INNER_COUNT : CANONICALIZED_INNER_COUNT;
test(result, expectedMainCount, expectedOuterCount, expectedInnerCount);
}
-
- private void configure(InternalOptions options) {
- // Literally testing const-class canonicalization. Don't optimize its usage with get*Name().
- options.enableNameReflectionOptimization = false;
- }
}
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/canonicalization/IllegalAccessConstClassTest.java b/src/test/java/com/android/tools/r8/ir/optimize/canonicalization/IllegalAccessConstClassTest.java
index 85a02ee..7601389 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/canonicalization/IllegalAccessConstClassTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/canonicalization/IllegalAccessConstClassTest.java
@@ -75,7 +75,7 @@
IllegalAccessConstClassTestDump.PackagePrivateClassDump.dump())
.addProgramClassFileData(
IllegalAccessConstClassTestDump.FakePackagePrivateClassConsumerDump.dump())
- .addOptionsModification(this::configure)
+ .addOptionsModification(InternalOptions::disableNameReflectionOptimization)
.setMinApi(parameters.getRuntime())
.compile()
.inspect(this::inspect)
@@ -92,7 +92,7 @@
IllegalAccessConstClassTestDump.FakePackagePrivateClassConsumerDump.dump())
.addKeepMainRule(MAIN)
.noMinification()
- .addOptionsModification(this::configure)
+ .addOptionsModification(InternalOptions::disableNameReflectionOptimization)
.setMinApi(parameters.getRuntime())
.compile()
.inspect(this::inspect)
@@ -113,9 +113,4 @@
2,
mainMethod.streamInstructions().filter(InstructionSubject::isConstClass).count());
}
-
- private void configure(InternalOptions options) {
- // Testing if const-class is not canonicalized. Don't optimize its usage with get*Name().
- options.enableNameReflectionOptimization = false;
- }
}
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/canonicalization/UnresolvableLibraryConstClassTest.java b/src/test/java/com/android/tools/r8/ir/optimize/canonicalization/UnresolvableLibraryConstClassTest.java
index dca1940..47ae6be 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/canonicalization/UnresolvableLibraryConstClassTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/canonicalization/UnresolvableLibraryConstClassTest.java
@@ -98,7 +98,7 @@
testForD8()
.release()
.addProgramClasses(ProgramClass1.class, ProgramClass2.class, ProgramSubClass.class, MAIN)
- .addOptionsModification(this::configure)
+ .addOptionsModification(InternalOptions::disableNameReflectionOptimization)
.setMinApi(parameters.getRuntime())
.compile()
.inspect(this::inspect)
@@ -115,7 +115,7 @@
.addKeepMainRule(MAIN)
.noMinification()
.enableMergeAnnotations()
- .addOptionsModification(this::configure)
+ .addOptionsModification(InternalOptions::disableNameReflectionOptimization)
.setMinApi(parameters.getRuntime())
.compile()
.inspect(this::inspect)
@@ -140,9 +140,4 @@
6,
mainMethod.streamInstructions().filter(InstructionSubject::isConstClass).count());
}
-
- private void configure(InternalOptions options) {
- // Testing if const-class is not canonicalized. Don't optimize its usage with get*Name().
- options.enableNameReflectionOptimization = false;
- }
}
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/reflection/InnerClassNameTestRunner.java b/src/test/java/com/android/tools/r8/ir/optimize/reflection/InnerClassNameTestRunner.java
index 6a27101..8896197 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/reflection/InnerClassNameTestRunner.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/reflection/InnerClassNameTestRunner.java
@@ -187,7 +187,7 @@
D8TestCompileResult d8CompileResult =
testForD8()
.addProgramClassFileData(InnerClassNameTestDump.dump(config, parameters))
- .addOptionsModification(this::configure)
+ .addOptionsModification(InternalOptions::disableNameReflectionOptimization)
.setMinApi(parameters.getRuntime())
.compile();
checkWarningsAboutMalformedAttribute(d8CompileResult);
@@ -212,7 +212,7 @@
.addKeepRules("-keepattributes InnerClasses,EnclosingMethod")
.addProgramClassFileData(InnerClassNameTestDump.dump(config, parameters))
.minification(minify)
- .addOptionsModification(this::configure)
+ .addOptionsModification(InternalOptions::disableNameReflectionOptimization)
.setMinApi(parameters.getRuntime())
.compile();
checkWarningsAboutMalformedAttribute(r8CompileResult);
@@ -303,9 +303,4 @@
return getExpected(
innerClassTypeFinal, outerClassTypeFinal + "." + innerNameFinal, innerNameFinal);
}
-
- private void configure(InternalOptions options) {
- // Literally testing inner-name computation. Don't optimize get*Name().
- options.enableNameReflectionOptimization = false;
- }
}
diff --git a/src/test/java/com/android/tools/r8/proguard/rules/InnerClassNameSeparatorTest.java b/src/test/java/com/android/tools/r8/proguard/rules/InnerClassNameSeparatorTest.java
index 426b16f..6da44a5 100644
--- a/src/test/java/com/android/tools/r8/proguard/rules/InnerClassNameSeparatorTest.java
+++ b/src/test/java/com/android/tools/r8/proguard/rules/InnerClassNameSeparatorTest.java
@@ -11,6 +11,7 @@
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.TestRunResult;
import com.android.tools.r8.TestShrinkerBuilder;
+import com.android.tools.r8.utils.InternalOptions;
import com.google.common.collect.ImmutableList;
import java.util.List;
import org.junit.Test;
@@ -39,11 +40,9 @@
TestRunResult<?> result =
runTest(
testForR8(parameters.getBackend())
+ .addOptionsModification(InternalOptions::disableNameReflectionOptimization)
.addOptionsModification(
options -> {
- // Otherwise, Inner can be shrunk after its only reference, .class.getName(),
- // is optimized away.
- options.enableNameReflectionOptimization = false;
if (separator.equals(".")) {
// R8 currently does not recognize the '.' as an inner class name separator.
options.testing.allowUnusedProguardConfigurationRules = true;