| // 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.debug; | |
| import com.android.tools.r8.debug.DebugTestBase.JUnit3Wrapper.Command; | |
| import java.util.ArrayList; | |
| import java.util.List; | |
| import org.junit.BeforeClass; | |
| import org.junit.Test; | |
| public class SyntheticMethodTest extends DebugTestBase { | |
| private static DebugTestConfig config; | |
| @BeforeClass | |
| public static void setup() { | |
| config = new D8DebugTestResourcesConfig(temp); | |
| } | |
| @Test | |
| public void testInnerAccessors_NoFilter() throws Throwable { | |
| debugInnerAccessors(NO_FILTER); | |
| } | |
| @Test | |
| public void testInnerAccessors_IntelliJ() throws Throwable { | |
| debugInnerAccessors(INTELLIJ_FILTER); | |
| } | |
| @Test | |
| public void testGenericBridges_NoFilter() throws Throwable { | |
| debugGenericBridges(NO_FILTER); | |
| } | |
| @Test | |
| public void testGenericBridges_IntelliJ() throws Throwable { | |
| debugGenericBridges(INTELLIJ_FILTER); | |
| } | |
| private void debugInnerAccessors(StepFilter stepFilter) throws Throwable { | |
| final String sourceFile = "InnerAccessors.java"; | |
| String debuggeeClass = "InnerAccessors"; | |
| List<Command> commands = new ArrayList<>(); | |
| commands.add(breakpoint("InnerAccessors$Inner", "callPrivateMethodInOuterClass")); | |
| commands.add(run()); | |
| commands.add(checkLine(sourceFile, 13)); | |
| commands.add(stepInto(stepFilter)); // skip synthetic accessor | |
| if (stepFilter == NO_FILTER) { | |
| commands.add(stepInto(stepFilter)); | |
| } | |
| commands.add(checkMethod(debuggeeClass, "privateMethod")); | |
| commands.add(checkLine(sourceFile, 8)); | |
| commands.add(run()); | |
| runDebugTest(config, debuggeeClass, commands); | |
| } | |
| private void debugGenericBridges(StepFilter stepFilter) throws Throwable { | |
| final String sourceFile = "Bridges.java"; | |
| String debuggeeClass = "Bridges"; | |
| List<Command> commands = new ArrayList<>(); | |
| commands.add(breakpoint(debuggeeClass, "testGenericBridge")); | |
| commands.add(run()); | |
| commands.add(checkLine(sourceFile, 21)); | |
| commands.add(stepInto(stepFilter)); // skip synthetic accessor | |
| String implementationClassName = "Bridges$StringImpl"; | |
| String methodName = "get"; | |
| if (stepFilter == NO_FILTER) { | |
| commands.add(checkMethod(implementationClassName, methodName, "(Ljava/lang/Object;)V")); | |
| commands.add(stepInto(stepFilter)); | |
| } | |
| commands.add(checkMethod(implementationClassName, methodName, "(Ljava/lang/String;)V")); | |
| commands.add(checkLine(sourceFile, 16)); | |
| commands.add(run()); | |
| runDebugTest(config, debuggeeClass, commands); | |
| } | |
| } |