diff options
Diffstat (limited to 'src/lombok/javac')
-rw-r--r-- | src/lombok/javac/HandlerLibrary.java | 5 | ||||
-rw-r--r-- | src/lombok/javac/Javac.java | 15 | ||||
-rw-r--r-- | src/lombok/javac/apt/Processor.java | 18 | ||||
-rw-r--r-- | src/lombok/javac/handlers/HandleData.java | 7 | ||||
-rw-r--r-- | src/lombok/javac/handlers/HandleEqualsAndHashCode.java | 13 | ||||
-rw-r--r-- | src/lombok/javac/handlers/HandleSetter.java | 3 |
6 files changed, 40 insertions, 21 deletions
diff --git a/src/lombok/javac/HandlerLibrary.java b/src/lombok/javac/HandlerLibrary.java index 7253cbaa..ff21bd3f 100644 --- a/src/lombok/javac/HandlerLibrary.java +++ b/src/lombok/javac/HandlerLibrary.java @@ -146,6 +146,7 @@ public class HandlerLibrary { /** Generates an error in the Messager that was used to initialize this HandlerLibrary. */ public void javacError(String message, Throwable t) { messager.printMessage(Diagnostic.Kind.ERROR, message + (t == null ? "" : (": " + t))); + if ( t != null ) t.printStackTrace(); } /** @@ -180,7 +181,9 @@ public class HandlerLibrary { } catch ( AnnotationValueDecodeFail fail ) { fail.owner.setError(fail.getMessage(), fail.idx); } catch ( Throwable t ) { - javacError(String.format("Lombok annotation handler %s failed", container.handler.getClass()), t); + String sourceName = "(unknown).java"; + if ( unit != null && unit.sourcefile != null ) sourceName = unit.sourcefile.getName(); + javacError(String.format("Lombok annotation handler %s failed on " + sourceName, container.handler.getClass()), t); } } diff --git a/src/lombok/javac/Javac.java b/src/lombok/javac/Javac.java index 2a3727b6..0987d31a 100644 --- a/src/lombok/javac/Javac.java +++ b/src/lombok/javac/Javac.java @@ -94,10 +94,19 @@ public class Javac { final List<DiagnosticPosition> positions = new ArrayList<DiagnosticPosition>(); for ( JCExpression arg : arguments ) { - JCAssign assign = (JCAssign) arg; - String mName = assign.lhs.toString(); + String mName; + JCExpression rhs; + + if ( arg instanceof JCAssign ) { + JCAssign assign = (JCAssign) arg; + mName = assign.lhs.toString(); + rhs = assign.rhs; + } else { + rhs = arg; + mName = "value"; + } + if ( !mName.equals(name) ) continue; - JCExpression rhs = assign.rhs; if ( rhs instanceof JCNewArray ) { List<JCExpression> elems = ((JCNewArray)rhs).elems; for ( JCExpression inner : elems ) { diff --git a/src/lombok/javac/apt/Processor.java b/src/lombok/javac/apt/Processor.java index 22daeab1..44edd917 100644 --- a/src/lombok/javac/apt/Processor.java +++ b/src/lombok/javac/apt/Processor.java @@ -34,12 +34,14 @@ import javax.annotation.processing.SupportedSourceVersion; import javax.lang.model.SourceVersion; import javax.lang.model.element.Element; import javax.lang.model.element.TypeElement; +import javax.tools.Diagnostic.Kind; import lombok.javac.HandlerLibrary; import lombok.javac.JavacAST; import lombok.javac.JavacASTAdapter; import lombok.javac.JavacAST.Node; +import com.sun.source.util.TreePath; import com.sun.source.util.Trees; import com.sun.tools.javac.processing.JavacProcessingEnvironment; import com.sun.tools.javac.tree.JCTree.JCAnnotation; @@ -69,8 +71,10 @@ public class Processor extends AbstractProcessor { /** {@inheritDoc} */ @Override public void init(ProcessingEnvironment processingEnv) { super.init(processingEnv); - if ( !(processingEnv instanceof JavacProcessingEnvironment) ) this.processingEnv = null; - else { + if ( !(processingEnv instanceof JavacProcessingEnvironment) ) { + processingEnv.getMessager().printMessage(Kind.WARNING, "You aren't using a compiler based around javac v1.6, so lombok will not work properly."); + this.processingEnv = null; + } else { this.processingEnv = (JavacProcessingEnvironment) processingEnv; handlers = HandlerLibrary.load(processingEnv.getMessager()); trees = Trees.instance(processingEnv); @@ -83,7 +87,10 @@ public class Processor extends AbstractProcessor { IdentityHashMap<JCCompilationUnit, Void> units = new IdentityHashMap<JCCompilationUnit, Void>(); - for ( Element element : roundEnv.getRootElements() ) units.put(toUnit(element), null); + for ( Element element : roundEnv.getRootElements() ) { + JCCompilationUnit unit = toUnit(element); + if ( unit != null ) units.put(unit, null); + } List<JavacAST> asts = new ArrayList<JavacAST>(); @@ -140,6 +147,9 @@ public class Processor extends AbstractProcessor { } private JCCompilationUnit toUnit(Element element) { - return (JCCompilationUnit) trees.getPath(element).getCompilationUnit(); + TreePath path = trees == null ? null : trees.getPath(element); + if ( path == null ) return null; + + return (JCCompilationUnit) path.getCompilationUnit(); } } diff --git a/src/lombok/javac/handlers/HandleData.java b/src/lombok/javac/handlers/HandleData.java index 648ff91e..3b4f8951 100644 --- a/src/lombok/javac/handlers/HandleData.java +++ b/src/lombok/javac/handlers/HandleData.java @@ -113,11 +113,9 @@ public class HandleData implements JavacAnnotationHandler<Data> { for ( Node fieldNode : fields ) { JCVariableDecl field = (JCVariableDecl) fieldNode.get(); - List<JCAnnotation> nonNulls = findAnnotations(fieldNode, NON_NULL_PATTERN); List<JCAnnotation> nullables = findAnnotations(fieldNode, NULLABLE_PATTERN); - JCVariableDecl param = maker.VarDef(maker.Modifiers(0, nonNulls.appendList(nullables)), field.name, field.vartype, null); - + JCVariableDecl param = maker.VarDef(maker.Modifiers(Flags.FINAL, nonNulls.appendList(nullables)), field.name, field.vartype, null); params = params.append(param); JCFieldAccess thisX = maker.Select(maker.Ident(fieldNode.toName("this")), field.name); JCAssign assign = maker.Assign(thisX, maker.Ident(field.name)); @@ -170,10 +168,9 @@ public class HandleData implements JavacAnnotationHandler<Data> { for ( JCExpression arg : typeApply.arguments ) tArgs = tArgs.append(arg); pType = maker.TypeApply(typeApply.clazz, tArgs); } else pType = field.vartype; - List<JCAnnotation> nonNulls = findAnnotations(fieldNode, NON_NULL_PATTERN); List<JCAnnotation> nullables = findAnnotations(fieldNode, NULLABLE_PATTERN); - JCVariableDecl param = maker.VarDef(maker.Modifiers(0, nonNulls.appendList(nullables)), field.name, pType, null); + JCVariableDecl param = maker.VarDef(maker.Modifiers(Flags.FINAL, nonNulls.appendList(nullables)), field.name, pType, null); params = params.append(param); args = args.append(maker.Ident(field.name)); } diff --git a/src/lombok/javac/handlers/HandleEqualsAndHashCode.java b/src/lombok/javac/handlers/HandleEqualsAndHashCode.java index e3e7c1ac..8c3124c9 100644 --- a/src/lombok/javac/handlers/HandleEqualsAndHashCode.java +++ b/src/lombok/javac/handlers/HandleEqualsAndHashCode.java @@ -86,7 +86,8 @@ public class HandleEqualsAndHashCode implements JavacAnnotationHandler<EqualsAnd checkForBogusExcludes(typeNode, annotation); - return generateMethods(typeNode, annotationNode, excludes, ann.callSuper(), true); + return generateMethods(typeNode, annotationNode, excludes, + ann.callSuper(), annotation.getRawExpression("callSuper") == null, true); } public void generateEqualsAndHashCodeForType(Node typeNode, Node errorNode) { @@ -103,11 +104,11 @@ public class HandleEqualsAndHashCode implements JavacAnnotationHandler<EqualsAnd try { callSuper = ((Boolean)EqualsAndHashCode.class.getMethod("callSuper").getDefaultValue()).booleanValue(); } catch ( Exception ignore ) {} - generateMethods(typeNode, errorNode, List.<String>nil(), callSuper, false); + generateMethods(typeNode, errorNode, List.<String>nil(), callSuper, true, false); } private boolean generateMethods(Node typeNode, Node errorNode, List<String> excludes, - boolean callSuper, boolean whineIfExists) { + boolean callSuper, boolean implicit, boolean whineIfExists) { boolean notAClass = true; if ( typeNode.get() instanceof JCClassDecl ) { long flags = ((JCClassDecl)typeNode.get()).mods.flags; @@ -132,8 +133,8 @@ public class HandleEqualsAndHashCode implements JavacAnnotationHandler<EqualsAnd return true; } - if ( !isDirectDescendantOfObject && !callSuper ) { - errorNode.addWarning("Generating equals/hashCode implementation but without a call to superclass, even though this class does not extend java.lang.Object."); + if ( !isDirectDescendantOfObject && !callSuper && implicit ) { + errorNode.addWarning("Generating equals/hashCode implementation but without a call to superclass, even though this class does not extend java.lang.Object. If this is intentional, add '@EqualsAndHashCode(callSuper=false)' to your type."); } List<Node> nodesForEquality = List.nil(); @@ -312,7 +313,7 @@ public class HandleEqualsAndHashCode implements JavacAnnotationHandler<EqualsAnd JCExpression returnType = maker.TypeIdent(TypeTags.BOOLEAN); List<JCStatement> statements = List.nil(); - List<JCVariableDecl> params = List.of(maker.VarDef(maker.Modifiers(0), oName, objectType, null)); + List<JCVariableDecl> params = List.of(maker.VarDef(maker.Modifiers(Flags.FINAL), oName, objectType, null)); /* if ( o == this ) return true; */ { statements = statements.append( diff --git a/src/lombok/javac/handlers/HandleSetter.java b/src/lombok/javac/handlers/HandleSetter.java index c10e731c..412b1c43 100644 --- a/src/lombok/javac/handlers/HandleSetter.java +++ b/src/lombok/javac/handlers/HandleSetter.java @@ -131,8 +131,7 @@ public class HandleSetter implements JavacAnnotationHandler<Setter> { JCBlock methodBody = treeMaker.Block(0, statements); Name methodName = field.toName(toSetterName(fieldDecl)); - - JCVariableDecl param = treeMaker.VarDef(treeMaker.Modifiers(0, nonNulls.appendList(nullables)), fieldDecl.name, fieldDecl.vartype, null); + JCVariableDecl param = treeMaker.VarDef(treeMaker.Modifiers(Flags.FINAL, nonNulls.appendList(nullables)), fieldDecl.name, fieldDecl.vartype, null); JCExpression methodType = treeMaker.Type(field.getSymbolTable().voidType); List<JCTypeParameter> methodGenericParams = List.nil(); |