aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar Liam Miller-Cushon <cushon@google.com>2016-02-17 19:04:46 +0000
committerGravatar Kristina Chodorow <kchodorow@google.com>2016-02-17 19:41:13 +0000
commit3337e6572f702513c889332242fdfdb8fcc416fc (patch)
tree678e0067bb4dc492fdcf359b8817c952a608d3a5 /src
parent04b305fd7e615305f1ba44db1e9c77d3cd0ed2ca (diff)
Fix pruning of annotation declaration fields
Fields in annotation declarations are implicitly final, so are candidates for constant variables. -- MOS_MIGRATED_REVID=114878247
Diffstat (limited to 'src')
-rw-r--r--src/java_tools/buildjar/java/com/google/devtools/build/java/turbine/javac/TreePruner.java12
-rw-r--r--src/java_tools/buildjar/javatests/com/google/devtools/build/java/turbine/javac/JavacTurbineTest.java37
-rw-r--r--src/java_tools/buildjar/javatests/com/google/devtools/build/java/turbine/javac/TreePrunerTest.java22
3 files changed, 71 insertions, 0 deletions
diff --git a/src/java_tools/buildjar/java/com/google/devtools/build/java/turbine/javac/TreePruner.java b/src/java_tools/buildjar/java/com/google/devtools/build/java/turbine/javac/TreePruner.java
index 092b82b9ba..ec4cbf5b37 100644
--- a/src/java_tools/buildjar/java/com/google/devtools/build/java/turbine/javac/TreePruner.java
+++ b/src/java_tools/buildjar/java/com/google/devtools/build/java/turbine/javac/TreePruner.java
@@ -29,6 +29,7 @@ import com.sun.source.util.SimpleTreeVisitor;
import com.sun.tools.javac.code.Flags;
import com.sun.tools.javac.tree.JCTree;
import com.sun.tools.javac.tree.JCTree.JCBlock;
+import com.sun.tools.javac.tree.JCTree.JCClassDecl;
import com.sun.tools.javac.tree.JCTree.JCExpression;
import com.sun.tools.javac.tree.JCTree.JCExpressionStatement;
import com.sun.tools.javac.tree.JCTree.JCIdent;
@@ -68,6 +69,17 @@ public class TreePruner {
new TreeScanner() {
@Override
+ public void visitClassDef(JCClassDecl tree) {
+ if ((tree.mods.flags & Flags.ANNOTATION) == Flags.ANNOTATION) {
+ // Fields in annotation declarations are implicitly final.
+ // Field initializers that are definitely not constant expressions could still be
+ // pruned, but we currently don't bother.
+ return;
+ }
+ super.visitClassDef(tree);
+ }
+
+ @Override
public void visitMethodDef(JCMethodDecl tree) {
if (tree.body == null) {
return;
diff --git a/src/java_tools/buildjar/javatests/com/google/devtools/build/java/turbine/javac/JavacTurbineTest.java b/src/java_tools/buildjar/javatests/com/google/devtools/build/java/turbine/javac/JavacTurbineTest.java
index c01f5d0f0b..c9d49e08ee 100644
--- a/src/java_tools/buildjar/javatests/com/google/devtools/build/java/turbine/javac/JavacTurbineTest.java
+++ b/src/java_tools/buildjar/javatests/com/google/devtools/build/java/turbine/javac/JavacTurbineTest.java
@@ -861,4 +861,41 @@ public class JavacTurbineTest {
};
assertThat(text).isEqualTo(Joiner.on('\n').join(expected));
}
+
+ @Test
+ public void annotationDeclaration() throws Exception {
+ addSourceLines(
+ "Anno.java",
+ "import java.lang.annotation.Retention;",
+ "import java.lang.annotation.RetentionPolicy;",
+ "@Retention(RetentionPolicy.RUNTIME)",
+ "@interface Anno {",
+ " public int value() default CONST;",
+ " int CONST = 42;",
+ " int NONCONST = new Integer(42);",
+ "}");
+ addSourceLines("Hello.java", "@Anno(value=Anno.CONST)", "class Hello {", "}");
+
+ compile();
+
+ Map<String, byte[]> outputs = collectOutputs();
+
+ assertThat(outputs.keySet()).containsExactly("Anno.class", "Hello.class");
+
+ String text = textify(outputs.get("Hello.class"));
+ String[] expected = {
+ "// class version 51.0 (51)",
+ "// access flags 0x20",
+ "class Hello {",
+ "",
+ "",
+ " @LAnno;(value=42)",
+ "",
+ " // access flags 0x0",
+ " <init>()V",
+ "}",
+ ""
+ };
+ assertThat(text).isEqualTo(Joiner.on('\n').join(expected));
+ }
}
diff --git a/src/java_tools/buildjar/javatests/com/google/devtools/build/java/turbine/javac/TreePrunerTest.java b/src/java_tools/buildjar/javatests/com/google/devtools/build/java/turbine/javac/TreePrunerTest.java
index 711b5524cf..ccf0e33ba0 100644
--- a/src/java_tools/buildjar/javatests/com/google/devtools/build/java/turbine/javac/TreePrunerTest.java
+++ b/src/java_tools/buildjar/javatests/com/google/devtools/build/java/turbine/javac/TreePrunerTest.java
@@ -261,6 +261,28 @@ public class TreePrunerTest {
assertThat(prettyPrint(tree)).isEqualTo(Joiner.on('\n').join(expected));
}
+ @Test
+ public void annotationDeclaration() {
+ String[] lines = {
+ "@interface Anno {",
+ " int f() default CONST;",
+ " int CONST = 42;",
+ " int NONCONST = new Integer(42);",
+ "}",
+ };
+ JCCompilationUnit tree = parseLines(lines);
+ TreePruner.prune(tree);
+ String[] expected = {
+ "@interface Anno {",
+ " ",
+ " int f() default CONST;",
+ " int CONST = 42;",
+ " int NONCONST = new Integer(42);",
+ "}",
+ };
+ assertThat(prettyPrint(tree)).isEqualTo(Joiner.on('\n').join(expected));
+ }
+
private String prettyPrint(JCCompilationUnit tree) {
return tree.toString().trim();
}