diff options
author | 2016-02-29 22:24:27 +0000 | |
---|---|---|
committer | 2016-03-01 19:13:20 +0000 | |
commit | 46b89b245478ab92ea124e769038f04e2fd0b998 (patch) | |
tree | 1863d65d635c91cbb53dadf5f5904e78d81eeb90 /src/java_tools/buildjar/java/com | |
parent | cfef209f9c6d09265b681af513f3a4686589078a (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.java | 31 |
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())) { |