aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/java_tools/buildjar/java/com
diff options
context:
space:
mode:
authorGravatar Liam Miller-Cushon <cushon@google.com>2016-02-29 22:24:27 +0000
committerGravatar Kristina Chodorow <kchodorow@google.com>2016-03-01 19:13:20 +0000
commit46b89b245478ab92ea124e769038f04e2fd0b998 (patch)
tree1863d65d635c91cbb53dadf5f5904e78d81eeb90 /src/java_tools/buildjar/java/com
parentcfef209f9c6d09265b681af513f3a4686589078a (diff)
Fix pruning of implicitly final fields
-- MOS_MIGRATED_REVID=115902893
Diffstat (limited to 'src/java_tools/buildjar/java/com')
-rw-r--r--src/java_tools/buildjar/java/com/google/devtools/build/java/turbine/javac/TreePruner.java31
1 files changed, 22 insertions, 9 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 ec4cbf5b37..b25d4e79ea 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
@@ -68,15 +68,17 @@ public class TreePruner {
private static final TreeScanner PRUNING_VISITOR =
new TreeScanner() {
+ JCClassDecl enclClass = null;
+
@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;
+ JCClassDecl prev = enclClass;
+ enclClass = tree;
+ try {
+ super.visitClassDef(tree);
+ } finally {
+ enclClass = prev;
}
- super.visitClassDef(tree);
}
@Override
@@ -105,7 +107,7 @@ public class TreePruner {
return;
}
// drop field initializers unless the field looks like a JLS ยง4.12.4 constant variable
- if (isConstantVariable(tree)) {
+ if (isConstantVariable(enclClass, tree)) {
return;
}
tree.init = null;
@@ -132,8 +134,19 @@ public class TreePruner {
return name.contentEquals("this") || name.contentEquals("super");
}
- private static boolean isConstantVariable(JCVariableDecl tree) {
- if ((tree.mods.flags & Flags.FINAL) != Flags.FINAL) {
+ private static boolean isFinal(JCClassDecl enclClass, JCVariableDecl tree) {
+ if ((tree.mods.flags & Flags.FINAL) == Flags.FINAL) {
+ return true;
+ }
+ if (enclClass != null && (enclClass.mods.flags & (Flags.ANNOTATION | Flags.INTERFACE)) != 0) {
+ // Fields in annotation declarations and interfaces are implicitly final
+ return true;
+ }
+ return false;
+ }
+
+ private static boolean isConstantVariable(JCClassDecl enclClass, JCVariableDecl tree) {
+ if (!isFinal(enclClass, tree)) {
return false;
}
if (!constantType(tree.getType())) {