diff options
author | Liam Miller-Cushon <cushon@google.com> | 2016-02-17 19:04:46 +0000 |
---|---|---|
committer | Kristina Chodorow <kchodorow@google.com> | 2016-02-17 19:41:13 +0000 |
commit | 3337e6572f702513c889332242fdfdb8fcc416fc (patch) | |
tree | 678e0067bb4dc492fdcf359b8817c952a608d3a5 /src | |
parent | 04b305fd7e615305f1ba44db1e9c77d3cd0ed2ca (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')
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(); } |