1.1 --- a/src/share/classes/com/sun/tools/javadoc/JavadocMemberEnter.java Wed Aug 28 10:17:23 2013 -0700 1.2 +++ b/src/share/classes/com/sun/tools/javadoc/JavadocMemberEnter.java Wed Aug 28 15:40:33 2013 -0700 1.3 @@ -30,9 +30,12 @@ 1.4 import com.sun.tools.javac.code.Kinds; 1.5 import com.sun.tools.javac.code.Symbol.*; 1.6 import com.sun.tools.javac.comp.MemberEnter; 1.7 +import com.sun.tools.javac.tree.JCTree; 1.8 import com.sun.tools.javac.tree.JCTree.*; 1.9 import com.sun.tools.javac.util.Context; 1.10 1.11 +import static com.sun.tools.javac.code.Flags.*; 1.12 + 1.13 /** 1.14 * Javadoc's own memberEnter phase does a few things above and beyond that 1.15 * done by javac. 1.16 @@ -86,6 +89,17 @@ 1.17 1.18 @Override 1.19 public void visitVarDef(JCVariableDecl tree) { 1.20 + if (tree.init != null) { 1.21 + boolean isFinal = (tree.mods.flags & FINAL) != 0 1.22 + || (env.enclClass.mods.flags & INTERFACE) != 0; 1.23 + if (!isFinal || containsNonConstantExpression(tree.init)) { 1.24 + // Avoid unnecessary analysis and release resources. 1.25 + // In particular, remove non-constant expressions 1.26 + // which may trigger Attr.attribClass, since 1.27 + // method bodies are also removed, in visitMethodDef. 1.28 + tree.init = null; 1.29 + } 1.30 + } 1.31 super.visitVarDef(tree); 1.32 if (tree.sym != null && 1.33 tree.sym.kind == Kinds.VAR && 1.34 @@ -101,4 +115,95 @@ 1.35 private static boolean isParameter(VarSymbol var) { 1.36 return (var.flags() & Flags.PARAMETER) != 0; 1.37 } 1.38 + 1.39 + /** 1.40 + * Simple analysis of an expression tree to see if it contains tree nodes 1.41 + * for any non-constant expression. This does not include checking references 1.42 + * to other fields which may or may not be constant. 1.43 + */ 1.44 + private static boolean containsNonConstantExpression(JCExpression tree) { 1.45 + return new MaybeConstantExpressionScanner().containsNonConstantExpression(tree); 1.46 + } 1.47 + 1.48 + /** 1.49 + * See JLS 15.18, Constant Expression 1.50 + */ 1.51 + private static class MaybeConstantExpressionScanner extends JCTree.Visitor { 1.52 + boolean maybeConstantExpr = true; 1.53 + 1.54 + public boolean containsNonConstantExpression(JCExpression tree) { 1.55 + scan(tree); 1.56 + return !maybeConstantExpr; 1.57 + } 1.58 + 1.59 + public void scan(JCTree tree) { 1.60 + // short circuit scan when end result is definitely false 1.61 + if (maybeConstantExpr && tree != null) 1.62 + tree.accept(this); 1.63 + } 1.64 + 1.65 + @Override 1.66 + /** default for any non-overridden visit method. */ 1.67 + public void visitTree(JCTree tree) { 1.68 + maybeConstantExpr = false; 1.69 + } 1.70 + 1.71 + @Override 1.72 + public void visitBinary(JCBinary tree) { 1.73 + switch (tree.getTag()) { 1.74 + case MUL: case DIV: case MOD: 1.75 + case PLUS: case MINUS: 1.76 + case SL: case SR: case USR: 1.77 + case LT: case LE: case GT: case GE: 1.78 + case EQ: case NE: 1.79 + case BITAND: case BITXOR: case BITOR: 1.80 + case AND: case OR: 1.81 + break; 1.82 + default: 1.83 + maybeConstantExpr = false; 1.84 + } 1.85 + } 1.86 + 1.87 + @Override 1.88 + public void visitConditional(JCConditional tree) { 1.89 + scan(tree.cond); 1.90 + scan(tree.truepart); 1.91 + scan(tree.falsepart); 1.92 + } 1.93 + 1.94 + @Override 1.95 + public void visitIdent(JCIdent tree) { } 1.96 + 1.97 + @Override 1.98 + public void visitLiteral(JCLiteral tree) { } 1.99 + 1.100 + @Override 1.101 + public void visitParens(JCParens tree) { 1.102 + scan(tree.expr); 1.103 + } 1.104 + 1.105 + @Override 1.106 + public void visitSelect(JCTree.JCFieldAccess tree) { 1.107 + scan(tree.selected); 1.108 + } 1.109 + 1.110 + @Override 1.111 + public void visitTypeCast(JCTypeCast tree) { 1.112 + scan(tree.clazz); 1.113 + scan(tree.expr); 1.114 + } 1.115 + 1.116 + @Override 1.117 + public void visitTypeIdent(JCPrimitiveTypeTree tree) { } 1.118 + 1.119 + @Override 1.120 + public void visitUnary(JCUnary tree) { 1.121 + switch (tree.getTag()) { 1.122 + case POS: case NEG: case COMPL: case NOT: 1.123 + break; 1.124 + default: 1.125 + maybeConstantExpr = false; 1.126 + } 1.127 + } 1.128 + } 1.129 }