Clean existing MethodParameters test to use transforms.
Change-Id: I8ab2c1e7b7f11c9dde331e8e40df343ed1eabb51
diff --git a/src/test/java/com/android/tools/r8/desugaring/interfacemethods/MethodParametersTest.java b/src/test/java/com/android/tools/r8/desugaring/interfacemethods/MethodParametersTest.java
index ecf5c8d..71c94de 100644
--- a/src/test/java/com/android/tools/r8/desugaring/interfacemethods/MethodParametersTest.java
+++ b/src/test/java/com/android/tools/r8/desugaring/interfacemethods/MethodParametersTest.java
@@ -29,9 +29,9 @@
@Parameterized.Parameters(name = "{0}")
public static TestParametersCollection data() {
- // java.lang.reflect.Method.getParameters() supported from Android 8.1.
+ // java.lang.reflect.Method.getParameters() supported from Android 8.
return getTestParameters()
- .withDexRuntimesStartingFromIncluding(Version.V8_1_0)
+ .withDexRuntimesStartingFromExcluding(Version.V7_0_0)
.withCfRuntimes()
.withAllApiLevelsAlsoForCf()
.build();
diff --git a/src/test/java/com/android/tools/r8/naming/methodparameters/MethodParametersTest.java b/src/test/java/com/android/tools/r8/naming/methodparameters/MethodParametersTest.java
index 04ec6b4..f102db0 100644
--- a/src/test/java/com/android/tools/r8/naming/methodparameters/MethodParametersTest.java
+++ b/src/test/java/com/android/tools/r8/naming/methodparameters/MethodParametersTest.java
@@ -17,9 +17,12 @@
import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.ToolHelper.DexVm.Version;
import com.android.tools.r8.shaking.ProguardKeepAttributes;
+import com.android.tools.r8.transformers.ClassFileTransformer.MethodPredicate;
import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.BooleanUtils;
import java.io.IOException;
+import java.lang.reflect.Method;
+import java.lang.reflect.Parameter;
import java.util.Arrays;
import java.util.Collection;
import java.util.concurrent.ExecutionException;
@@ -41,7 +44,7 @@
return buildParameters(
getTestParameters()
.withCfRuntimes()
- .withDexRuntimesStartingFromIncluding(Version.V8_1_0)
+ .withDexRuntimesStartingFromExcluding(Version.V7_0_0)
.build(),
BooleanUtils.values());
}
@@ -55,18 +58,18 @@
public void testKeepingMethodParametersR8() throws Exception {
R8TestRunResult runResult =
testForR8(parameters.getBackend())
- .addProgramClassFileData(MethodParametersTestDump.dump())
- .addKeepClassAndMembersRulesWithAllowObfuscation(MethodParametersTest.class)
- .addKeepMainRule(MethodParametersTest.class)
+ .addProgramClassFileData(getTransformedTestClass())
+ .addKeepClassAndMembersRulesWithAllowObfuscation(TestClass.class)
+ .addKeepMainRule(TestClass.class)
.addKeepAttributeSourceFile()
.applyIf(
keepMethodParameters,
builder -> builder.addKeepAttributes(ProguardKeepAttributes.METHOD_PARAMETERS))
.setMinApi(keepMethodParameters ? AndroidApiLevel.O : AndroidApiLevel.L)
// java.lang.reflect.Parameter was introduced in API level 26 (O).
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.O))
+ .addLibraryFiles(ToolHelper.getAndroidJar(apiLevelWithMethodParametersSupport()))
.compile()
- .run(parameters.getRuntime(), MethodParametersTest.class);
+ .run(parameters.getRuntime(), TestClass.class);
if (keepMethodParameters) {
checkOutputContainsAll(runResult.getStdOut());
} else {
@@ -81,9 +84,9 @@
assumeTrue(parameters.getBackend() == Backend.DEX);
D8TestRunResult runResult =
testForD8()
- .addProgramClassFileData(MethodParametersTestDump.dump())
+ .addProgramClassFileData(getTransformedTestClass())
.setMinApi(keepMethodParameters ? AndroidApiLevel.O : AndroidApiLevel.L)
- .run(parameters.getRuntime(), MethodParametersTest.class);
+ .run(parameters.getRuntime(), TestClass.class);
checkOutputContainsAll(runResult.getStdOut());
}
@@ -94,4 +97,26 @@
private void checkOutputNotContainsAll(String stdOut) {
Arrays.asList(EXPECTED).forEach(expected -> assertThat(stdOut, not(containsString(expected))));
}
+
+ private byte[] getTransformedTestClass() throws IOException {
+ return transformer(TestClass.class)
+ .setMethodParameters(MethodPredicate.onName("main"), "hello")
+ .setMethodParameters(MethodPredicate.onName("other"), "darkness", "my", "old", "friend")
+ .transform();
+ }
+
+ public static class TestClass {
+
+ public static void main(String[] hello) {
+ for (Method method : TestClass.class.getMethods()) {
+ for (Parameter parameter : method.getParameters()) {
+ System.out.println(method.getName() + ": " + parameter.getName());
+ }
+ }
+ }
+
+ public void other(int darkness, String my, Object old, boolean friend) {
+ // nothing to do, reflectively accessed...
+ }
+ }
}
diff --git a/src/test/java/com/android/tools/r8/naming/methodparameters/MethodParametersTestDump.java b/src/test/java/com/android/tools/r8/naming/methodparameters/MethodParametersTestDump.java
deleted file mode 100644
index f5ab8a6..0000000
--- a/src/test/java/com/android/tools/r8/naming/methodparameters/MethodParametersTestDump.java
+++ /dev/null
@@ -1,220 +0,0 @@
-// Copyright (c) 2019, the R8 project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-package com.android.tools.r8.naming.methodparameters;
-
-import org.objectweb.asm.ClassWriter;
-import org.objectweb.asm.Label;
-import org.objectweb.asm.MethodVisitor;
-import org.objectweb.asm.Opcodes;
-import org.objectweb.asm.Type;
-
-public class MethodParametersTestDump implements Opcodes {
-
- /* The below dump was produced by the asmifier on following java code:
-
- import java.lang.reflect.Method;
- import java.lang.reflect.Parameter;
-
- public class MethodParametersTest {
-
- public static void main(String... hello) {
- for (Method method : MethodParametersTest.class.getMethods()) {
- for (Parameter parameter : method.getParameters()) {
- System.out.println(method.getName() + ": " + parameter.getName());
- }
- }
- }
-
- public void other(int darkness, String my, Object old, boolean friend) {
-
- }
- }
- */
-
- public static byte[] dump() {
-
- ClassWriter classWriter = new ClassWriter(0);
- MethodVisitor methodVisitor;
-
- classWriter.visit(
- V1_8,
- ACC_PUBLIC | ACC_SUPER,
- "com/android/tools/r8/naming/methodparameters/MethodParametersTest",
- null,
- "java/lang/Object",
- null);
-
- classWriter.visitSource("MethodParametersTest.java", null);
-
- {
- methodVisitor = classWriter.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
- methodVisitor.visitCode();
- Label label0 = new Label();
- methodVisitor.visitLabel(label0);
- methodVisitor.visitLineNumber(4, label0);
- methodVisitor.visitVarInsn(ALOAD, 0);
- methodVisitor.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false);
- methodVisitor.visitInsn(RETURN);
- methodVisitor.visitMaxs(1, 1);
- methodVisitor.visitEnd();
- }
- {
- methodVisitor =
- classWriter.visitMethod(
- ACC_PUBLIC | ACC_STATIC | ACC_VARARGS, "main", "([Ljava/lang/String;)V", null, null);
- methodVisitor.visitParameter("hello", 0);
- methodVisitor.visitCode();
- Label label0 = new Label();
- methodVisitor.visitLabel(label0);
- methodVisitor.visitLineNumber(7, label0);
- methodVisitor.visitLdcInsn(
- Type.getType("Lcom/android/tools/r8/naming/methodparameters/MethodParametersTest;"));
- methodVisitor.visitMethodInsn(
- INVOKEVIRTUAL, "java/lang/Class", "getMethods", "()[Ljava/lang/reflect/Method;", false);
- methodVisitor.visitVarInsn(ASTORE, 1);
- methodVisitor.visitVarInsn(ALOAD, 1);
- methodVisitor.visitInsn(ARRAYLENGTH);
- methodVisitor.visitVarInsn(ISTORE, 2);
- methodVisitor.visitInsn(ICONST_0);
- methodVisitor.visitVarInsn(ISTORE, 3);
- Label label1 = new Label();
- methodVisitor.visitLabel(label1);
- methodVisitor.visitFrame(
- Opcodes.F_APPEND,
- 3,
- new Object[] {"[Ljava/lang/reflect/Method;", Opcodes.INTEGER, Opcodes.INTEGER},
- 0,
- null);
- methodVisitor.visitVarInsn(ILOAD, 3);
- methodVisitor.visitVarInsn(ILOAD, 2);
- Label label2 = new Label();
- methodVisitor.visitJumpInsn(IF_ICMPGE, label2);
- methodVisitor.visitVarInsn(ALOAD, 1);
- methodVisitor.visitVarInsn(ILOAD, 3);
- methodVisitor.visitInsn(AALOAD);
- methodVisitor.visitVarInsn(ASTORE, 4);
- Label label3 = new Label();
- methodVisitor.visitLabel(label3);
- methodVisitor.visitLineNumber(8, label3);
- methodVisitor.visitVarInsn(ALOAD, 4);
- methodVisitor.visitMethodInsn(
- INVOKEVIRTUAL,
- "java/lang/reflect/Method",
- "getParameters",
- "()[Ljava/lang/reflect/Parameter;",
- false);
- methodVisitor.visitVarInsn(ASTORE, 5);
- methodVisitor.visitVarInsn(ALOAD, 5);
- methodVisitor.visitInsn(ARRAYLENGTH);
- methodVisitor.visitVarInsn(ISTORE, 6);
- methodVisitor.visitInsn(ICONST_0);
- methodVisitor.visitVarInsn(ISTORE, 7);
- Label label4 = new Label();
- methodVisitor.visitLabel(label4);
- methodVisitor.visitFrame(
- Opcodes.F_FULL,
- 8,
- new Object[] {
- "[Ljava/lang/String;",
- "[Ljava/lang/reflect/Method;",
- Opcodes.INTEGER,
- Opcodes.INTEGER,
- "java/lang/reflect/Method",
- "[Ljava/lang/reflect/Parameter;",
- Opcodes.INTEGER,
- Opcodes.INTEGER
- },
- 0,
- new Object[] {});
- methodVisitor.visitVarInsn(ILOAD, 7);
- methodVisitor.visitVarInsn(ILOAD, 6);
- Label label5 = new Label();
- methodVisitor.visitJumpInsn(IF_ICMPGE, label5);
- methodVisitor.visitVarInsn(ALOAD, 5);
- methodVisitor.visitVarInsn(ILOAD, 7);
- methodVisitor.visitInsn(AALOAD);
- methodVisitor.visitVarInsn(ASTORE, 8);
- Label label6 = new Label();
- methodVisitor.visitLabel(label6);
- methodVisitor.visitLineNumber(9, label6);
- methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
- methodVisitor.visitTypeInsn(NEW, "java/lang/StringBuilder");
- methodVisitor.visitInsn(DUP);
- methodVisitor.visitMethodInsn(
- INVOKESPECIAL, "java/lang/StringBuilder", "<init>", "()V", false);
- methodVisitor.visitVarInsn(ALOAD, 4);
- methodVisitor.visitMethodInsn(
- INVOKEVIRTUAL, "java/lang/reflect/Method", "getName", "()Ljava/lang/String;", false);
- methodVisitor.visitMethodInsn(
- INVOKEVIRTUAL,
- "java/lang/StringBuilder",
- "append",
- "(Ljava/lang/String;)Ljava/lang/StringBuilder;",
- false);
- methodVisitor.visitLdcInsn(": ");
- methodVisitor.visitMethodInsn(
- INVOKEVIRTUAL,
- "java/lang/StringBuilder",
- "append",
- "(Ljava/lang/String;)Ljava/lang/StringBuilder;",
- false);
- methodVisitor.visitVarInsn(ALOAD, 8);
- methodVisitor.visitMethodInsn(
- INVOKEVIRTUAL, "java/lang/reflect/Parameter", "getName", "()Ljava/lang/String;", false);
- methodVisitor.visitMethodInsn(
- INVOKEVIRTUAL,
- "java/lang/StringBuilder",
- "append",
- "(Ljava/lang/String;)Ljava/lang/StringBuilder;",
- false);
- methodVisitor.visitMethodInsn(
- INVOKEVIRTUAL, "java/lang/StringBuilder", "toString", "()Ljava/lang/String;", false);
- methodVisitor.visitMethodInsn(
- INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
- Label label7 = new Label();
- methodVisitor.visitLabel(label7);
- methodVisitor.visitLineNumber(8, label7);
- methodVisitor.visitIincInsn(7, 1);
- methodVisitor.visitJumpInsn(GOTO, label4);
- methodVisitor.visitLabel(label5);
- methodVisitor.visitLineNumber(7, label5);
- methodVisitor.visitFrame(
- Opcodes.F_FULL,
- 4,
- new Object[] {
- "[Ljava/lang/String;", "[Ljava/lang/reflect/Method;", Opcodes.INTEGER, Opcodes.INTEGER
- },
- 0,
- new Object[] {});
- methodVisitor.visitIincInsn(3, 1);
- methodVisitor.visitJumpInsn(GOTO, label1);
- methodVisitor.visitLabel(label2);
- methodVisitor.visitLineNumber(12, label2);
- methodVisitor.visitFrame(Opcodes.F_CHOP, 3, null, 0, null);
- methodVisitor.visitInsn(RETURN);
- methodVisitor.visitMaxs(3, 9);
- methodVisitor.visitEnd();
- }
- {
- methodVisitor =
- classWriter.visitMethod(
- ACC_PUBLIC, "other", "(ILjava/lang/String;Ljava/lang/Object;Z)V", null, null);
- methodVisitor.visitParameter("darkness", 0);
- methodVisitor.visitParameter("my", 0);
- methodVisitor.visitParameter("old", 0);
- methodVisitor.visitParameter("friend", 0);
- methodVisitor.visitCode();
- Label label0 = new Label();
- methodVisitor.visitLabel(label0);
- methodVisitor.visitLineNumber(16, label0);
- methodVisitor.visitInsn(RETURN);
- methodVisitor.visitMaxs(0, 5);
- methodVisitor.visitEnd();
- }
- classWriter.visitEnd();
-
- return classWriter.toByteArray();
- }
-}