blob: 35d802c2ef5eb2d85e65e17552b60f0aae7d95e9 [file] [log] [blame]
// 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.shaking.ifrule;
import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
import static com.android.tools.r8.utils.codeinspector.Matchers.isRenamed;
import static org.hamcrest.MatcherAssert.assertThat;
import com.android.tools.r8.TestBase;
import com.android.tools.r8.utils.StringUtils;
import com.android.tools.r8.utils.codeinspector.ClassSubject;
import com.android.tools.r8.utils.codeinspector.CodeInspector;
import java.lang.reflect.Proxy;
import org.junit.Test;
public class IfOnTargetedMethodTest extends TestBase {
@Test
public void test() throws Exception {
String expectedOutput = StringUtils.lines("Hello world!");
testForJvm().addTestClasspath().run(TestClass.class).assertSuccessWithOutput(expectedOutput);
CodeInspector inspector =
testForR8(Backend.DEX)
.addInnerClasses(IfOnTargetedMethodTest.class)
.addKeepMainRule(TestClass.class)
.addKeepRules(
"-if interface * { @" + MyAnnotation.class.getTypeName() + " <methods>; }",
"-keep,allowobfuscation interface <1>")
.run(TestClass.class)
.assertSuccessWithOutput(expectedOutput)
.inspector();
ClassSubject interfaceSubject = inspector.clazz(Interface.class);
assertThat(interfaceSubject, isPresent());
assertThat(interfaceSubject, isRenamed());
}
static class TestClass {
public static void main(String[] args) {
Interface obj = getInstance();
obj.method();
}
static Interface getInstance() {
return (Interface)
Proxy.newProxyInstance(
Interface.class.getClassLoader(),
new Class[] {Interface.class},
(o, method, objects) -> {
System.out.println("Hello world!");
return null;
});
}
}
interface Interface {
@MyAnnotation
void method();
}
@interface MyAnnotation {}
}