From c42bfbae39990b365a5f05eb23895da6203023bc Mon Sep 17 00:00:00 2001 From: Reinier Zwitserloot Date: Fri, 31 Jan 2020 06:33:33 +0100 Subject: [issue #2221] simplified configuration for `@Singular`-generated plural form nullchecks. --- src/core/lombok/javac/handlers/HandleBuilder.java | 16 +------- src/core/lombok/javac/handlers/HandleSetter.java | 2 +- .../lombok/javac/handlers/HandleSuperBuilder.java | 4 +- .../lombok/javac/handlers/JavacHandlerUtil.java | 8 ++-- .../javac/handlers/JavacSingularsRecipes.java | 48 ++++++++-------------- 5 files changed, 25 insertions(+), 53 deletions(-) (limited to 'src/core/lombok/javac') diff --git a/src/core/lombok/javac/handlers/HandleBuilder.java b/src/core/lombok/javac/handlers/HandleBuilder.java index 75f3de2c..5c4b4297 100644 --- a/src/core/lombok/javac/handlers/HandleBuilder.java +++ b/src/core/lombok/javac/handlers/HandleBuilder.java @@ -61,7 +61,6 @@ import lombok.Builder; import lombok.Builder.ObtainVia; import lombok.ConfigurationKeys; import lombok.Singular; -import lombok.Singular.NullCollectionBehavior; import lombok.ToString; import lombok.core.AST.Kind; import lombok.core.AnnotationValues; @@ -908,22 +907,9 @@ public class HandleBuilder extends JavacAnnotationHandler { return null; } - NullCollectionBehavior behavior = getNullBehaviorFor(ann, singularInstance, node); - - return new SingularData(child, singularName, pluralName, typeArgs, targetFqn, singularizer, behavior, setterPrefix); + return new SingularData(child, singularName, pluralName, typeArgs, targetFqn, singularizer, singularInstance.ignoreNullCollections(), setterPrefix); } return null; } - - static NullCollectionBehavior getNullBehaviorFor(AnnotationValues ann, Singular singularInstance, JavacNode node) { - NullCollectionBehavior behavior; - if (ann.isExplicit("nullBehavior")) { - behavior = singularInstance.nullBehavior(); - } else { - behavior = node.getAst().readConfiguration(ConfigurationKeys.SINGULAR_NULL_COLLECTIONS); - } - if (behavior == null) return NullCollectionBehavior.NULL_POINTER_EXCEPTION; - return behavior; - } } diff --git a/src/core/lombok/javac/handlers/HandleSetter.java b/src/core/lombok/javac/handlers/HandleSetter.java index 9c7ce042..32bf574b 100644 --- a/src/core/lombok/javac/handlers/HandleSetter.java +++ b/src/core/lombok/javac/handlers/HandleSetter.java @@ -248,7 +248,7 @@ public class HandleSetter extends JavacAnnotationHandler { if (!hasNonNullAnnotations(field) && !hasNonNullAnnotations(field, onParam)) { statements.append(treeMaker.Exec(assign)); } else { - JCStatement nullCheck = generateNullCheck(treeMaker, fieldDecl.vartype, paramName, source); + JCStatement nullCheck = generateNullCheck(treeMaker, fieldDecl.vartype, paramName, source, null); if (nullCheck != null) statements.append(nullCheck); statements.append(treeMaker.Exec(assign)); } diff --git a/src/core/lombok/javac/handlers/HandleSuperBuilder.java b/src/core/lombok/javac/handlers/HandleSuperBuilder.java index 692ee60b..b4b75d79 100644 --- a/src/core/lombok/javac/handlers/HandleSuperBuilder.java +++ b/src/core/lombok/javac/handlers/HandleSuperBuilder.java @@ -59,7 +59,6 @@ import com.sun.tools.javac.util.Name; import lombok.AccessLevel; import lombok.Builder; import lombok.Builder.ObtainVia; -import lombok.Singular.NullCollectionBehavior; import lombok.ConfigurationKeys; import lombok.Singular; import lombok.ToString; @@ -976,8 +975,7 @@ public class HandleSuperBuilder extends JavacAnnotationHandler { return null; } - NullCollectionBehavior behavior = HandleBuilder.getNullBehaviorFor(ann, singularInstance, node); - return new SingularData(child, singularName, pluralName, typeArgs, targetFqn, singularizer, behavior); + return new SingularData(child, singularName, pluralName, typeArgs, targetFqn, singularizer, singularInstance.ignoreNullCollections()); } return null; diff --git a/src/core/lombok/javac/handlers/JavacHandlerUtil.java b/src/core/lombok/javac/handlers/JavacHandlerUtil.java index 0ef8c359..3ec9f159 100644 --- a/src/core/lombok/javac/handlers/JavacHandlerUtil.java +++ b/src/core/lombok/javac/handlers/JavacHandlerUtil.java @@ -1537,12 +1537,12 @@ public class JavacHandlerUtil { * Generates a new statement that checks if the given local is null, and if so, throws a configured exception with the * local variable name as message. */ - public static JCStatement generateNullCheck(JavacTreeMaker maker, JCExpression typeNode, Name varName, JavacNode source) { + public static JCStatement generateNullCheck(JavacTreeMaker maker, JCExpression typeNode, Name varName, JavacNode source, String customMessage) { NullCheckExceptionType exceptionType = source.getAst().readConfiguration(ConfigurationKeys.NON_NULL_EXCEPTION_TYPE); if (exceptionType == null) exceptionType = NullCheckExceptionType.NULL_POINTER_EXCEPTION; - if (isPrimitive(typeNode)) return null; - JCLiteral message = maker.Literal(exceptionType.toExceptionMessage(varName.toString())); + if (typeNode != null && isPrimitive(typeNode)) return null; + JCLiteral message = maker.Literal(exceptionType.toExceptionMessage(varName.toString(), customMessage)); LombokImmutableList method = exceptionType.getMethod(); if (method != null) { @@ -1569,7 +1569,7 @@ public class JavacHandlerUtil { * stripped as a result of @Accessors.prefix. */ public static JCStatement generateNullCheck(JavacTreeMaker maker, JCVariableDecl varDecl, JavacNode source) { - return generateNullCheck(maker, varDecl.vartype, varDecl.name, source); + return generateNullCheck(maker, varDecl.vartype, varDecl.name, source, null); } /** diff --git a/src/core/lombok/javac/handlers/JavacSingularsRecipes.java b/src/core/lombok/javac/handlers/JavacSingularsRecipes.java index 9dab3da5..f4128f12 100644 --- a/src/core/lombok/javac/handlers/JavacSingularsRecipes.java +++ b/src/core/lombok/javac/handlers/JavacSingularsRecipes.java @@ -37,7 +37,6 @@ import com.sun.tools.javac.tree.JCTree; import com.sun.tools.javac.tree.JCTree.JCAnnotation; import com.sun.tools.javac.tree.JCTree.JCBlock; import com.sun.tools.javac.tree.JCTree.JCExpression; -import com.sun.tools.javac.tree.JCTree.JCLiteral; import com.sun.tools.javac.tree.JCTree.JCMethodDecl; import com.sun.tools.javac.tree.JCTree.JCModifiers; import com.sun.tools.javac.tree.JCTree.JCStatement; @@ -51,7 +50,6 @@ import com.sun.tools.javac.util.Name; import lombok.AccessLevel; import lombok.ConfigurationKeys; -import lombok.Singular.NullCollectionBehavior; import lombok.core.LombokImmutableList; import lombok.core.SpiLoadUtil; import lombok.core.TypeLibrary; @@ -122,13 +120,13 @@ public class JavacSingularsRecipes { private final String targetFqn; private final JavacSingularizer singularizer; private final String setterPrefix; - private final NullCollectionBehavior nullCollectionBehavior; + private final boolean ignoreNullCollections; - public SingularData(JavacNode annotation, Name singularName, Name pluralName, List typeArgs, String targetFqn, JavacSingularizer singularizer, NullCollectionBehavior nullCollectionBehavior) { - this(annotation, singularName, pluralName, typeArgs, targetFqn, singularizer, nullCollectionBehavior, ""); + public SingularData(JavacNode annotation, Name singularName, Name pluralName, List typeArgs, String targetFqn, JavacSingularizer singularizer, boolean ignoreNullCollections) { + this(annotation, singularName, pluralName, typeArgs, targetFqn, singularizer, ignoreNullCollections, ""); } - public SingularData(JavacNode annotation, Name singularName, Name pluralName, List typeArgs, String targetFqn, JavacSingularizer singularizer, NullCollectionBehavior nullCollectionBehavior, String setterPrefix) { + public SingularData(JavacNode annotation, Name singularName, Name pluralName, List typeArgs, String targetFqn, JavacSingularizer singularizer, boolean ignoreNullCollections, String setterPrefix) { this.annotation = annotation; this.singularName = singularName; this.pluralName = pluralName; @@ -136,7 +134,7 @@ public class JavacSingularsRecipes { this.targetFqn = targetFqn; this.singularizer = singularizer; this.setterPrefix = setterPrefix; - this.nullCollectionBehavior = nullCollectionBehavior; + this.ignoreNullCollections = ignoreNullCollections; } public JavacNode getAnnotation() { @@ -167,8 +165,8 @@ public class JavacSingularsRecipes { return singularizer; } - public NullCollectionBehavior getNullCollectionBehavior() { - return nullCollectionBehavior; + public boolean isIgnoreNullCollections() { + return ignoreNullCollections; } public String getTargetSimpleType() { @@ -273,17 +271,19 @@ public class JavacSingularsRecipes { generateClearMethod(cfv, deprecate, maker, returnTypeMaker.make(), returnStatementMaker.make(), data, builderType, source, access); } - private void finishAndInjectMethod(CheckerFrameworkVersion cfv, JavacTreeMaker maker, JCExpression returnType, JCStatement returnStatement, SingularData data, JavacNode builderType, JCTree source, boolean deprecate, ListBuffer statements, Name methodName, List jcVariableDecls, AccessLevel access, NullCollectionBehavior nullBehavior) { + private void finishAndInjectMethod(CheckerFrameworkVersion cfv, JavacTreeMaker maker, JCExpression returnType, JCStatement returnStatement, SingularData data, JavacNode builderType, JCTree source, boolean deprecate, ListBuffer statements, Name methodName, List jcVariableDecls, AccessLevel access, Boolean ignoreNullCollections) { if (returnStatement != null) statements.append(returnStatement); JCBlock body = maker.Block(0, statements.toList()); JCModifiers mods = makeMods(maker, cfv, builderType, deprecate, access); List typeParams = List.nil(); List thrown = List.nil(); - if (nullBehavior == NullCollectionBehavior.IGNORE) { - for (JCVariableDecl d : jcVariableDecls) createRelevantNullableAnnotation(builderType, d); - } else if (nullBehavior != null) { - for (JCVariableDecl d : jcVariableDecls) createRelevantNonNullAnnotation(builderType, d); + if (ignoreNullCollections != null) { + if (ignoreNullCollections.booleanValue()) { + for (JCVariableDecl d : jcVariableDecls) createRelevantNullableAnnotation(builderType, d); + } else { + for (JCVariableDecl d : jcVariableDecls) createRelevantNonNullAnnotation(builderType, d); + } } JCMethodDecl method = maker.MethodDef(mods, methodName, returnType, typeParams, jcVariableDecls, thrown, body, null); @@ -343,33 +343,21 @@ public class JavacSingularsRecipes { JCExpression paramType = getPluralMethodParamType(builderType); paramType = addTypeArgs(getTypeArgumentsCount(), true, builderType, paramType, data.getTypeArgs(), source); long paramFlags = JavacHandlerUtil.addFinalIfNeeded(Flags.PARAMETER, builderType.getContext()); - NullCollectionBehavior behavior = data.getNullCollectionBehavior(); - if (behavior == null) behavior = NullCollectionBehavior.IGNORE; + boolean ignoreNullCollections = data.isIgnoreNullCollections(); JCModifiers paramMods = maker.Modifiers(paramFlags); JCVariableDecl param = maker.VarDef(paramMods, data.getPluralName(), paramType, null); statements.prepend(createConstructBuilderVarIfNeeded(maker, data, builderType, source)); - if (behavior == NullCollectionBehavior.IGNORE) { + if (ignoreNullCollections) { JCExpression incomingIsNotNull = maker.Binary(CTC_NOT_EQUAL, maker.Ident(data.getPluralName()), maker.Literal(CTC_BOT, null)); JCStatement onNotNull = maker.Block(0, statements.toList()); statements = new ListBuffer(); statements.add(maker.If(incomingIsNotNull, onNotNull, null)); } else { - JCLiteral message = maker.Literal(behavior.toExceptionMessage(data.getPluralName().toString())); - if (behavior.getExceptionType() != null) { - JCExpression incomingIsNull = maker.Binary(CTC_EQUAL, maker.Ident(data.getPluralName()), maker.Literal(CTC_BOT, null)); - JCExpression exType = genTypeRef(builderType, behavior.getExceptionType()); - JCExpression exception = maker.NewClass(null, List.nil(), exType, List.of(message), null); - JCStatement onNull = maker.Throw(exception); - statements.prepend(maker.If(incomingIsNull, onNull, null)); - } else { - LombokImmutableList method = behavior.getMethod(); - JCExpression invoke = maker.Apply(List.nil(), chainDots(builderType, method), List.of(maker.Ident(data.getPluralName()), message)); - statements.prepend(maker.Exec(invoke)); - } + statements.prepend(JavacHandlerUtil.generateNullCheck(maker, null, data.getPluralName(), builderType, "%s cannot be null")); } - finishAndInjectMethod(cfv, maker, returnType, returnStatement, data, builderType, source, deprecate, statements, name, List.of(param), access, behavior); + finishAndInjectMethod(cfv, maker, returnType, returnStatement, data, builderType, source, deprecate, statements, name, List.of(param), access, ignoreNullCollections); } protected ListBuffer generatePluralMethodStatements(JavacTreeMaker maker, SingularData data, JavacNode builderType, JCTree source) { -- cgit