mirror of
https://github.com/tiennm99/lombok.git
synced 2026-10-03 05:20:17 +00:00
Allow onMethod and onParam in @Getter and @Setter if it is put on a type
This commit is contained in:
1 parent
a27826b268
commit
b081e6c968
17 files changed
+72
-84
No files matched your search
@@ -3,6 +3,7 @@ Lombok Changelog
|
||||
|
||||
### v1.16.21 "Edgy Guinea Pig"
|
||||
* v1.16.20 is the latest stable release of Project Lombok.
|
||||
* FEATURE: `@Getter` and `@Setter` also allow `onMethod` and `onParam` when put on a type. [Issue #1653](https://github.com/rzwitserloot/lombok/issues/1653)
|
||||
* POTENTIAL FIX: IBM RAD. [Issue #1604](https://github.com/rzwitserloot/lombok/issues/1604)
|
||||
* FEATURE: `@FieldNameConstants` is an new feature that generates string constants for your field names. [Docs on @FieldNameConstants](https://projectlombok.org/features/experimental/FieldNameConstants).
|
||||
* PLATFORM: Fix for using lombok together with JDK9's new `module-info.java` feature. [Issue #985](https://github.com/rzwitserloot/lombok/issues/985)
|
||||
|
||||
@@ -72,8 +72,8 @@ public class HandleData extends EclipseAnnotationHandler<Data> {
|
||||
//for whatever reason, though you can find callers of that one by focusing on the class name itself
|
||||
//and hitting 'find callers'.
|
||||
|
||||
handleGetter.generateGetterForType(typeNode, annotationNode, AccessLevel.PUBLIC, true);
|
||||
handleSetter.generateSetterForType(typeNode, annotationNode, AccessLevel.PUBLIC, true);
|
||||
handleGetter.generateGetterForType(typeNode, annotationNode, AccessLevel.PUBLIC, true, Collections.<Annotation>emptyList());
|
||||
handleSetter.generateSetterForType(typeNode, annotationNode, AccessLevel.PUBLIC, true, Collections.<Annotation>emptyList(), Collections.<Annotation>emptyList());
|
||||
handleEqualsAndHashCode.generateEqualsAndHashCodeForType(typeNode, annotationNode);
|
||||
handleToString.generateToStringForType(typeNode, annotationNode);
|
||||
handleConstructor.generateRequiredArgsConstructor(
|
||||
|
||||
@@ -80,7 +80,7 @@ import org.mangosdk.spi.ProviderFor;
|
||||
public class HandleGetter extends EclipseAnnotationHandler<Getter> {
|
||||
private static final Annotation[] EMPTY_ANNOTATIONS_ARRAY = new Annotation[0];
|
||||
|
||||
public boolean generateGetterForType(EclipseNode typeNode, EclipseNode pos, AccessLevel level, boolean checkForTypeLevelGetter) {
|
||||
public boolean generateGetterForType(EclipseNode typeNode, EclipseNode pos, AccessLevel level, boolean checkForTypeLevelGetter, List<Annotation> onMethod) {
|
||||
if (checkForTypeLevelGetter) {
|
||||
if (hasAnnotation(Getter.class, typeNode)) {
|
||||
//The annotation will make it happen, so we can skip it.
|
||||
@@ -100,7 +100,7 @@ public class HandleGetter extends EclipseAnnotationHandler<Getter> {
|
||||
}
|
||||
|
||||
for (EclipseNode field : typeNode.down()) {
|
||||
if (fieldQualifiesForGetterGeneration(field)) generateGetterForField(field, pos.get(), level, false);
|
||||
if (fieldQualifiesForGetterGeneration(field)) generateGetterForField(field, pos.get(), level, false, onMethod);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
@@ -123,13 +123,13 @@ public class HandleGetter extends EclipseAnnotationHandler<Getter> {
|
||||
* If not, the getter is still generated if it isn't already there, though there will not
|
||||
* be a warning if its already there. The default access level is used.
|
||||
*/
|
||||
public void generateGetterForField(EclipseNode fieldNode, ASTNode pos, AccessLevel level, boolean lazy) {
|
||||
public void generateGetterForField(EclipseNode fieldNode, ASTNode pos, AccessLevel level, boolean lazy, List<Annotation> onMethod) {
|
||||
if (hasAnnotation(Getter.class, fieldNode)) {
|
||||
//The annotation will make it happen, so we can skip it.
|
||||
return;
|
||||
}
|
||||
|
||||
createGetterForField(level, fieldNode, fieldNode, pos, false, lazy, Collections.<Annotation>emptyList());
|
||||
createGetterForField(level, fieldNode, fieldNode, pos, false, lazy, onMethod);
|
||||
}
|
||||
|
||||
public void handle(AnnotationValues<Getter> annotation, Annotation ast, EclipseNode annotationNode) {
|
||||
@@ -155,11 +155,8 @@ public class HandleGetter extends EclipseAnnotationHandler<Getter> {
|
||||
createGetterForFields(level, annotationNode.upFromAnnotationToFields(), annotationNode, annotationNode.get(), true, lazy, onMethod);
|
||||
break;
|
||||
case TYPE:
|
||||
if (!onMethod.isEmpty()) {
|
||||
annotationNode.addError("'onMethod' is not supported for @Getter on a type.");
|
||||
}
|
||||
if (lazy) annotationNode.addError("'lazy' is not supported for @Getter on a type.");
|
||||
generateGetterForType(node, annotationNode, level, false);
|
||||
generateGetterForType(node, annotationNode, level, false, onMethod);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -24,22 +24,14 @@ package lombok.eclipse.handlers;
|
||||
import static lombok.core.handlers.HandlerUtil.*;
|
||||
import static lombok.eclipse.Eclipse.*;
|
||||
import static lombok.eclipse.handlers.EclipseHandlerUtil.*;
|
||||
import static lombok.eclipse.handlers.EclipseHandlerUtil.toAllSetterNames;
|
||||
import static lombok.eclipse.handlers.EclipseHandlerUtil.toSetterName;
|
||||
|
||||
import java.lang.reflect.Modifier;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
import lombok.AccessLevel;
|
||||
import lombok.ConfigurationKeys;
|
||||
import lombok.Setter;
|
||||
import lombok.core.AST.Kind;
|
||||
import lombok.core.AnnotationValues;
|
||||
import lombok.eclipse.EclipseAnnotationHandler;
|
||||
import lombok.eclipse.EclipseNode;
|
||||
import lombok.eclipse.handlers.EclipseHandlerUtil.FieldAccess;
|
||||
|
||||
import org.eclipse.jdt.internal.compiler.ast.ASTNode;
|
||||
import org.eclipse.jdt.internal.compiler.ast.Annotation;
|
||||
import org.eclipse.jdt.internal.compiler.ast.Argument;
|
||||
@@ -59,12 +51,21 @@ import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;
|
||||
import org.eclipse.jdt.internal.compiler.lookup.TypeIds;
|
||||
import org.mangosdk.spi.ProviderFor;
|
||||
|
||||
import lombok.AccessLevel;
|
||||
import lombok.ConfigurationKeys;
|
||||
import lombok.Setter;
|
||||
import lombok.core.AST.Kind;
|
||||
import lombok.core.AnnotationValues;
|
||||
import lombok.eclipse.EclipseAnnotationHandler;
|
||||
import lombok.eclipse.EclipseNode;
|
||||
import lombok.eclipse.handlers.EclipseHandlerUtil.FieldAccess;
|
||||
|
||||
/**
|
||||
* Handles the {@code lombok.Setter} annotation for eclipse.
|
||||
*/
|
||||
@ProviderFor(EclipseAnnotationHandler.class)
|
||||
public class HandleSetter extends EclipseAnnotationHandler<Setter> {
|
||||
public boolean generateSetterForType(EclipseNode typeNode, EclipseNode pos, AccessLevel level, boolean checkForTypeLevelSetter) {
|
||||
public boolean generateSetterForType(EclipseNode typeNode, EclipseNode pos, AccessLevel level, boolean checkForTypeLevelSetter, List<Annotation> onMethod, List<Annotation> onParam) {
|
||||
if (checkForTypeLevelSetter) {
|
||||
if (hasAnnotation(Setter.class, typeNode)) {
|
||||
//The annotation will make it happen, so we can skip it.
|
||||
@@ -91,7 +92,7 @@ public class HandleSetter extends EclipseAnnotationHandler<Setter> {
|
||||
//Skip final fields.
|
||||
if ((fieldDecl.modifiers & ClassFileConstants.AccFinal) != 0) continue;
|
||||
|
||||
generateSetterForField(field, pos, level);
|
||||
generateSetterForField(field, pos, level, onMethod, onParam);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
@@ -108,15 +109,12 @@ public class HandleSetter extends EclipseAnnotationHandler<Setter> {
|
||||
* If not, the setter is still generated if it isn't already there, though there will not
|
||||
* be a warning if its already there. The default access level is used.
|
||||
*/
|
||||
public void generateSetterForField(EclipseNode fieldNode, EclipseNode sourceNode, AccessLevel level) {
|
||||
public void generateSetterForField(EclipseNode fieldNode, EclipseNode sourceNode, AccessLevel level, List<Annotation> onMethod, List<Annotation> onParam) {
|
||||
if (hasAnnotation(Setter.class, fieldNode)) {
|
||||
//The annotation will make it happen, so we can skip it.
|
||||
return;
|
||||
}
|
||||
|
||||
List<Annotation> empty = Collections.emptyList();
|
||||
|
||||
createSetterForField(level, fieldNode, sourceNode, false, empty, empty);
|
||||
createSetterForField(level, fieldNode, sourceNode, false, onMethod, onParam);
|
||||
}
|
||||
|
||||
public void handle(AnnotationValues<Setter> annotation, Annotation ast, EclipseNode annotationNode) {
|
||||
@@ -134,13 +132,7 @@ public class HandleSetter extends EclipseAnnotationHandler<Setter> {
|
||||
createSetterForFields(level, annotationNode.upFromAnnotationToFields(), annotationNode, true, onMethod, onParam);
|
||||
break;
|
||||
case TYPE:
|
||||
if (!onMethod.isEmpty()) {
|
||||
annotationNode.addError("'onMethod' is not supported for @Setter on a type.");
|
||||
}
|
||||
if (!onParam.isEmpty()) {
|
||||
annotationNode.addError("'onParam' is not supported for @Setter on a type.");
|
||||
}
|
||||
generateSetterForType(node, annotationNode, level, false);
|
||||
generateSetterForType(node, annotationNode, level, false, onMethod, onParam);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -86,7 +86,7 @@ public class HandleValue extends EclipseAnnotationHandler<Value> {
|
||||
//for whatever reason, though you can find callers of that one by focusing on the class name itself
|
||||
//and hitting 'find callers'.
|
||||
|
||||
handleGetter.generateGetterForType(typeNode, annotationNode, AccessLevel.PUBLIC, true);
|
||||
handleGetter.generateGetterForType(typeNode, annotationNode, AccessLevel.PUBLIC, true, Collections.<Annotation>emptyList());
|
||||
handleEqualsAndHashCode.generateEqualsAndHashCodeForType(typeNode, annotationNode);
|
||||
handleToString.generateToStringForType(typeNode, annotationNode);
|
||||
handleConstructor.generateAllArgsConstructor(typeNode, AccessLevel.PUBLIC, ann.staticConstructor(), SkipIfConstructorExists.YES,
|
||||
|
||||
@@ -34,6 +34,7 @@ import lombok.javac.handlers.HandleConstructor.SkipIfConstructorExists;
|
||||
import org.mangosdk.spi.ProviderFor;
|
||||
|
||||
import com.sun.tools.javac.tree.JCTree.JCAnnotation;
|
||||
import com.sun.tools.javac.util.List;
|
||||
|
||||
/**
|
||||
* Handles the {@code lombok.Data} annotation for javac.
|
||||
@@ -61,8 +62,8 @@ public class HandleData extends JavacAnnotationHandler<Data> {
|
||||
String staticConstructorName = annotation.getInstance().staticConstructor();
|
||||
|
||||
handleConstructor.generateRequiredArgsConstructor(typeNode, AccessLevel.PUBLIC, staticConstructorName, SkipIfConstructorExists.YES, annotationNode);
|
||||
handleGetter.generateGetterForType(typeNode, annotationNode, AccessLevel.PUBLIC, true);
|
||||
handleSetter.generateSetterForType(typeNode, annotationNode, AccessLevel.PUBLIC, true);
|
||||
handleGetter.generateGetterForType(typeNode, annotationNode, AccessLevel.PUBLIC, true, List.<JCAnnotation>nil());
|
||||
handleSetter.generateSetterForType(typeNode, annotationNode, AccessLevel.PUBLIC, true, List.<JCAnnotation>nil(), List.<JCAnnotation>nil());
|
||||
handleEqualsAndHashCode.generateEqualsAndHashCodeForType(typeNode, annotationNode);
|
||||
handleToString.generateToStringForType(typeNode, annotationNode);
|
||||
}
|
||||
|
||||
@@ -72,7 +72,7 @@ import com.sun.tools.javac.util.Name;
|
||||
*/
|
||||
@ProviderFor(JavacAnnotationHandler.class)
|
||||
public class HandleGetter extends JavacAnnotationHandler<Getter> {
|
||||
public void generateGetterForType(JavacNode typeNode, JavacNode errorNode, AccessLevel level, boolean checkForTypeLevelGetter) {
|
||||
public void generateGetterForType(JavacNode typeNode, JavacNode errorNode, AccessLevel level, boolean checkForTypeLevelGetter, List<JCAnnotation> onMethod) {
|
||||
if (checkForTypeLevelGetter) {
|
||||
if (hasAnnotation(Getter.class, typeNode)) {
|
||||
//The annotation will make it happen, so we can skip it.
|
||||
@@ -91,7 +91,7 @@ public class HandleGetter extends JavacAnnotationHandler<Getter> {
|
||||
}
|
||||
|
||||
for (JavacNode field : typeNode.down()) {
|
||||
if (fieldQualifiesForGetterGeneration(field)) generateGetterForField(field, errorNode.get(), level, false);
|
||||
if (fieldQualifiesForGetterGeneration(field)) generateGetterForField(field, errorNode.get(), level, false, onMethod);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -120,12 +120,12 @@ public class HandleGetter extends JavacAnnotationHandler<Getter> {
|
||||
* @param fieldNode The node representing the field you want a getter for.
|
||||
* @param pos The node responsible for generating the getter (the {@code @Data} or {@code @Getter} annotation).
|
||||
*/
|
||||
public void generateGetterForField(JavacNode fieldNode, DiagnosticPosition pos, AccessLevel level, boolean lazy) {
|
||||
public void generateGetterForField(JavacNode fieldNode, DiagnosticPosition pos, AccessLevel level, boolean lazy, List<JCAnnotation> onMethod) {
|
||||
if (hasAnnotation(Getter.class, fieldNode)) {
|
||||
//The annotation will make it happen, so we can skip it.
|
||||
return;
|
||||
}
|
||||
createGetterForField(level, fieldNode, fieldNode, false, lazy, List.<JCAnnotation>nil());
|
||||
createGetterForField(level, fieldNode, fieldNode, false, lazy, onMethod);
|
||||
}
|
||||
|
||||
@Override public void handle(AnnotationValues<Getter> annotation, JCAnnotation ast, JavacNode annotationNode) {
|
||||
@@ -154,11 +154,8 @@ public class HandleGetter extends JavacAnnotationHandler<Getter> {
|
||||
createGetterForFields(level, fields, annotationNode, true, lazy, onMethod);
|
||||
break;
|
||||
case TYPE:
|
||||
if (!onMethod.isEmpty()) {
|
||||
annotationNode.addError("'onMethod' is not supported for @Getter on a type.");
|
||||
}
|
||||
if (lazy) annotationNode.addError("'lazy' is not supported for @Getter on a type.");
|
||||
generateGetterForType(node, annotationNode, level, false);
|
||||
generateGetterForType(node, annotationNode, level, false, onMethod);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -62,7 +62,7 @@ import com.sun.tools.javac.util.Name;
|
||||
*/
|
||||
@ProviderFor(JavacAnnotationHandler.class)
|
||||
public class HandleSetter extends JavacAnnotationHandler<Setter> {
|
||||
public void generateSetterForType(JavacNode typeNode, JavacNode errorNode, AccessLevel level, boolean checkForTypeLevelSetter) {
|
||||
public void generateSetterForType(JavacNode typeNode, JavacNode errorNode, AccessLevel level, boolean checkForTypeLevelSetter, List<JCAnnotation> onMethod, List<JCAnnotation> onParam) {
|
||||
if (checkForTypeLevelSetter) {
|
||||
if (hasAnnotation(Setter.class, typeNode)) {
|
||||
//The annotation will make it happen, so we can skip it.
|
||||
@@ -90,7 +90,7 @@ public class HandleSetter extends JavacAnnotationHandler<Setter> {
|
||||
//Skip final fields.
|
||||
if ((fieldDecl.mods.flags & Flags.FINAL) != 0) continue;
|
||||
|
||||
generateSetterForField(field, errorNode, level);
|
||||
generateSetterForField(field, errorNode, level, onMethod, onParam);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -109,13 +109,13 @@ public class HandleSetter extends JavacAnnotationHandler<Setter> {
|
||||
* @param fieldNode The node representing the field you want a setter for.
|
||||
* @param pos The node responsible for generating the setter (the {@code @Data} or {@code @Setter} annotation).
|
||||
*/
|
||||
public void generateSetterForField(JavacNode fieldNode, JavacNode sourceNode, AccessLevel level) {
|
||||
public void generateSetterForField(JavacNode fieldNode, JavacNode sourceNode, AccessLevel level, List<JCAnnotation> onMethod, List<JCAnnotation> onParam) {
|
||||
if (hasAnnotation(Setter.class, fieldNode)) {
|
||||
//The annotation will make it happen, so we can skip it.
|
||||
return;
|
||||
}
|
||||
|
||||
createSetterForField(level, fieldNode, sourceNode, false, List.<JCAnnotation>nil(), List.<JCAnnotation>nil());
|
||||
createSetterForField(level, fieldNode, sourceNode, false, onMethod, onParam);
|
||||
}
|
||||
|
||||
@Override public void handle(AnnotationValues<Setter> annotation, JCAnnotation ast, JavacNode annotationNode) {
|
||||
@@ -137,9 +137,7 @@ public class HandleSetter extends JavacAnnotationHandler<Setter> {
|
||||
createSetterForFields(level, fields, annotationNode, true, onMethod, onParam);
|
||||
break;
|
||||
case TYPE:
|
||||
if (!onMethod.isEmpty()) annotationNode.addError("'onMethod' is not supported for @Setter on a type.");
|
||||
if (!onParam.isEmpty()) annotationNode.addError("'onParam' is not supported for @Setter on a type.");
|
||||
generateSetterForType(node, annotationNode, level, false);
|
||||
generateSetterForType(node, annotationNode, level, false, onMethod, onParam);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -40,6 +40,7 @@ import com.sun.tools.javac.code.Flags;
|
||||
import com.sun.tools.javac.tree.JCTree.JCAnnotation;
|
||||
import com.sun.tools.javac.tree.JCTree.JCClassDecl;
|
||||
import com.sun.tools.javac.tree.JCTree.JCModifiers;
|
||||
import com.sun.tools.javac.util.List;
|
||||
|
||||
/**
|
||||
* Handles the {@code lombok.Value} annotation for javac.
|
||||
@@ -76,7 +77,7 @@ public class HandleValue extends JavacAnnotationHandler<Value> {
|
||||
}
|
||||
handleFieldDefaults.generateFieldDefaultsForType(typeNode, annotationNode, AccessLevel.PRIVATE, true, true);
|
||||
handleConstructor.generateAllArgsConstructor(typeNode, AccessLevel.PUBLIC, staticConstructorName, SkipIfConstructorExists.YES, annotationNode);
|
||||
handleGetter.generateGetterForType(typeNode, annotationNode, AccessLevel.PUBLIC, true);
|
||||
handleGetter.generateGetterForType(typeNode, annotationNode, AccessLevel.PUBLIC, true, List.<JCAnnotation>nil());
|
||||
handleEqualsAndHashCode.generateEqualsAndHashCodeForType(typeNode, annotationNode);
|
||||
handleToString.generateToStringForType(typeNode, annotationNode);
|
||||
}
|
||||
|
||||
@@ -1,9 +0,0 @@
|
||||
class PlaceFillerToMakeSurePositionIsRelevant {
|
||||
}
|
||||
class GetterOnMethodErrors {
|
||||
private int test;
|
||||
@java.lang.SuppressWarnings("all")
|
||||
public int getTest() {
|
||||
return this.test;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
class GetterOnMethodOnType {
|
||||
private int test;
|
||||
private String name;
|
||||
@Deprecated
|
||||
@java.lang.SuppressWarnings("all")
|
||||
public int getTest() {
|
||||
return this.test;
|
||||
}
|
||||
@Deprecated
|
||||
@java.lang.SuppressWarnings("all")
|
||||
public String getName() {
|
||||
return this.name;
|
||||
}
|
||||
}
|
||||
@@ -1,14 +0,0 @@
|
||||
class PlaceFillerToMakeSurePositionIsRelevant {
|
||||
PlaceFillerToMakeSurePositionIsRelevant() {
|
||||
super();
|
||||
}
|
||||
}
|
||||
@lombok.Getter() class GetterOnMethodErrors {
|
||||
private int test;
|
||||
GetterOnMethodErrors() {
|
||||
super();
|
||||
}
|
||||
public @java.lang.SuppressWarnings("all") int getTest() {
|
||||
return this.test;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
@lombok.Getter() class GetterOnMethodOnType {
|
||||
private int test;
|
||||
private String name;
|
||||
GetterOnMethodOnType() {
|
||||
super();
|
||||
}
|
||||
public @Deprecated @java.lang.SuppressWarnings("all") int getTest() {
|
||||
return this.test;
|
||||
}
|
||||
public @Deprecated @java.lang.SuppressWarnings("all") String getName() {
|
||||
return this.name;
|
||||
}
|
||||
}
|
||||
@@ -1,6 +0,0 @@
|
||||
class PlaceFillerToMakeSurePositionIsRelevant {
|
||||
}
|
||||
@lombok.Getter(onMethod=@__(@Deprecated))
|
||||
class GetterOnMethodErrors {
|
||||
private int test;
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
@lombok.Getter(onMethod=@__(@Deprecated))
|
||||
class GetterOnMethodOnType {
|
||||
private int test;
|
||||
private String name;
|
||||
}
|
||||
@@ -1 +0,0 @@
|
||||
3 'onMethod' is not supported for @Getter on a type.
|
||||
@@ -1 +0,0 @@
|
||||
3 'onMethod' is not supported for @Getter on a type.
|
||||
Reference in new issue
Block a user