aboutsummaryrefslogtreecommitdiff
path: root/src/lombok/javac/handlers/HandleSetter.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/lombok/javac/handlers/HandleSetter.java')
-rw-r--r--src/lombok/javac/handlers/HandleSetter.java153
1 files changed, 0 insertions, 153 deletions
diff --git a/src/lombok/javac/handlers/HandleSetter.java b/src/lombok/javac/handlers/HandleSetter.java
deleted file mode 100644
index 84032e9c..00000000
--- a/src/lombok/javac/handlers/HandleSetter.java
+++ /dev/null
@@ -1,153 +0,0 @@
-/*
- * Copyright © 2009 Reinier Zwitserloot and Roel Spilker.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-package lombok.javac.handlers;
-
-import static lombok.javac.handlers.JavacHandlerUtil.*;
-import lombok.AccessLevel;
-import lombok.Setter;
-import lombok.core.AnnotationValues;
-import lombok.core.TransformationsUtil;
-import lombok.core.AST.Kind;
-import lombok.javac.Javac;
-import lombok.javac.JavacAnnotationHandler;
-import lombok.javac.JavacNode;
-
-import org.mangosdk.spi.ProviderFor;
-
-import com.sun.tools.javac.code.Flags;
-import com.sun.tools.javac.tree.TreeMaker;
-import com.sun.tools.javac.tree.JCTree.JCAnnotation;
-import com.sun.tools.javac.tree.JCTree.JCAssign;
-import com.sun.tools.javac.tree.JCTree.JCBlock;
-import com.sun.tools.javac.tree.JCTree.JCExpression;
-import com.sun.tools.javac.tree.JCTree.JCFieldAccess;
-import com.sun.tools.javac.tree.JCTree.JCMethodDecl;
-import com.sun.tools.javac.tree.JCTree.JCStatement;
-import com.sun.tools.javac.tree.JCTree.JCTypeParameter;
-import com.sun.tools.javac.tree.JCTree.JCVariableDecl;
-import com.sun.tools.javac.util.List;
-import com.sun.tools.javac.util.Name;
-import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition;
-
-/**
- * Handles the {@code lombok.Setter} annotation for javac.
- */
-@ProviderFor(JavacAnnotationHandler.class)
-public class HandleSetter implements JavacAnnotationHandler<Setter> {
- /**
- * Generates a setter on the stated field.
- *
- * Used by {@link HandleData}.
- *
- * The difference between this call and the handle method is as follows:
- *
- * If there is a {@code lombok.Setter} annotation on the field, it is used and the
- * same rules apply (e.g. warning if the method already exists, stated access level applies).
- * 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.
- *
- * @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, DiagnosticPosition pos) {
- for (JavacNode child : fieldNode.down()) {
- if (child.getKind() == Kind.ANNOTATION) {
- if (Javac.annotationTypeMatches(Setter.class, child)) {
- //The annotation will make it happen, so we can skip it.
- return;
- }
- }
- }
-
- createSetterForField(AccessLevel.PUBLIC, fieldNode, fieldNode, false);
- }
-
- @Override public boolean handle(AnnotationValues<Setter> annotation, JCAnnotation ast, JavacNode annotationNode) {
- JavacNode fieldNode = annotationNode.up();
- AccessLevel level = annotation.getInstance().value();
- if (level == AccessLevel.NONE) return true;
-
- return createSetterForField(level, fieldNode, annotationNode, true);
- }
-
- private boolean createSetterForField(AccessLevel level,
- JavacNode fieldNode, JavacNode errorNode, boolean whineIfExists) {
- if (fieldNode.getKind() != Kind.FIELD) {
- fieldNode.addError("@Setter is only supported on a field.");
- return true;
- }
-
- JCVariableDecl fieldDecl = (JCVariableDecl)fieldNode.get();
- String methodName = toSetterName(fieldDecl);
-
- switch (methodExists(methodName, fieldNode)) {
- case EXISTS_BY_LOMBOK:
- return true;
- case EXISTS_BY_USER:
- if (whineIfExists) errorNode.addWarning(
- String.format("Not generating %s(%s %s): A method with that name already exists",
- methodName, fieldDecl.vartype, fieldDecl.name));
- return true;
- default:
- case NOT_EXISTS:
- //continue with creating the setter
- }
-
- long access = toJavacModifier(level) | (fieldDecl.mods.flags & Flags.STATIC);
-
- injectMethod(fieldNode.up(), createSetter(access, fieldNode, fieldNode.getTreeMaker()));
-
- return true;
- }
-
- private JCMethodDecl createSetter(long access, JavacNode field, TreeMaker treeMaker) {
- JCVariableDecl fieldDecl = (JCVariableDecl) field.get();
-
- JCFieldAccess thisX = treeMaker.Select(treeMaker.Ident(field.toName("this")), fieldDecl.name);
- JCAssign assign = treeMaker.Assign(thisX, treeMaker.Ident(fieldDecl.name));
-
- List<JCStatement> statements;
- List<JCAnnotation> nonNulls = findAnnotations(field, TransformationsUtil.NON_NULL_PATTERN);
- List<JCAnnotation> nullables = findAnnotations(field, TransformationsUtil.NULLABLE_PATTERN);
-
- if (nonNulls.isEmpty()) {
- statements = List.<JCStatement>of(treeMaker.Exec(assign));
- } else {
- JCStatement nullCheck = generateNullCheck(treeMaker, field);
- if (nullCheck != null) statements = List.<JCStatement>of(nullCheck, treeMaker.Exec(assign));
- else statements = List.<JCStatement>of(treeMaker.Exec(assign));
- }
-
- JCBlock methodBody = treeMaker.Block(0, statements);
- Name methodName = field.toName(toSetterName(fieldDecl));
- 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();
- List<JCVariableDecl> parameters = List.of(param);
- List<JCExpression> throwsClauses = List.nil();
- JCExpression annotationMethodDefaultValue = null;
-
- return treeMaker.MethodDef(treeMaker.Modifiers(access, List.<JCAnnotation>nil()), methodName, methodType,
- methodGenericParams, parameters, throwsClauses, methodBody, annotationMethodDefaultValue);
- }
-}