Update InvokeSuperTest to new test infrastructure.
Change-Id: I1982c8379d54f348fea37548c1018773c5231b4d
diff --git a/src/test/java/com/android/tools/r8/DiagnosticsChecker.java b/src/test/java/com/android/tools/r8/DiagnosticsChecker.java
index 6eba851..049cdb7 100644
--- a/src/test/java/com/android/tools/r8/DiagnosticsChecker.java
+++ b/src/test/java/com/android/tools/r8/DiagnosticsChecker.java
@@ -7,7 +7,6 @@
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
-import com.android.tools.r8.graph.invokesuper.Consumer;
import com.android.tools.r8.origin.Origin;
import com.android.tools.r8.origin.PathOrigin;
import com.android.tools.r8.position.Position;
@@ -17,6 +16,7 @@
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
+import java.util.function.Consumer;
// Helper to check that a particular error occurred.
public class DiagnosticsChecker implements DiagnosticsHandler {
diff --git a/src/test/java/com/android/tools/r8/graph/InvokeSuperTest.java b/src/test/java/com/android/tools/r8/graph/InvokeSuperTest.java
index 5bf5a36..f71538c 100644
--- a/src/test/java/com/android/tools/r8/graph/InvokeSuperTest.java
+++ b/src/test/java/com/android/tools/r8/graph/InvokeSuperTest.java
@@ -3,48 +3,371 @@
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8.graph;
-import com.android.tools.r8.AsmTestBase;
-import com.android.tools.r8.ToolHelper;
+import static org.hamcrest.CoreMatchers.allOf;
+import static org.hamcrest.CoreMatchers.containsString;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import com.android.tools.r8.CompilationFailedException;
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.TestRunResult;
import com.android.tools.r8.ToolHelper.DexVm.Version;
-import com.android.tools.r8.VmTestRunner;
-import com.android.tools.r8.VmTestRunner.IgnoreForRangeOfVmVersions;
-import com.android.tools.r8.graph.invokesuper.Consumer;
-import com.android.tools.r8.graph.invokesuper.InvokerClassDump;
-import com.android.tools.r8.graph.invokesuper.InvokerClassFailingDump;
-import com.android.tools.r8.graph.invokesuper.MainClass;
-import com.android.tools.r8.graph.invokesuper.MainClassFailing;
-import com.android.tools.r8.graph.invokesuper.SubLevel1;
-import com.android.tools.r8.graph.invokesuper.SubLevel2;
-import com.android.tools.r8.graph.invokesuper.SubclassOfInvokerClass;
-import com.android.tools.r8.graph.invokesuper.Super;
+import com.android.tools.r8.transformers.ClassTransformer;
+import com.android.tools.r8.utils.DescriptorUtils;
+import com.android.tools.r8.utils.StringUtils;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
-@RunWith(VmTestRunner.class)
-public class InvokeSuperTest extends AsmTestBase {
+@RunWith(Parameterized.class)
+public class InvokeSuperTest extends TestBase {
- @Test
- @IgnoreForRangeOfVmVersions(from = Version.V5_1_1, to = Version.V6_0_1)
- public void testInvokeSuperTargets() throws Exception {
- ensureSameOutput(MainClass.class.getCanonicalName(),
- ToolHelper.getClassAsBytes(MainClass.class),
- ToolHelper.getClassAsBytes(Consumer.class),
- ToolHelper.getClassAsBytes(Super.class),
- ToolHelper.getClassAsBytes(SubLevel1.class),
- ToolHelper.getClassAsBytes(SubLevel2.class),
- InvokerClassDump.dump(),
- ToolHelper.getClassAsBytes(SubclassOfInvokerClass.class));
+ @Parameters(name = "{0}")
+ public static TestParametersCollection data() {
+ return getTestParameters().withAllRuntimesAndApiLevels().build();
+ }
+
+ final TestParameters parameters;
+
+ public InvokeSuperTest(TestParameters parameters) {
+ this.parameters = parameters;
+ }
+
+ static final String EXPECTED =
+ StringUtils.lines(
+ "superMethod in SubLevel2",
+ "superMethod in SubLevel2",
+ "superMethod in SubLevel2",
+ "java.lang.NoSuchMethodError",
+ "subLevel1Method in SubLevel2",
+ "subLevel1Method in SubLevel2",
+ "subLevel2Method in SubLevel2",
+ "From SubLevel1: otherSuperMethod in Super");
+
+ static final String UNEXPECTED_DEX_5_AND_6_OUTPUT =
+ StringUtils.lines(
+ "superMethod in Super",
+ "superMethod in SubLevel1",
+ "superMethod in SubLevel2",
+ "java.lang.NoSuchMethodError",
+ "subLevel1Method in SubLevel1",
+ "subLevel1Method in SubLevel2",
+ "subLevel2Method in SubLevel2",
+ "From SubLevel1: otherSuperMethod in Super");
+
+ String getExpectedOutput() {
+ if (parameters.isDexRuntime()) {
+ Version version = parameters.getRuntime().asDex().getVm().getVersion();
+ if (version.isAtLeast(Version.V5_1_1) && version.isOlderThanOrEqual(Version.V6_0_1)) {
+ return UNEXPECTED_DEX_5_AND_6_OUTPUT;
+ }
+ }
+ return EXPECTED;
}
@Test
- public void testInvokeSuperTargetsNonVerifying() throws Exception {
- ensureR8FailsWithCompilationError(MainClassFailing.class.getCanonicalName(),
- ToolHelper.getClassAsBytes(MainClassFailing.class),
- ToolHelper.getClassAsBytes(Consumer.class),
- ToolHelper.getClassAsBytes(Super.class),
- ToolHelper.getClassAsBytes(SubLevel1.class),
- ToolHelper.getClassAsBytes(SubLevel2.class),
- InvokerClassFailingDump.dump(),
- ToolHelper.getClassAsBytes(SubclassOfInvokerClass.class));
+ public void testReference() throws Exception {
+ testForRuntime(parameters)
+ .addProgramClasses(
+ MainClass.class,
+ Consumer.class,
+ Super.class,
+ SubLevel1.class,
+ SubLevel2.class,
+ SubClassOfInvokerClass.class)
+ .addProgramClassFileData(InvokerClassDump.dumpVerifying())
+ .run(parameters.getRuntime(), MainClass.class)
+ .assertSuccessWithOutput(getExpectedOutput());
+ }
+
+ @Test
+ public void testR8() throws Exception {
+ testForR8(parameters.getBackend())
+ .addProgramClasses(
+ MainClass.class,
+ Consumer.class,
+ Super.class,
+ SubLevel1.class,
+ SubLevel2.class,
+ SubClassOfInvokerClass.class)
+ .addProgramClassFileData(InvokerClassDump.dumpVerifying())
+ .setMinApi(parameters.getApiLevel())
+ .addKeepMainRule(MainClass.class)
+ .run(parameters.getRuntime(), MainClass.class)
+ .assertSuccessWithOutput(EXPECTED);
+ }
+
+ @Test
+ public void testReferenceNonVerifying() throws Exception {
+ testForRuntime(parameters)
+ .addProgramClasses(
+ MainClassFailing.class,
+ Consumer.class,
+ Super.class,
+ SubLevel1.class,
+ SubLevel2.class,
+ SubClassOfInvokerClass.class)
+ .addProgramClassFileData(InvokerClassDump.dumpNonVerifying())
+ .run(parameters.getRuntime(), MainClassFailing.class)
+ .apply(this::checkNonVerifyingResult);
+ }
+
+ private void checkNonVerifyingResult(TestRunResult<?> result) {
+ // The input is invalid and any JVM will fail at verification time.
+ if (parameters.isCfRuntime()) {
+ result.assertFailureWithErrorThatMatches(containsString(VerifyError.class.getName()));
+ return;
+ }
+ // D8 cannot verify its inputs and the behavior of the compiled output differs.
+ // The failure is due to lambda desugaring on pre-7 and fails at runtime on 7+.
+ Version version = parameters.getRuntime().asDex().getVm().getVersion();
+ if (version.isOlderThanOrEqual(Version.V6_0_1)) {
+ result.assertFailureWithErrorThatMatches(
+ allOf(containsString("java.lang.NoClassDefFoundError"), containsString("-$$Lambda$")));
+ return;
+ }
+ result.assertSuccessWithOutputLines(NoSuchMethodError.class.getName());
+ }
+
+ @Test
+ public void testR8NonVerifying() throws Exception {
+ try {
+ testForR8(parameters.getBackend())
+ .addProgramClasses(
+ MainClassFailing.class,
+ Consumer.class,
+ Super.class,
+ SubLevel1.class,
+ SubLevel2.class,
+ SubClassOfInvokerClass.class)
+ .addProgramClassFileData(InvokerClassDump.dumpNonVerifying())
+ .setMinApi(parameters.getApiLevel())
+ .addKeepMainRule(MainClassFailing.class)
+ .compileWithExpectedDiagnostics(
+ diagnostics -> {
+ diagnostics.assertErrorMessageThatMatches(containsString("Illegal invoke-super"));
+ });
+ fail("Expected compilation to fail");
+ } catch (CompilationFailedException e) {
+ // Expected compilation failure.
+ }
+ }
+
+ /** Copy of {@ref java.util.function.Consumer} to allow tests to run on early versions of art. */
+ interface Consumer<T> {
+
+ void accept(T item);
+ }
+
+ static class Super {
+
+ public void superMethod() {
+ System.out.println("superMethod in Super");
+ }
+
+ public void otherSuperMethod() {
+ System.out.println("otherSuperMethod in Super");
+ }
+ }
+
+ static class SubLevel1 extends Super {
+
+ @Override
+ public void superMethod() {
+ System.out.println("superMethod in SubLevel1");
+ }
+
+ public void subLevel1Method() {
+ System.out.println("subLevel1Method in SubLevel1");
+ }
+
+ public void otherSuperMethod() {
+ System.out.println("otherSuperMethod in SubLevel1");
+ }
+
+ public void callOtherSuperMethod() {
+ System.out.print("From SubLevel1: ");
+ super.otherSuperMethod();
+ }
+ }
+
+ static class SubClassOfInvokerClass extends InvokerClass {
+
+ public void subLevel2Method() {
+ System.out.println("subLevel2Method in SubClassOfInvokerClass");
+ }
+ }
+
+ static class SubLevel2 extends SubLevel1 {
+
+ @Override
+ public void superMethod() {
+ System.out.println("superMethod in SubLevel2");
+ }
+
+ @Override
+ public void subLevel1Method() {
+ System.out.println("subLevel1Method in SubLevel2");
+ }
+
+ public void subLevel2Method() {
+ System.out.println("subLevel2Method in SubLevel2");
+ }
+
+ public void otherSuperMethod() {
+ System.out.println("otherSuperMethod in SubLevel2");
+ }
+
+ public void callOtherSuperMethodIndirect() {
+ callOtherSuperMethod();
+ }
+ }
+
+ static class MainClass {
+
+ private static void tryInvoke(Consumer<InvokerClass> function) {
+ InvokerClass invoker = new InvokerClass();
+ try {
+ function.accept(invoker);
+ } catch (Throwable e) {
+ System.out.println(e.getClass().getCanonicalName());
+ }
+ }
+
+ public static void main(String... args) {
+ tryInvoke(InvokerClass::invokeSuperMethodOnSuper);
+ tryInvoke(InvokerClass::invokeSuperMethodOnSubLevel1);
+ tryInvoke(InvokerClass::invokeSuperMethodOnSubLevel2);
+ tryInvoke(InvokerClass::invokeSubLevel1MethodOnSuper);
+ tryInvoke(InvokerClass::invokeSubLevel1MethodOnSubLevel1);
+ tryInvoke(InvokerClass::invokeSubLevel1MethodOnSubLevel2);
+ tryInvoke(InvokerClass::invokeSubLevel2MethodOnSubLevel2);
+ tryInvoke(InvokerClass::callOtherSuperMethodIndirect);
+ }
+ }
+
+ static class MainClassFailing {
+
+ private static void tryInvoke(java.util.function.Consumer<InvokerClass> function) {
+ InvokerClass invoker = new InvokerClass();
+ try {
+ function.accept(invoker);
+ } catch (Throwable e) {
+ System.out.println(e.getClass().getCanonicalName());
+ }
+ }
+
+ public static void main(String... args) {
+ tryInvoke(InvokerClass::invokeSubLevel2MethodOnSubClassOfInvokerClass);
+ }
+ }
+
+ /**
+ * This class is a stub class needed to compile the dependent Java classes. The actual
+ * implementation that will be used at runtime is generated by {@link InvokerClassDump}.
+ */
+ static class InvokerClass extends SubLevel2 {
+
+ public void invokeSuperMethodOnSubLevel2() {
+ stubIsUnreachable();
+ }
+
+ public void invokeSuperMethodOnSubLevel1() {
+ stubIsUnreachable();
+ }
+
+ public void invokeSuperMethodOnSuper() {
+ stubIsUnreachable();
+ }
+
+ public void invokeSubLevel1MethodOnSubLevel2() {
+ stubIsUnreachable();
+ }
+
+ public void invokeSubLevel1MethodOnSubLevel1() {
+ stubIsUnreachable();
+ }
+
+ public void invokeSubLevel1MethodOnSuper() {
+ stubIsUnreachable();
+ }
+
+ public void invokeSubLevel2MethodOnSubLevel2() {
+ stubIsUnreachable();
+ }
+
+ public void invokeSubLevel2MethodOnSubClassOfInvokerClass() {
+ stubIsUnreachable();
+ }
+
+ private static void stubIsUnreachable() {
+ throw new RuntimeException("Stub should never be called.");
+ }
+ }
+
+ // This modifies the above {@link InvokerClass} with invoke-special for the corresponding methods.
+ static class InvokerClassDump implements Opcodes {
+
+ public static byte[] dumpVerifying() throws Exception {
+ return dump(true);
+ }
+
+ public static byte[] dumpNonVerifying() throws Exception {
+ return dump(false);
+ }
+
+ static byte[] dump(boolean verifying) throws Exception {
+ return transformer(InvokerClass.class)
+ .addClassTransformer(
+ new ClassTransformer() {
+ @Override
+ public MethodVisitor visitMethod(
+ int access,
+ String name,
+ String descriptor,
+ String signature,
+ String[] exceptions) {
+ // Keep the constructor as is.
+ if (name.equals("<init>")) {
+ return super.visitMethod(access, name, descriptor, signature, exceptions);
+ }
+ // Remove all methods not in the form of invokeXonY.
+ if (!name.startsWith("invoke")) {
+ return null;
+ }
+ // If dumping valid methods drop the invoke on a subclass, otherwise drop all
+ // others.
+ if (verifying == name.equals("invokeSubLevel2MethodOnSubClassOfInvokerClass")) {
+ return null;
+ }
+ // Replace the body of invokeXonY methods by invoke of X on class Y.
+ MethodVisitor mv =
+ super.visitMethod(access, name, descriptor, signature, exceptions);
+ int split = name.indexOf("On");
+ assertTrue(split > 0);
+ String targetMethodRaw = name.substring("invoke".length(), split);
+ String targetMethod =
+ targetMethodRaw.substring(0, 1).toLowerCase() + targetMethodRaw.substring(1);
+ String targetHolderRaw = name.substring(split + 2);
+ String targetHolderType =
+ InvokeSuperTest.class.getTypeName() + "$" + targetHolderRaw;
+ String targetHolderName =
+ DescriptorUtils.getBinaryNameFromJavaType(targetHolderType);
+ mv.visitCode();
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitMethodInsn(INVOKESPECIAL, targetHolderName, targetMethod, "()V", false);
+ mv.visitInsn(RETURN);
+ mv.visitMaxs(1, 1);
+ mv.visitEnd();
+ return null;
+ }
+ })
+ .transform();
+ }
}
}
diff --git a/src/test/java/com/android/tools/r8/graph/invokesuper/Consumer.java b/src/test/java/com/android/tools/r8/graph/invokesuper/Consumer.java
deleted file mode 100644
index b323136..0000000
--- a/src/test/java/com/android/tools/r8/graph/invokesuper/Consumer.java
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright (c) 2017, 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.graph.invokesuper;
-
-/**
- * Copy of {@ref java.util.function.Consumer} to allow tests to run on early versions of art.
- */
-public interface Consumer<T> {
-
- void accept(T item);
-}
diff --git a/src/test/java/com/android/tools/r8/graph/invokesuper/InvokerClass.java b/src/test/java/com/android/tools/r8/graph/invokesuper/InvokerClass.java
deleted file mode 100644
index e0c9f93..0000000
--- a/src/test/java/com/android/tools/r8/graph/invokesuper/InvokerClass.java
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright (c) 2017, 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.graph.invokesuper;
-
-import com.android.tools.r8.errors.Unreachable;
-
-/**
- * This class is a stub class needed to compile the dependent Java classes. The actual
- * implementation that will be used at runtime is generated by {@link InvokerClassDump} and {@link
- * InvokerClassFailingDump}.
- */
-public class InvokerClass extends SubLevel2 {
-
- public void invokeSuperMethodOnSubLevel2() {
- stubIsUnreachable();
- }
-
- public void invokeSuperMethodOnSubLevel1() {
- stubIsUnreachable();
- }
-
- public void invokeSuperMethodOnSuper() {
- stubIsUnreachable();
- }
-
- public void invokeSubLevel1MethodOnSubLevel2() {
- stubIsUnreachable();
- }
-
- public void invokeSubLevel1MethodOnSubLevel1() {
- stubIsUnreachable();
- }
-
- public void invokeSubLevel1MethodOnSuper() {
- stubIsUnreachable();
- }
-
- public void invokeSubLevel2MethodOnSubLevel2() {
- stubIsUnreachable();
- }
-
- public void invokeSubLevel2MethodOnSubClassOfInvokerClass() {
- stubIsUnreachable();
- }
-
- private static void stubIsUnreachable() {
- throw new Unreachable("Stub should never be called.");
- }
-}
diff --git a/src/test/java/com/android/tools/r8/graph/invokesuper/InvokerClassDump.java b/src/test/java/com/android/tools/r8/graph/invokesuper/InvokerClassDump.java
deleted file mode 100644
index c01700d..0000000
--- a/src/test/java/com/android/tools/r8/graph/invokesuper/InvokerClassDump.java
+++ /dev/null
@@ -1,127 +0,0 @@
-// Copyright (c) 2017, 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.graph.invokesuper;
-
-import org.objectweb.asm.AnnotationVisitor;
-import org.objectweb.asm.ClassWriter;
-import org.objectweb.asm.FieldVisitor;
-import org.objectweb.asm.MethodVisitor;
-import org.objectweb.asm.Opcodes;
-
-/**
- * This is a modified version of {@link InvokerClass} with invoke special instructions corresponding
- * to the methods' names.
- */
-public class InvokerClassDump implements Opcodes {
-
- public static byte[] dump() throws Exception {
-
- ClassWriter cw = new ClassWriter(0);
- FieldVisitor fv;
- MethodVisitor mv;
- AnnotationVisitor av0;
-
- cw.visit(V1_8, ACC_PUBLIC + ACC_SUPER, "com/android/tools/r8/graph/invokesuper/InvokerClass",
- null, "com/android/tools/r8/graph/invokesuper/SubLevel2", null);
-
- {
- mv = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
- mv.visitCode();
- mv.visitVarInsn(ALOAD, 0);
- mv.visitMethodInsn(INVOKESPECIAL, "com/android/tools/r8/graph/invokesuper/SubLevel2",
- "<init>", "()V", false);
- mv.visitInsn(RETURN);
- mv.visitMaxs(1, 1);
- mv.visitEnd();
- }
- {
- mv = cw.visitMethod(ACC_PUBLIC, "invokeSuperMethodOnSubLevel2", "()V", null, null);
- mv.visitCode();
- mv.visitVarInsn(ALOAD, 0);
- mv.visitMethodInsn(INVOKESPECIAL, "com/android/tools/r8/graph/invokesuper/SubLevel2",
- "superMethod", "()V", false);
- mv.visitInsn(RETURN);
- mv.visitMaxs(1, 1);
- mv.visitEnd();
- }
- {
- mv = cw.visitMethod(ACC_PUBLIC, "invokeSuperMethodOnSubLevel1", "()V", null, null);
- mv.visitCode();
- mv.visitVarInsn(ALOAD, 0);
- mv.visitMethodInsn(INVOKESPECIAL, "com/android/tools/r8/graph/invokesuper/SubLevel1",
- "superMethod", "()V", false);
- mv.visitInsn(RETURN);
- mv.visitMaxs(1, 1);
- mv.visitEnd();
- }
- {
- mv = cw.visitMethod(ACC_PUBLIC, "invokeSuperMethodOnSuper", "()V", null, null);
- mv.visitCode();
- mv.visitVarInsn(ALOAD, 0);
- mv.visitMethodInsn(INVOKESPECIAL, "com/android/tools/r8/graph/invokesuper/Super",
- "superMethod", "()V", false);
- mv.visitInsn(RETURN);
- mv.visitMaxs(1, 1);
- mv.visitEnd();
- }
- {
- mv = cw.visitMethod(ACC_PUBLIC, "invokeSubLevel1MethodOnSubLevel2", "()V", null, null);
- mv.visitCode();
- mv.visitVarInsn(ALOAD, 0);
- mv.visitMethodInsn(INVOKESPECIAL, "com/android/tools/r8/graph/invokesuper/SubLevel2",
- "subLevel1Method", "()V", false);
- mv.visitInsn(RETURN);
- mv.visitMaxs(1, 1);
- mv.visitEnd();
- }
- {
- mv = cw.visitMethod(ACC_PUBLIC, "invokeSubLevel1MethodOnSubLevel1", "()V", null, null);
- mv.visitCode();
- mv.visitVarInsn(ALOAD, 0);
- mv.visitMethodInsn(INVOKESPECIAL, "com/android/tools/r8/graph/invokesuper/SubLevel1",
- "subLevel1Method", "()V", false);
- mv.visitInsn(RETURN);
- mv.visitMaxs(1, 1);
- mv.visitEnd();
- }
- {
- mv = cw.visitMethod(ACC_PUBLIC, "invokeSubLevel1MethodOnSuper", "()V", null, null);
- mv.visitCode();
- mv.visitVarInsn(ALOAD, 0);
- mv.visitMethodInsn(INVOKESPECIAL, "com/android/tools/r8/graph/invokesuper/Super",
- "subLevel1Method", "()V", false);
- mv.visitInsn(RETURN);
- mv.visitMaxs(1, 1);
- mv.visitEnd();
- }
- {
- mv = cw.visitMethod(ACC_PUBLIC, "invokeSubLevel2MethodOnSubLevel2", "()V", null, null);
- mv.visitCode();
- mv.visitVarInsn(ALOAD, 0);
- mv.visitMethodInsn(INVOKESPECIAL, "com/android/tools/r8/graph/invokesuper/SubLevel2",
- "subLevel2Method", "()V", false);
- mv.visitInsn(RETURN);
- mv.visitMaxs(1, 1);
- mv.visitEnd();
- }
- // The below fails to verify on the JavaVM, so we cannot test it there.
- // {
- // mv = cw.visitMethod(ACC_PUBLIC, "invokeSubLevel2MethodOnSubClassOfInvokerClass", "()V",
- // null,
- // null);
- // mv.visitCode();
- // mv.visitVarInsn(ALOAD, 0);
- // mv.visitMethodInsn(INVOKESPECIAL,
- // "com/android/tools/r8/graph/invokesuper/SubclassOfInvokerClass",
- // "subLevel2Method", "()V", false);
- // mv.visitInsn(RETURN);
- // mv.visitMaxs(1, 1);
- // mv.visitEnd();
- // }
- cw.visitEnd();
-
- return cw.toByteArray();
- }
-}
-
diff --git a/src/test/java/com/android/tools/r8/graph/invokesuper/InvokerClassFailingDump.java b/src/test/java/com/android/tools/r8/graph/invokesuper/InvokerClassFailingDump.java
deleted file mode 100644
index 18eebe4..0000000
--- a/src/test/java/com/android/tools/r8/graph/invokesuper/InvokerClassFailingDump.java
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright (c) 2017, 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.graph.invokesuper;
-
-import org.objectweb.asm.AnnotationVisitor;
-import org.objectweb.asm.ClassWriter;
-import org.objectweb.asm.FieldVisitor;
-import org.objectweb.asm.MethodVisitor;
-import org.objectweb.asm.Opcodes;
-
-/**
- /**
- * This is a modified version of {@link InvokerClass} with invoke special instructions corresponding
- * to the methods' names.
- * <p>
- * This class contains methods that do not verify on Java VMs.
- */
-public class InvokerClassFailingDump implements Opcodes {
-
- public static byte[] dump() throws Exception {
-
- ClassWriter cw = new ClassWriter(0);
- FieldVisitor fv;
- MethodVisitor mv;
- AnnotationVisitor av0;
-
- cw.visit(V1_8, ACC_PUBLIC + ACC_SUPER, "com/android/tools/r8/graph/invokesuper/InvokerClass",
- null, "com/android/tools/r8/graph/invokesuper/SubLevel2", null);
-
- {
- mv = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
- mv.visitCode();
- mv.visitVarInsn(ALOAD, 0);
- mv.visitMethodInsn(INVOKESPECIAL, "com/android/tools/r8/graph/invokesuper/SubLevel2",
- "<init>", "()V", false);
- mv.visitInsn(RETURN);
- mv.visitMaxs(1, 1);
- mv.visitEnd();
- }
- {
- mv = cw.visitMethod(ACC_PUBLIC, "invokeSubLevel2MethodOnSubClassOfInvokerClass", "()V", null,
- null);
- mv.visitCode();
- mv.visitVarInsn(ALOAD, 0);
- mv.visitMethodInsn(INVOKESPECIAL,
- "com/android/tools/r8/graph/invokesuper/SubclassOfInvokerClass",
- "subLevel2Method", "()V", false);
- mv.visitInsn(RETURN);
- mv.visitMaxs(1, 1);
- mv.visitEnd();
- }
- cw.visitEnd();
-
- return cw.toByteArray();
- }
-}
-
diff --git a/src/test/java/com/android/tools/r8/graph/invokesuper/MainClass.java b/src/test/java/com/android/tools/r8/graph/invokesuper/MainClass.java
deleted file mode 100644
index 80e4d09..0000000
--- a/src/test/java/com/android/tools/r8/graph/invokesuper/MainClass.java
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright (c) 2017, 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.graph.invokesuper;
-
-public class MainClass {
-
- private static void tryInvoke(Consumer<InvokerClass> function) {
- InvokerClass invoker = new InvokerClass();
- try {
- function.accept(invoker);
- } catch (Throwable e) {
- System.out.println(e.getClass().getCanonicalName());
- }
- }
-
- public static void main(String... args) {
- tryInvoke(InvokerClass::invokeSuperMethodOnSuper);
- tryInvoke(InvokerClass::invokeSuperMethodOnSubLevel1);
- tryInvoke(InvokerClass::invokeSuperMethodOnSubLevel2);
- tryInvoke(InvokerClass::invokeSubLevel1MethodOnSuper);
- tryInvoke(InvokerClass::invokeSubLevel1MethodOnSubLevel1);
- tryInvoke(InvokerClass::invokeSubLevel1MethodOnSubLevel2);
- tryInvoke(InvokerClass::invokeSubLevel2MethodOnSubLevel2);
- tryInvoke(InvokerClass::callOtherSuperMethodIndirect);
- }
-}
diff --git a/src/test/java/com/android/tools/r8/graph/invokesuper/MainClassFailing.java b/src/test/java/com/android/tools/r8/graph/invokesuper/MainClassFailing.java
deleted file mode 100644
index c662ff3..0000000
--- a/src/test/java/com/android/tools/r8/graph/invokesuper/MainClassFailing.java
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright (c) 2017, 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.graph.invokesuper;
-
-import java.util.function.Consumer;
-
-public class MainClassFailing {
-
- private static void tryInvoke(Consumer<InvokerClass> function) {
- InvokerClass invoker = new InvokerClass();
- try {
- function.accept(invoker);
- } catch (Throwable e) {
- System.out.println(e.getClass().getCanonicalName());
- }
- }
-
- public static void main(String... args) {
- tryInvoke(InvokerClass::invokeSubLevel2MethodOnSubClassOfInvokerClass);
- }
-}
diff --git a/src/test/java/com/android/tools/r8/graph/invokesuper/SubLevel1.java b/src/test/java/com/android/tools/r8/graph/invokesuper/SubLevel1.java
deleted file mode 100644
index 50fa633..0000000
--- a/src/test/java/com/android/tools/r8/graph/invokesuper/SubLevel1.java
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright (c) 2017, 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.graph.invokesuper;
-
-public class SubLevel1 extends Super {
-
- @Override
- public void superMethod() {
- System.out.println("superMethod in SubLevel1");
- }
-
- public void subLevel1Method() {
- System.out.println("subLevel1Method in SubLevel1");
- }
-
- public void otherSuperMethod() {
- System.out.println("otherSuperMethod in SubLevel1");
- }
-
- public void callOtherSuperMethod() {
- System.out.print("From SubLevel1: ");
- super.otherSuperMethod();
- }
-}
diff --git a/src/test/java/com/android/tools/r8/graph/invokesuper/SubLevel2.java b/src/test/java/com/android/tools/r8/graph/invokesuper/SubLevel2.java
deleted file mode 100644
index 9cb04ec..0000000
--- a/src/test/java/com/android/tools/r8/graph/invokesuper/SubLevel2.java
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright (c) 2017, 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.graph.invokesuper;
-
-public class SubLevel2 extends SubLevel1 {
-
- @Override
- public void superMethod() {
- System.out.println("superMethod in SubLevel2");
- }
-
- @Override
- public void subLevel1Method() {
- System.out.println("subLevel1Method in SubLevel2");
- }
-
- public void subLevel2Method() {
- System.out.println("subLevel2Method in SubLevel2");
- }
-
- public void otherSuperMethod() {
- System.out.println("otherSuperMethod in SubLevel2");
- }
-
- public void callOtherSuperMethodIndirect() {
- callOtherSuperMethod();
- }
-}
diff --git a/src/test/java/com/android/tools/r8/graph/invokesuper/SubclassOfInvokerClass.java b/src/test/java/com/android/tools/r8/graph/invokesuper/SubclassOfInvokerClass.java
deleted file mode 100644
index 77d6aab..0000000
--- a/src/test/java/com/android/tools/r8/graph/invokesuper/SubclassOfInvokerClass.java
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright (c) 2017, 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.graph.invokesuper;
-
-public class SubclassOfInvokerClass extends InvokerClass {
-
- public void subLevel2Method() {
- System.out.println("subLevel2Method in SubclassOfInvokerClass");
- }
-}
diff --git a/src/test/java/com/android/tools/r8/graph/invokesuper/Super.java b/src/test/java/com/android/tools/r8/graph/invokesuper/Super.java
deleted file mode 100644
index 51596fe..0000000
--- a/src/test/java/com/android/tools/r8/graph/invokesuper/Super.java
+++ /dev/null
@@ -1,15 +0,0 @@
-// Copyright (c) 2017, 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.graph.invokesuper;
-
-public class Super {
-
- public void superMethod() {
- System.out.println("superMethod in Super");
- }
-
- public void otherSuperMethod() {
- System.out.println("otherSuperMethod in Super");
- }
-}
diff --git a/src/test/java/com/android/tools/r8/naming/MinifierClassSignatureTest.java b/src/test/java/com/android/tools/r8/naming/MinifierClassSignatureTest.java
index a97372e..bcb02da 100644
--- a/src/test/java/com/android/tools/r8/naming/MinifierClassSignatureTest.java
+++ b/src/test/java/com/android/tools/r8/naming/MinifierClassSignatureTest.java
@@ -25,12 +25,12 @@
import com.android.tools.r8.StringConsumer;
import com.android.tools.r8.TestBase;
import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.graph.invokesuper.Consumer;
import com.android.tools.r8.origin.Origin;
import com.android.tools.r8.utils.codeinspector.ClassSubject;
import com.android.tools.r8.utils.codeinspector.CodeInspector;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
+import java.util.function.Consumer;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
diff --git a/src/test/java/com/android/tools/r8/naming/MinifierFieldSignatureTest.java b/src/test/java/com/android/tools/r8/naming/MinifierFieldSignatureTest.java
index 5c01601..5737496 100644
--- a/src/test/java/com/android/tools/r8/naming/MinifierFieldSignatureTest.java
+++ b/src/test/java/com/android/tools/r8/naming/MinifierFieldSignatureTest.java
@@ -26,7 +26,6 @@
import com.android.tools.r8.StringConsumer;
import com.android.tools.r8.TestBase;
import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.graph.invokesuper.Consumer;
import com.android.tools.r8.origin.Origin;
import com.android.tools.r8.utils.codeinspector.ClassSubject;
import com.android.tools.r8.utils.codeinspector.CodeInspector;
@@ -34,6 +33,7 @@
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import java.util.Map;
+import java.util.function.Consumer;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
diff --git a/src/test/java/com/android/tools/r8/naming/MinifierMethodSignatureTest.java b/src/test/java/com/android/tools/r8/naming/MinifierMethodSignatureTest.java
index dda4a3a..b19ed16 100644
--- a/src/test/java/com/android/tools/r8/naming/MinifierMethodSignatureTest.java
+++ b/src/test/java/com/android/tools/r8/naming/MinifierMethodSignatureTest.java
@@ -29,7 +29,6 @@
import com.android.tools.r8.StringConsumer;
import com.android.tools.r8.TestBase;
import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.graph.invokesuper.Consumer;
import com.android.tools.r8.origin.Origin;
import com.android.tools.r8.utils.codeinspector.ClassSubject;
import com.android.tools.r8.utils.codeinspector.CodeInspector;
@@ -37,6 +36,7 @@
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import java.util.Map;
+import java.util.function.Consumer;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
diff --git a/src/test/java/com/android/tools/r8/shaking/defaultmethods/DefaultMethodsTest.java b/src/test/java/com/android/tools/r8/shaking/defaultmethods/DefaultMethodsTest.java
index 3cd46e12..eebb7d5 100644
--- a/src/test/java/com/android/tools/r8/shaking/defaultmethods/DefaultMethodsTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/defaultmethods/DefaultMethodsTest.java
@@ -12,7 +12,6 @@
import com.android.tools.r8.R8Command;
import com.android.tools.r8.TestBase;
import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.graph.invokesuper.Consumer;
import com.android.tools.r8.origin.Origin;
import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.AndroidApp;
@@ -21,6 +20,7 @@
import com.android.tools.r8.utils.codeinspector.MethodSubject;
import com.google.common.collect.ImmutableList;
import java.util.List;
+import java.util.function.Consumer;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
diff --git a/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/ForceProguardCompatibilityTest.java b/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/ForceProguardCompatibilityTest.java
index 48c6dea..ee8629f 100644
--- a/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/ForceProguardCompatibilityTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/ForceProguardCompatibilityTest.java
@@ -18,7 +18,6 @@
import com.android.tools.r8.TestBase;
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.graph.invokesuper.Consumer;
import com.android.tools.r8.naming.MemberNaming.MethodSignature;
import com.android.tools.r8.shaking.ProguardKeepAttributes;
import com.android.tools.r8.shaking.forceproguardcompatibility.TestMain.MentionedClass;
@@ -40,6 +39,7 @@
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
+import java.util.function.Consumer;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
diff --git a/src/test/java/com/android/tools/r8/shaking/keepclassmembers/b115867670/B115867670.java b/src/test/java/com/android/tools/r8/shaking/keepclassmembers/b115867670/B115867670.java
index 8f19ef8..f2f6731 100644
--- a/src/test/java/com/android/tools/r8/shaking/keepclassmembers/b115867670/B115867670.java
+++ b/src/test/java/com/android/tools/r8/shaking/keepclassmembers/b115867670/B115867670.java
@@ -11,13 +11,13 @@
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
-import com.android.tools.r8.graph.invokesuper.Consumer;
import com.android.tools.r8.shaking.forceproguardcompatibility.ProguardCompatibilityTestBase;
import com.android.tools.r8.utils.codeinspector.ClassSubject;
import com.android.tools.r8.utils.codeinspector.CodeInspector;
import com.google.common.collect.ImmutableList;
import java.util.Collection;
import java.util.List;
+import java.util.function.Consumer;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
diff --git a/src/test/java/com/android/tools/r8/utils/graphinspector/GraphInspector.java b/src/test/java/com/android/tools/r8/utils/graphinspector/GraphInspector.java
index 59376e6..fe98a17 100644
--- a/src/test/java/com/android/tools/r8/utils/graphinspector/GraphInspector.java
+++ b/src/test/java/com/android/tools/r8/utils/graphinspector/GraphInspector.java
@@ -18,7 +18,6 @@
import com.android.tools.r8.experimental.graphinfo.GraphNode;
import com.android.tools.r8.experimental.graphinfo.KeepRuleGraphNode;
import com.android.tools.r8.experimental.graphinfo.MethodGraphNode;
-import com.android.tools.r8.graph.invokesuper.Consumer;
import com.android.tools.r8.origin.Origin;
import com.android.tools.r8.position.Position;
import com.android.tools.r8.position.TextPosition;
@@ -38,6 +37,7 @@
import java.util.Map.Entry;
import java.util.Set;
import java.util.function.BiPredicate;
+import java.util.function.Consumer;
import java.util.function.Predicate;
import java.util.stream.Stream;
import org.junit.Assert;