diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/lombok/eclipse/EclipseAnnotationHandler.java | 2 | ||||
| -rw-r--r-- | src/lombok/eclipse/HandlerLibrary.java | 13 | ||||
| -rw-r--r-- | src/lombok/eclipse/TransformEclipseAST.java | 25 | ||||
| -rw-r--r-- | src/lombok/eclipse/handlers/HandleGetter.java | 8 | ||||
| -rw-r--r-- | src/lombok/eclipse/handlers/HandlePrintAST.java | 4 | ||||
| -rw-r--r-- | src/lombok/javac/HandlerLibrary.java | 11 | ||||
| -rw-r--r-- | src/lombok/javac/JavacAnnotationHandler.java | 2 | ||||
| -rw-r--r-- | src/lombok/javac/apt/Processor.java | 25 | ||||
| -rw-r--r-- | src/lombok/javac/handlers/HandleGetter.java | 7 | ||||
| -rw-r--r-- | src/lombok/javac/handlers/HandlePrintAST.java | 3 | ||||
| -rw-r--r-- | src/lombok/javac/handlers/HandleSetter.java | 7 | 
11 files changed, 65 insertions, 42 deletions
| diff --git a/src/lombok/eclipse/EclipseAnnotationHandler.java b/src/lombok/eclipse/EclipseAnnotationHandler.java index 816ba61c..e94607f6 100644 --- a/src/lombok/eclipse/EclipseAnnotationHandler.java +++ b/src/lombok/eclipse/EclipseAnnotationHandler.java @@ -3,5 +3,5 @@ package lombok.eclipse;  import lombok.core.AnnotationValues;  public interface EclipseAnnotationHandler<T extends java.lang.annotation.Annotation> { -	void handle(AnnotationValues<T> annotation, org.eclipse.jdt.internal.compiler.ast.Annotation ast, EclipseAST.Node annotationNode); +	boolean handle(AnnotationValues<T> annotation, org.eclipse.jdt.internal.compiler.ast.Annotation ast, EclipseAST.Node annotationNode);  } diff --git a/src/lombok/eclipse/HandlerLibrary.java b/src/lombok/eclipse/HandlerLibrary.java index 2e3e4541..86efd53e 100644 --- a/src/lombok/eclipse/HandlerLibrary.java +++ b/src/lombok/eclipse/HandlerLibrary.java @@ -45,7 +45,7 @@ public class HandlerLibrary {  			this.annotationClass = annotationClass;  		} -		public void handle(org.eclipse.jdt.internal.compiler.ast.Annotation annotation, +		public boolean handle(org.eclipse.jdt.internal.compiler.ast.Annotation annotation,  				final Node annotationNode) {  			Map<String, AnnotationValue> values = new HashMap<String, AnnotationValue>(); @@ -94,7 +94,7 @@ public class HandlerLibrary {  				});  			} -			handler.handle(new AnnotationValues<T>(annotationClass, values, annotationNode), annotation, annotationNode); +			return handler.handle(new AnnotationValues<T>(annotationClass, values, annotationNode), annotation, annotationNode);  		}  	} @@ -169,26 +169,29 @@ public class HandlerLibrary {  		}  	} -	public void handle(CompilationUnitDeclaration ast, EclipseAST.Node annotationNode, +	public boolean handle(CompilationUnitDeclaration ast, EclipseAST.Node annotationNode,  			org.eclipse.jdt.internal.compiler.ast.Annotation annotation) {  		String pkgName = annotationNode.getPackageDeclaration();  		Collection<String> imports = annotationNode.getImportStatements();  		TypeResolver resolver = new TypeResolver(typeLibrary, pkgName, imports);  		TypeReference rawType = annotation.type; -		if ( rawType == null ) return; +		if ( rawType == null ) return false; +		boolean handled = false;  		for ( String fqn : resolver.findTypeMatches(annotationNode, toQualifiedName(annotation.type.getTypeName())) ) {  			AnnotationHandlerContainer<?> container = annotationHandlers.get(fqn);  			if ( container == null ) continue;  			try { -				container.handle(annotation, annotationNode); +				handled |= container.handle(annotation, annotationNode);  			} catch ( AnnotationValueDecodeFail fail ) {  				fail.owner.setError(fail.getMessage(), fail.idx);  			} catch ( Throwable t ) {  				Eclipse.error(String.format("Lombok annotation handler %s failed", container.handler.getClass()), t);  			}  		} +		 +		return handled;  	}  	public void callASTVisitors(EclipseAST ast) { diff --git a/src/lombok/eclipse/TransformEclipseAST.java b/src/lombok/eclipse/TransformEclipseAST.java index f77639e1..b56c594a 100644 --- a/src/lombok/eclipse/TransformEclipseAST.java +++ b/src/lombok/eclipse/TransformEclipseAST.java @@ -115,32 +115,37 @@ public class TransformEclipseAST {  	private static class AnnotationVisitor extends EclipseASTAdapter {  		@Override public void visitAnnotationOnField(FieldDeclaration field, Node annotationNode, Annotation annotation) {  			if ( annotationNode.isHandled() ) return; -			handlers.handle((CompilationUnitDeclaration) annotationNode.top().get(), annotationNode, annotation); -			annotationNode.setHandled(); +			CompilationUnitDeclaration top = (CompilationUnitDeclaration) annotationNode.top().get(); +			boolean handled = handlers.handle(top, annotationNode, annotation); +			if ( handled ) annotationNode.setHandled();  		}  		@Override public void visitAnnotationOnMethodArgument(Argument arg, AbstractMethodDeclaration method, Node annotationNode, Annotation annotation) {  			if ( annotationNode.isHandled() ) return; -			handlers.handle((CompilationUnitDeclaration) annotationNode.top().get(), annotationNode, annotation); -			annotationNode.setHandled(); +			CompilationUnitDeclaration top = (CompilationUnitDeclaration) annotationNode.top().get(); +			boolean handled = handlers.handle(top, annotationNode, annotation); +			if ( handled ) annotationNode.setHandled();  		}  		@Override public void visitAnnotationOnLocal(LocalDeclaration local, Node annotationNode, Annotation annotation) {  			if ( annotationNode.isHandled() ) return; -			handlers.handle((CompilationUnitDeclaration) annotationNode.top().get(), annotationNode, annotation); -			annotationNode.setHandled(); +			CompilationUnitDeclaration top = (CompilationUnitDeclaration) annotationNode.top().get(); +			boolean handled = handlers.handle(top, annotationNode, annotation); +			if ( handled ) annotationNode.setHandled();  		}  		@Override public void visitAnnotationOnMethod(AbstractMethodDeclaration method, Node annotationNode, Annotation annotation) {  			if ( annotationNode.isHandled() ) return; -			handlers.handle((CompilationUnitDeclaration) annotationNode.top().get(), annotationNode, annotation); -			annotationNode.setHandled(); +			CompilationUnitDeclaration top = (CompilationUnitDeclaration) annotationNode.top().get(); +			boolean handled = handlers.handle(top, annotationNode, annotation); +			if ( handled ) annotationNode.setHandled();  		}  		@Override public void visitAnnotationOnType(TypeDeclaration type, Node annotationNode, Annotation annotation) {  			if ( annotationNode.isHandled() ) return; -			handlers.handle((CompilationUnitDeclaration) annotationNode.top().get(), annotationNode, annotation); -			annotationNode.setHandled(); +			CompilationUnitDeclaration top = (CompilationUnitDeclaration) annotationNode.top().get(); +			boolean handled = handlers.handle(top, annotationNode, annotation); +			if ( handled ) annotationNode.setHandled();  		}  	}  } diff --git a/src/lombok/eclipse/handlers/HandleGetter.java b/src/lombok/eclipse/handlers/HandleGetter.java index bf1aa9b0..6be978c6 100644 --- a/src/lombok/eclipse/handlers/HandleGetter.java +++ b/src/lombok/eclipse/handlers/HandleGetter.java @@ -29,8 +29,8 @@ public class HandleGetter implements EclipseAnnotationHandler<Getter> {  		annotationNode.addWarning(String.format("Not generating %s(): A method with that name already exists",  methodName));  	} -	@Override public void handle(AnnotationValues<Getter> annotation, Annotation ast, Node annotationNode) { -		if ( !(annotationNode.up().get() instanceof FieldDeclaration) ) return; +	@Override public boolean handle(AnnotationValues<Getter> annotation, Annotation ast, Node annotationNode) { +		if ( !(annotationNode.up().get() instanceof FieldDeclaration) ) return false;  		FieldDeclaration field = (FieldDeclaration) annotationNode.up().get();  		TypeReference fieldType = field.type;  		String getterName = TransformationsUtil.toGetterName( @@ -40,7 +40,7 @@ public class HandleGetter implements EclipseAnnotationHandler<Getter> {  		if ( parent.methods != null ) for ( AbstractMethodDeclaration method : parent.methods ) {  			if ( method.selector != null && new String(method.selector).equals(getterName) ) {  				generateDuplicateGetterWarning(annotationNode, getterName); -				return; +				return false;  			}  		} @@ -69,6 +69,8 @@ public class HandleGetter implements EclipseAnnotationHandler<Getter> {  			newArray[parent.methods.length] = method;  			parent.methods = newArray;  		} +		 +		return true;  	}  	private int toModifier(AccessLevel value) { diff --git a/src/lombok/eclipse/handlers/HandlePrintAST.java b/src/lombok/eclipse/handlers/HandlePrintAST.java index 2e379ce3..4438f4e4 100644 --- a/src/lombok/eclipse/handlers/HandlePrintAST.java +++ b/src/lombok/eclipse/handlers/HandlePrintAST.java @@ -11,7 +11,9 @@ import lombok.eclipse.EclipseAST.Node;  @ProviderFor(EclipseAnnotationHandler.class)  public class HandlePrintAST implements EclipseAnnotationHandler<PrintAST> { -	@Override public void handle(AnnotationValues<PrintAST> annotation, Annotation ast, Node annotationNode) { +	@Override public boolean handle(AnnotationValues<PrintAST> annotation, Annotation ast, Node annotationNode) { +		if ( !annotationNode.isCompleteParse() ) return false;  		annotationNode.up().traverse(new EclipseASTVisitor.EclipseASTPrinter()); +		return true;  	}  } diff --git a/src/lombok/javac/HandlerLibrary.java b/src/lombok/javac/HandlerLibrary.java index d816438e..05aebf20 100644 --- a/src/lombok/javac/HandlerLibrary.java +++ b/src/lombok/javac/HandlerLibrary.java @@ -67,7 +67,7 @@ public class HandlerLibrary {  			} else return null;  		} -		public void handle(final JavacAST.Node node) { +		public boolean handle(final JavacAST.Node node) {  			Map<String, AnnotationValue> values = new HashMap<String, AnnotationValue>();  			JCAnnotation anno = (JCAnnotation) node.get();  			List<JCExpression> arguments = anno.getArguments(); @@ -104,7 +104,7 @@ public class HandlerLibrary {  				});  			} -			handler.handle(new AnnotationValues<T>(annotationClass, values, node), (JCAnnotation)node.get(), node); +			return handler.handle(new AnnotationValues<T>(annotationClass, values, node), (JCAnnotation)node.get(), node);  		}  	} @@ -168,21 +168,24 @@ public class HandlerLibrary {  		}  	} -	public void handleAnnotation(JCCompilationUnit unit, JavacAST.Node node, JCAnnotation annotation) { +	public boolean handleAnnotation(JCCompilationUnit unit, JavacAST.Node node, JCAnnotation annotation) {  		TypeResolver resolver = new TypeResolver(typeLibrary, node.getPackageDeclaration(), node.getImportStatements());  		String rawType = annotation.annotationType.toString(); +		boolean handled = false;  		for ( String fqn : resolver.findTypeMatches(node, rawType) ) {  			AnnotationHandlerContainer<?> container = annotationHandlers.get(fqn);  			if ( container == null ) continue;  			try { -				container.handle(node); +				handled |= container.handle(node);  			} 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);  			}  		} +		 +		return handled;  	}  	public void callASTVisitors(JavacAST ast) { diff --git a/src/lombok/javac/JavacAnnotationHandler.java b/src/lombok/javac/JavacAnnotationHandler.java index 0df83346..58308de1 100644 --- a/src/lombok/javac/JavacAnnotationHandler.java +++ b/src/lombok/javac/JavacAnnotationHandler.java @@ -7,5 +7,5 @@ import lombok.core.AnnotationValues;  import com.sun.tools.javac.tree.JCTree.JCAnnotation;  public interface JavacAnnotationHandler<T extends Annotation> { -	void handle(AnnotationValues<T> annotation, JCAnnotation ast, JavacAST.Node annotationNode); +	boolean handle(AnnotationValues<T> annotation, JCAnnotation ast, JavacAST.Node annotationNode);  } diff --git a/src/lombok/javac/apt/Processor.java b/src/lombok/javac/apt/Processor.java index 6027daa6..8558a0ba 100644 --- a/src/lombok/javac/apt/Processor.java +++ b/src/lombok/javac/apt/Processor.java @@ -66,32 +66,37 @@ public class Processor extends AbstractProcessor {  	private class AnnotationVisitor extends JavacASTAdapter {  		@Override public void visitAnnotationOnType(JCClassDecl type, Node annotationNode, JCAnnotation annotation) {  			if ( annotationNode.isHandled() ) return; -			handlers.handleAnnotation((JCCompilationUnit) annotationNode.top().get(), annotationNode, annotation); -			annotationNode.setHandled(); +			JCCompilationUnit top = (JCCompilationUnit) annotationNode.top().get(); +			boolean handled = handlers.handleAnnotation(top, annotationNode, annotation); +			if ( handled ) annotationNode.setHandled();  		}  		@Override public void visitAnnotationOnField(JCVariableDecl field, Node annotationNode, JCAnnotation annotation) {  			if ( annotationNode.isHandled() ) return; -			handlers.handleAnnotation((JCCompilationUnit) annotationNode.top().get(), annotationNode, annotation); -			annotationNode.setHandled(); +			JCCompilationUnit top = (JCCompilationUnit) annotationNode.top().get(); +			boolean handled = handlers.handleAnnotation(top, annotationNode, annotation); +			if ( handled ) annotationNode.setHandled();  		}  		@Override public void visitAnnotationOnMethod(JCMethodDecl method, Node annotationNode, JCAnnotation annotation) {  			if ( annotationNode.isHandled() ) return; -			handlers.handleAnnotation((JCCompilationUnit) annotationNode.top().get(), annotationNode, annotation); -			annotationNode.setHandled(); +			JCCompilationUnit top = (JCCompilationUnit) annotationNode.top().get(); +			boolean handled = handlers.handleAnnotation(top, annotationNode, annotation); +			if ( handled ) annotationNode.setHandled();  		}  		@Override public void visitAnnotationOnMethodArgument(JCVariableDecl argument, JCMethodDecl method, Node annotationNode, JCAnnotation annotation) {  			if ( annotationNode.isHandled() ) return; -			handlers.handleAnnotation((JCCompilationUnit) annotationNode.top().get(), annotationNode, annotation); -			annotationNode.setHandled(); +			JCCompilationUnit top = (JCCompilationUnit) annotationNode.top().get(); +			boolean handled = handlers.handleAnnotation(top, annotationNode, annotation); +			if ( handled ) annotationNode.setHandled();  		}  		@Override public void visitAnnotationOnLocal(JCVariableDecl local, Node annotationNode, JCAnnotation annotation) {  			if ( annotationNode.isHandled() ) return; -			handlers.handleAnnotation((JCCompilationUnit) annotationNode.top().get(), annotationNode, annotation); -			annotationNode.setHandled(); +			JCCompilationUnit top = (JCCompilationUnit) annotationNode.top().get(); +			boolean handled = handlers.handleAnnotation(top, annotationNode, annotation); +			if ( handled ) annotationNode.setHandled();  		}  	} diff --git a/src/lombok/javac/handlers/HandleGetter.java b/src/lombok/javac/handlers/HandleGetter.java index da1b7107..5cc2c108 100644 --- a/src/lombok/javac/handlers/HandleGetter.java +++ b/src/lombok/javac/handlers/HandleGetter.java @@ -24,10 +24,10 @@ import com.sun.tools.javac.util.Name;  @ProviderFor(JavacAnnotationHandler.class)  public class HandleGetter implements JavacAnnotationHandler<Getter> { -	@Override public void handle(AnnotationValues<Getter> annotation, JCAnnotation ast, JavacAST.Node annotationNode) { +	@Override public boolean handle(AnnotationValues<Getter> annotation, JCAnnotation ast, JavacAST.Node annotationNode) {  		if ( annotationNode.up().getKind() != Kind.FIELD ) {  			annotationNode.addError("@Getter is only supported on a field."); -			return; +			return false;  		}  		String methodName = toGetterName((JCVariableDecl) annotationNode.up().get()); @@ -35,7 +35,7 @@ public class HandleGetter implements JavacAnnotationHandler<Getter> {  		if ( methodExists(methodName, annotationNode.up()) ) {  			annotationNode.addWarning(  					String.format("Not generating %s(): A method with that name already exists",  methodName)); -			return; +			return false;  		}  		Getter getter = annotation.getInstance(); @@ -46,6 +46,7 @@ public class HandleGetter implements JavacAnnotationHandler<Getter> {  		JCMethodDecl getterMethod = createGetter(access, annotationNode.up(), annotationNode.getTreeMaker());  		javacClassTree.defs = javacClassTree.defs.append(getterMethod); +		return true;  	}  	private JCMethodDecl createGetter(int access, JavacAST.Node field, TreeMaker treeMaker) { diff --git a/src/lombok/javac/handlers/HandlePrintAST.java b/src/lombok/javac/handlers/HandlePrintAST.java index 23f4c6d6..3a738b4f 100644 --- a/src/lombok/javac/handlers/HandlePrintAST.java +++ b/src/lombok/javac/handlers/HandlePrintAST.java @@ -12,7 +12,8 @@ import lombok.javac.JavacAST.Node;  @ProviderFor(JavacAnnotationHandler.class)  public class HandlePrintAST implements JavacAnnotationHandler<PrintAST> { -	@Override public void handle(AnnotationValues<PrintAST> annotation, JCAnnotation ast, Node annotationNode) { +	@Override public boolean handle(AnnotationValues<PrintAST> annotation, JCAnnotation ast, Node annotationNode) {  		annotationNode.up().traverse(new JavacASTVisitor.JavacASTPrinter()); +		return true;  	}  } diff --git a/src/lombok/javac/handlers/HandleSetter.java b/src/lombok/javac/handlers/HandleSetter.java index 0fbfe8ae..da4e9ff0 100644 --- a/src/lombok/javac/handlers/HandleSetter.java +++ b/src/lombok/javac/handlers/HandleSetter.java @@ -26,10 +26,10 @@ import com.sun.tools.javac.util.Name;  @ProviderFor(JavacAnnotationHandler.class)  public class HandleSetter implements JavacAnnotationHandler<Setter> { -	@Override public void handle(AnnotationValues<Setter> annotation, JCAnnotation ast, Node annotationNode) { +	@Override public boolean handle(AnnotationValues<Setter> annotation, JCAnnotation ast, Node annotationNode) {  		if ( annotationNode.up().getKind() != Kind.FIELD ) {  			annotationNode.addError("@Setter is only supported on a field."); -			return; +			return false;  		}  		JCVariableDecl fieldNode = (JCVariableDecl) annotationNode.up().get(); @@ -39,7 +39,7 @@ public class HandleSetter implements JavacAnnotationHandler<Setter> {  			annotationNode.addWarning(  					String.format("Not generating %s(%s %s): A method with that name already exists",  							methodName, fieldNode.vartype, fieldNode.name)); -			return; +			return false;  		}  		Setter setter = annotation.getInstance(); @@ -50,6 +50,7 @@ public class HandleSetter implements JavacAnnotationHandler<Setter> {  		JCMethodDecl setterMethod = createSetter(access, annotationNode.up(), annotationNode.getTreeMaker());  		javacClassTree.defs = javacClassTree.defs.append(setterMethod); +		return true;  	}  	private JCMethodDecl createSetter(int access, JavacAST.Node field, TreeMaker treeMaker) { | 
