Unset ACC_ANNOTATION flag for companion class
When generation companion class for annotation,
unset the ACC_ANNOTATION interface.
Test: AnnotationCompanionClassTest
Change-Id: I3eb91b898e03bf292a273ab27e61737eaf8c680e
diff --git a/src/main/java/com/android/tools/r8/graph/ClassAccessFlags.java b/src/main/java/com/android/tools/r8/graph/ClassAccessFlags.java
index f587642..0111aa1 100644
--- a/src/main/java/com/android/tools/r8/graph/ClassAccessFlags.java
+++ b/src/main/java/com/android/tools/r8/graph/ClassAccessFlags.java
@@ -141,6 +141,10 @@
set(Constants.ACC_ANNOTATION);
}
+ public void unsetAnnotation() {
+ unset(Constants.ACC_ANNOTATION);
+ }
+
public boolean isEnum() {
return isSet(Constants.ACC_ENUM);
}
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/InterfaceProcessor.java b/src/main/java/com/android/tools/r8/ir/desugar/InterfaceProcessor.java
index 15a90e9..898a2b2 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/InterfaceProcessor.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/InterfaceProcessor.java
@@ -151,6 +151,7 @@
ClassAccessFlags companionClassFlags = iface.accessFlags.copy();
companionClassFlags.unsetAbstract();
companionClassFlags.unsetInterface();
+ companionClassFlags.unsetAnnotation();
companionClassFlags.setFinal();
companionClassFlags.setSynthetic();
// Companion class must be public so moved methods can be called from anywhere.
diff --git a/src/test/java/com/android/tools/r8/jasmin/AnnotationCompanionClassTest.java b/src/test/java/com/android/tools/r8/jasmin/AnnotationCompanionClassTest.java
new file mode 100644
index 0000000..033183c
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/jasmin/AnnotationCompanionClassTest.java
@@ -0,0 +1,42 @@
+// 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.jasmin;
+
+import static org.junit.Assert.assertFalse;
+
+import com.android.tools.r8.ir.desugar.InterfaceMethodRewriter;
+import com.android.tools.r8.utils.AndroidApp;
+import com.android.tools.r8.utils.DexInspector;
+import com.google.common.collect.ImmutableList;
+import org.junit.Test;
+
+public class AnnotationCompanionClassTest extends JasminTestBase {
+
+ private JasminBuilder buildClass() {
+ JasminBuilder builder = new JasminBuilder(JasminBuilder.ClassFileVersion.JDK_1_4);
+ JasminBuilder.ClassBuilder clazz =
+ builder.addInterface("MyAnnotation", "java/lang/annotation/Annotation");
+
+ clazz.setAccess("public interface abstract annotation");
+
+ clazz.addStaticMethod(
+ "staticMethod", ImmutableList.of(), "V",
+ ".limit stack 0",
+ ".limit locals 0",
+ " return");
+ return builder;
+ }
+
+ @Test
+ public void test() throws Exception {
+ JasminBuilder builder = buildClass();
+ AndroidApp androidApp = compileWithD8(builder);
+
+ DexInspector dexInspector = new DexInspector(androidApp);
+ assertFalse(
+ dexInspector
+ .clazz("LMyAnnotation" + InterfaceMethodRewriter.COMPANION_CLASS_NAME_SUFFIX + ";")
+ .isAnnotation());
+ }
+}
diff --git a/src/test/java/com/android/tools/r8/utils/DexInspector.java b/src/test/java/com/android/tools/r8/utils/DexInspector.java
index af460ef..0cea762 100644
--- a/src/test/java/com/android/tools/r8/utils/DexInspector.java
+++ b/src/test/java/com/android/tools/r8/utils/DexInspector.java
@@ -329,6 +329,8 @@
public abstract boolean isAbstract();
+ public abstract boolean isAnnotation();
+
public String dumpMethods() {
StringBuilder dump = new StringBuilder();
forAllMethods((FoundMethodSubject method) ->
@@ -385,6 +387,11 @@
}
@Override
+ public boolean isAnnotation() {
+ return false;
+ }
+
+ @Override
public DexClass getDexClass() {
return null;
}
@@ -516,6 +523,11 @@
return dexClass.accessFlags.isAbstract();
}
+ @Override
+ public boolean isAnnotation() {
+ return dexClass.accessFlags.isAnnotation();
+ }
+
private DexEncodedField findField(DexEncodedField[] fields, DexField dexField) {
for (DexEncodedField field : fields) {
if (field.field.equals(dexField)) {