From 3b921ad7f6a485287ae62e64d0f4a2859683732a Mon Sep 17 00:00:00 2001 From: Reinier Zwitserloot Date: Sun, 20 Nov 2011 17:23:33 +0100 Subject: Fix for issue 299: labels would break 'val' in javac. --- src/core/lombok/javac/JavacResolution.java | 5 +++++ src/utils/lombok/javac/TreeMirrorMaker.java | 17 +++++++++++++++++ 2 files changed, 22 insertions(+) (limited to 'src') diff --git a/src/core/lombok/javac/JavacResolution.java b/src/core/lombok/javac/JavacResolution.java index e0d56b85..29f261c6 100644 --- a/src/core/lombok/javac/JavacResolution.java +++ b/src/core/lombok/javac/JavacResolution.java @@ -221,6 +221,11 @@ public class JavacResolution { } } + /* + * We need to dig down to the level of the method or field declaration or (static) initializer block, then attribute that entire method/field/block using + * the appropriate environment. So, we start from the top and walk down the node tree until we hit that method/field/block and stop there, recording both + * the environment object (`env`) and the exact tree node (`copyAt`) at which to begin the attr process. + */ private static final class EnvFinder extends JCTree.Visitor { private Env env = null; private Enter enter; diff --git a/src/utils/lombok/javac/TreeMirrorMaker.java b/src/utils/lombok/javac/TreeMirrorMaker.java index db824505..30915572 100644 --- a/src/utils/lombok/javac/TreeMirrorMaker.java +++ b/src/utils/lombok/javac/TreeMirrorMaker.java @@ -26,6 +26,7 @@ import java.util.IdentityHashMap; import java.util.Iterator; import java.util.Map; +import com.sun.source.tree.LabeledStatementTree; import com.sun.source.tree.VariableTree; import com.sun.tools.javac.tree.JCTree; import com.sun.tools.javac.tree.JCTree.JCVariableDecl; @@ -33,6 +34,16 @@ import com.sun.tools.javac.tree.TreeCopier; import com.sun.tools.javac.tree.TreeMaker; import com.sun.tools.javac.util.List; +/** + * Makes a copy of any AST node, with some exceptions. + * Exceptions: + * + * The purpose of this class is to make a copy, and then the copy is attributed (resolution info is added). These exceptions + * are to work around apparent bugs (or at least inconsistencies) in javac sources. + */ public class TreeMirrorMaker extends TreeCopier { private final IdentityHashMap originalToCopy = new IdentityHashMap(); @@ -83,4 +94,10 @@ public class TreeMirrorMaker extends TreeCopier { copy.sym = ((JCVariableDecl) node).sym; return copy; } + + // Fix for NPE in HandleVal. See http://code.google.com/p/projectlombok/issues/detail?id=299 + // This and visitVariable is rather hacky but we're working around evident bugs or at least inconsistencies in javac. + @Override public JCTree visitLabeledStatement(LabeledStatementTree node, Void p) { + return node.getStatement().accept(this, p); + } } -- cgit