diff options
40 files changed, 259 insertions, 161 deletions
diff --git a/doc/changelog.markdown b/doc/changelog.markdown index 4f8d203e..ac1bb097 100644 --- a/doc/changelog.markdown +++ b/doc/changelog.markdown @@ -2,8 +2,10 @@ Lombok Changelog ---------------- ### v1.18.7 "Edgy Guinea Pig" -* BUGFIX: var/val on methods that return an intersection type would now work in Eclipse [Issue #1986](https://github.com/rzwitserloot/lombok/issues/1986) * FEATURE: You can now suppress generation of the `builder` method when using `@Builder`; usually because you're only interested in the `toBuilder` method. As a convenience we won't emit warnings about missing `@Builder.Default` annotations when you do this. [Issue #2046](https://github.com/rzwitserloot/lombok/issues/2046) +* FEATURE: When using `@NonNull`, or any other annotation that would result in a null-check, you can configure to generate an assert statement instead. [Issue #2078](https://github.com/rzwitserloot/lombok/issues/2078). +* BUGFIX: var/val on methods that return an intersection type would now work in Eclipse [Issue #1986](https://github.com/rzwitserloot/lombok/issues/1986) +* IMPROBABLE BREAKING CHANGE: For fields and parameters marked non-null, if the method body starts with an assert statement to ensure the value isn't null, no code to throw an exception will be generated. ### v1.18.6 (February 12th, 2019) * FEATURE: Javadoc on fields will now also be copied to the Builders' setters. Thanks for the contribution, Emil Lundberg. [Issue #2008](https://github.com/rzwitserloot/lombok/issues/2008) diff --git a/src/core/lombok/NonNull.java b/src/core/lombok/NonNull.java index caf6ed05..ba8c24a4 100644 --- a/src/core/lombok/NonNull.java +++ b/src/core/lombok/NonNull.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2009-2013 The Project Lombok Authors. + * Copyright (C) 2009-2019 The Project Lombok Authors. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -30,16 +30,7 @@ import java.lang.annotation.Target; /** * If put on a parameter, lombok will insert a null-check at the start of the method / constructor's body, throwing a * {@code NullPointerException} with the parameter's name as message. If put on a field, any generated method assigning - * a value to this field will also produce these nullchecks. - * <p> - * Note that any annotation named {@code NonNull} with any casing and any package will result in nullchecks produced for - * generated methods (and the annotation will be copied to the getter return type and any parameters of generated methods), - * but <em>only</em> this annotation, if present on a parameter, will result in a null check inserted into your otherwise - * handwritten method. - * - * WARNING: If the java community ever does decide on supporting a single {@code @NonNull} annotation (for example via JSR305), then - * this annotation will <strong>be deleted</strong> from the lombok package. If the need to update an import statement scares - * you, you should use your own annotation named {@code @NonNull} instead of this one. + * a value to this field will also produce these null-checks. */ @Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.LOCAL_VARIABLE, ElementType.TYPE_USE}) @Retention(RetentionPolicy.CLASS) diff --git a/src/core/lombok/core/configuration/NullCheckExceptionType.java b/src/core/lombok/core/configuration/NullCheckExceptionType.java index c4bb71f2..d226c0a8 100644 --- a/src/core/lombok/core/configuration/NullCheckExceptionType.java +++ b/src/core/lombok/core/configuration/NullCheckExceptionType.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2014-2018 The Project Lombok Authors. + * Copyright (C) 2014-2019 The Project Lombok Authors. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -22,27 +22,27 @@ package lombok.core.configuration; -@ExampleValueString("[NullPointerException | IllegalArgumentException]") +@ExampleValueString("[NullPointerException | IllegalArgumentException | Assertion]") public enum NullCheckExceptionType { ILLEGAL_ARGUMENT_EXCEPTION { - public String toExceptionMessage(String fieldName) { - return fieldName + " is marked @NonNull but is null"; - } - @Override public String getExceptionType() { return "java.lang.IllegalArgumentException"; } }, NULL_POINTER_EXCEPTION { - @Override public String toExceptionMessage(String fieldName) { - return fieldName + " is marked @NonNull but is null"; - } - - public String getExceptionType() { + @Override public String getExceptionType() { return "java.lang.NullPointerException"; } + }, + ASSERTION { + @Override public String getExceptionType() { + return null; + } }; - public abstract String toExceptionMessage(String fieldName); + public String toExceptionMessage(String fieldName) { + return fieldName + " is marked non-null but is null"; + } + public abstract String getExceptionType(); } diff --git a/src/core/lombok/eclipse/handlers/EclipseHandlerUtil.java b/src/core/lombok/eclipse/handlers/EclipseHandlerUtil.java index 78b11873..010dc9d8 100644 --- a/src/core/lombok/eclipse/handlers/EclipseHandlerUtil.java +++ b/src/core/lombok/eclipse/handlers/EclipseHandlerUtil.java @@ -66,6 +66,7 @@ import org.eclipse.jdt.internal.compiler.ast.Annotation; import org.eclipse.jdt.internal.compiler.ast.ArrayInitializer; import org.eclipse.jdt.internal.compiler.ast.ArrayQualifiedTypeReference; import org.eclipse.jdt.internal.compiler.ast.ArrayTypeReference; +import org.eclipse.jdt.internal.compiler.ast.AssertStatement; import org.eclipse.jdt.internal.compiler.ast.Block; import org.eclipse.jdt.internal.compiler.ast.CastExpression; import org.eclipse.jdt.internal.compiler.ast.CharLiteral; @@ -1786,27 +1787,39 @@ public class EclipseHandlerUtil { if (isPrimitive(variable.type)) return null; AllocationExpression exception = new AllocationExpression(); setGeneratedBy(exception, source); - int partCount = 1; + + SingleNameReference varName = new SingleNameReference(variable.name, p); + setGeneratedBy(varName, source); + NullLiteral nullLiteral = new NullLiteral(pS, pE); + setGeneratedBy(nullLiteral, source); + + int equalOperator = exceptionType == NullCheckExceptionType.ASSERTION ? OperatorIds.NOT_EQUAL : OperatorIds.EQUAL_EQUAL; + EqualExpression equalExpression = new EqualExpression(varName, nullLiteral, equalOperator); + equalExpression.sourceStart = pS; equalExpression.statementEnd = equalExpression.sourceEnd = pE; + setGeneratedBy(equalExpression, source); + + StringLiteral message = new StringLiteral(exceptionType.toExceptionMessage(new String(variable.name)).toCharArray(), pS, pE, 0); + setGeneratedBy(message, source); + + if (exceptionType == NullCheckExceptionType.ASSERTION) { + Statement assertStatement = new AssertStatement(message, equalExpression, pS); + setGeneratedBy(assertStatement, source); + return assertStatement; + } + String exceptionTypeStr = exceptionType.getExceptionType(); + int partCount = 1; for (int i = 0; i < exceptionTypeStr.length(); i++) if (exceptionTypeStr.charAt(i) == '.') partCount++; long[] ps = new long[partCount]; Arrays.fill(ps, 0L); exception.type = new QualifiedTypeReference(fromQualifiedName(exceptionTypeStr), ps); setGeneratedBy(exception.type, source); - exception.arguments = new Expression[] { - new StringLiteral(exceptionType.toExceptionMessage(new String(variable.name)).toCharArray(), pS, pE, 0) - }; - setGeneratedBy(exception.arguments[0], source); + exception.arguments = new Expression[] {message}; + ThrowStatement throwStatement = new ThrowStatement(exception, pS, pE); setGeneratedBy(throwStatement, source); - SingleNameReference varName = new SingleNameReference(variable.name, p); - setGeneratedBy(varName, source); - NullLiteral nullLiteral = new NullLiteral(pS, pE); - setGeneratedBy(nullLiteral, source); - EqualExpression equalExpression = new EqualExpression(varName, nullLiteral, OperatorIds.EQUAL_EQUAL); - equalExpression.sourceStart = pS; equalExpression.statementEnd = equalExpression.sourceEnd = pE; - setGeneratedBy(equalExpression, source); + Block throwBlock = new Block(0); throwBlock.statements = new Statement[] {throwStatement}; throwBlock.sourceStart = pS; throwBlock.sourceEnd = pE; diff --git a/src/core/lombok/eclipse/handlers/HandleNonNull.java b/src/core/lombok/eclipse/handlers/HandleNonNull.java index 1672618d..77c77e1e 100644 --- a/src/core/lombok/eclipse/handlers/HandleNonNull.java +++ b/src/core/lombok/eclipse/handlers/HandleNonNull.java @@ -21,27 +21,18 @@ */ package lombok.eclipse.handlers; -import static lombok.core.handlers.HandlerUtil.*; +import static lombok.core.handlers.HandlerUtil.handleFlagUsage; import static lombok.eclipse.Eclipse.isPrimitive; import static lombok.eclipse.handlers.EclipseHandlerUtil.*; import java.util.Arrays; -import lombok.ConfigurationKeys; -import lombok.NonNull; -import lombok.core.AST.Kind; -import lombok.core.AnnotationValues; -import lombok.core.HandlerPriority; -import lombok.eclipse.DeferUntilPostDiet; -import lombok.eclipse.EclipseAST; -import lombok.eclipse.EclipseAnnotationHandler; -import lombok.eclipse.EclipseNode; - import org.eclipse.jdt.internal.compiler.ast.ASTNode; import org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration; import org.eclipse.jdt.internal.compiler.ast.AbstractVariableDeclaration; import org.eclipse.jdt.internal.compiler.ast.Annotation; import org.eclipse.jdt.internal.compiler.ast.Argument; +import org.eclipse.jdt.internal.compiler.ast.AssertStatement; import org.eclipse.jdt.internal.compiler.ast.Block; import org.eclipse.jdt.internal.compiler.ast.EqualExpression; import org.eclipse.jdt.internal.compiler.ast.Expression; @@ -56,6 +47,16 @@ import org.eclipse.jdt.internal.compiler.ast.TryStatement; import org.eclipse.jdt.internal.compiler.ast.TypeReference; import org.mangosdk.spi.ProviderFor; +import lombok.ConfigurationKeys; +import lombok.NonNull; +import lombok.core.AST.Kind; +import lombok.core.AnnotationValues; +import lombok.core.HandlerPriority; +import lombok.eclipse.DeferUntilPostDiet; +import lombok.eclipse.EclipseAST; +import lombok.eclipse.EclipseAnnotationHandler; +import lombok.eclipse.EclipseNode; + @DeferUntilPostDiet @ProviderFor(EclipseAnnotationHandler.class) @HandlerPriority(value = 512) // 2^9; onParameter=@__(@NonNull) has to run first. @@ -191,9 +192,11 @@ public class HandleNonNull extends EclipseAnnotationHandler<NonNull> { } public char[] returnVarNameIfNullCheck(Statement stat) { - if (!(stat instanceof IfStatement)) return null; + boolean isIf = stat instanceof IfStatement; + if (!isIf && !(stat instanceof AssertStatement)) return null; - /* Check that the if's statement is a throw statement, possibly in a block. */ { + if (isIf) { + /* Check that the if's statement is a throw statement, possibly in a block. */ Statement then = ((IfStatement) stat).thenStatement; if (then instanceof Block) { Statement[] blockStatements = ((Block) then).statements; @@ -206,11 +209,15 @@ public class HandleNonNull extends EclipseAnnotationHandler<NonNull> { /* Check that the if's conditional is like 'x == null'. Return from this method (don't generate a nullcheck) if 'x' is equal to our own variable's name: There's already a nullcheck here. */ { - Expression cond = ((IfStatement) stat).condition; + Expression cond = isIf ? ((IfStatement) stat).condition : ((AssertStatement) stat).assertExpression; if (!(cond instanceof EqualExpression)) return null; EqualExpression bin = (EqualExpression) cond; int operatorId = ((bin.bits & ASTNode.OperatorMASK) >> ASTNode.OperatorSHIFT); - if (operatorId != OperatorIds.EQUAL_EQUAL) return null; + if (isIf) { + if (operatorId != OperatorIds.EQUAL_EQUAL) return null; + } else { + if (operatorId != OperatorIds.NOT_EQUAL) return null; + } if (!(bin.left instanceof SingleNameReference)) return null; if (!(bin.right instanceof NullLiteral)) return null; return ((SingleNameReference) bin.left).token; diff --git a/src/core/lombok/javac/handlers/HandleNonNull.java b/src/core/lombok/javac/handlers/HandleNonNull.java index 9a81ffff..49b987ce 100644 --- a/src/core/lombok/javac/handlers/HandleNonNull.java +++ b/src/core/lombok/javac/handlers/HandleNonNull.java @@ -21,13 +21,16 @@ */ package lombok.javac.handlers; -import static lombok.core.handlers.HandlerUtil.*; +import static lombok.core.handlers.HandlerUtil.handleFlagUsage; import static lombok.javac.Javac.*; +import static lombok.javac.JavacTreeMaker.TreeTag.treeTag; +import static lombok.javac.JavacTreeMaker.TypeTag.typeTag; import static lombok.javac.handlers.JavacHandlerUtil.*; import org.mangosdk.spi.ProviderFor; import com.sun.tools.javac.tree.JCTree.JCAnnotation; +import com.sun.tools.javac.tree.JCTree.JCAssert; import com.sun.tools.javac.tree.JCTree.JCBinary; import com.sun.tools.javac.tree.JCTree.JCBlock; import com.sun.tools.javac.tree.JCTree.JCExpression; @@ -45,13 +48,11 @@ import com.sun.tools.javac.util.List; import lombok.ConfigurationKeys; import lombok.NonNull; +import lombok.core.AST.Kind; import lombok.core.AnnotationValues; import lombok.core.HandlerPriority; -import lombok.core.AST.Kind; import lombok.javac.JavacAnnotationHandler; import lombok.javac.JavacNode; -import static lombok.javac.JavacTreeMaker.TypeTag.*; -import static lombok.javac.JavacTreeMaker.TreeTag.*; @ProviderFor(JavacAnnotationHandler.class) @HandlerPriority(value = 512) // 2^9; onParameter=@__(@NonNull) has to run first. @@ -161,14 +162,16 @@ public class HandleNonNull extends JavacAnnotationHandler<NonNull> { } /** - * Checks if the statement is of the form 'if (x == null) {throw WHATEVER;}, + * Checks if the statement is of the form 'if (x == null) {throw WHATEVER;}' or 'assert x != null;', * where the block braces are optional. If it is of this form, returns "x". * If it is not of this form, returns null. */ public String returnVarNameIfNullCheck(JCStatement stat) { - if (!(stat instanceof JCIf)) return null; + boolean isIf = stat instanceof JCIf; + if (!isIf && !(stat instanceof JCAssert)) return null; - /* Check that the if's statement is a throw statement, possibly in a block. */ { + if (isIf) { + /* Check that the if's statement is a throw statement, possibly in a block. */ JCStatement then = ((JCIf) stat).thenpart; if (then instanceof JCBlock) { List<JCStatement> stats = ((JCBlock) then).stats; @@ -180,11 +183,15 @@ public class HandleNonNull extends JavacAnnotationHandler<NonNull> { /* Check that the if's conditional is like 'x == null'. Return from this method (don't generate a nullcheck) if 'x' is equal to our own variable's name: There's already a nullcheck here. */ { - JCExpression cond = ((JCIf) stat).cond; + JCExpression cond = isIf ? ((JCIf) stat).cond : ((JCAssert) stat).cond; while (cond instanceof JCParens) cond = ((JCParens) cond).expr; if (!(cond instanceof JCBinary)) return null; JCBinary bin = (JCBinary) cond; - if (!CTC_EQUAL.equals(treeTag(bin))) return null; + if (isIf) { + if (!CTC_EQUAL.equals(treeTag(bin))) return null; + } else { + if (!CTC_NOT_EQUAL.equals(treeTag(bin))) return null; + } if (!(bin.lhs instanceof JCIdent)) return null; if (!(bin.rhs instanceof JCLiteral)) return null; if (!CTC_BOT.equals(typeTag(bin.rhs))) return null; diff --git a/src/core/lombok/javac/handlers/JavacHandlerUtil.java b/src/core/lombok/javac/handlers/JavacHandlerUtil.java index 9e6c8c00..509a7397 100644 --- a/src/core/lombok/javac/handlers/JavacHandlerUtil.java +++ b/src/core/lombok/javac/handlers/JavacHandlerUtil.java @@ -40,36 +40,15 @@ import java.util.regex.Pattern; import javax.lang.model.element.Element; -import lombok.AccessLevel; -import lombok.ConfigurationKeys; -import lombok.Data; -import lombok.Getter; -import lombok.core.AST.Kind; -import lombok.core.AnnotationValues; -import lombok.core.LombokImmutableList; -import lombok.core.AnnotationValues.AnnotationValue; -import lombok.core.CleanupTask; -import lombok.core.TypeResolver; -import lombok.core.configuration.NullCheckExceptionType; -import lombok.core.configuration.TypeName; -import lombok.core.handlers.HandlerUtil; -import lombok.delombok.LombokOptionsFactory; -import lombok.experimental.Accessors; -import lombok.experimental.Tolerate; -import lombok.javac.Javac; -import lombok.javac.JavacNode; -import lombok.javac.JavacTreeMaker; -import lombok.permit.Permit; - import com.sun.tools.javac.code.BoundKind; import com.sun.tools.javac.code.Flags; import com.sun.tools.javac.code.Scope; import com.sun.tools.javac.code.Symbol; -import com.sun.tools.javac.code.Symtab; -import com.sun.tools.javac.code.Type; import com.sun.tools.javac.code.Symbol.ClassSymbol; import com.sun.tools.javac.code.Symbol.MethodSymbol; import com.sun.tools.javac.code.Symbol.VarSymbol; +import com.sun.tools.javac.code.Symtab; +import com.sun.tools.javac.code.Type; import com.sun.tools.javac.code.Type.MethodType; import com.sun.tools.javac.tree.JCTree; import com.sun.tools.javac.tree.JCTree.JCAnnotation; @@ -83,6 +62,7 @@ import com.sun.tools.javac.tree.JCTree.JCExpressionStatement; import com.sun.tools.javac.tree.JCTree.JCFieldAccess; import com.sun.tools.javac.tree.JCTree.JCIdent; import com.sun.tools.javac.tree.JCTree.JCImport; +import com.sun.tools.javac.tree.JCTree.JCLiteral; import com.sun.tools.javac.tree.JCTree.JCMethodDecl; import com.sun.tools.javac.tree.JCTree.JCMethodInvocation; import com.sun.tools.javac.tree.JCTree.JCModifiers; @@ -103,6 +83,28 @@ import com.sun.tools.javac.util.ListBuffer; import com.sun.tools.javac.util.Name; import com.sun.tools.javac.util.Options; +import lombok.AccessLevel; +import lombok.ConfigurationKeys; +import lombok.Data; +import lombok.Getter; +import lombok.core.AST.Kind; +import lombok.core.AnnotationValues; +import lombok.core.AnnotationValues.AnnotationValue; +import lombok.core.CleanupTask; +import lombok.core.LombokImmutableList; +import lombok.core.TypeResolver; +import lombok.core.configuration.NullCheckExceptionType; +import lombok.core.configuration.TypeName; +import lombok.core.handlers.HandlerUtil; +import lombok.core.handlers.HandlerUtil.FieldAccess; +import lombok.delombok.LombokOptionsFactory; +import lombok.experimental.Accessors; +import lombok.experimental.Tolerate; +import lombok.javac.Javac; +import lombok.javac.JavacNode; +import lombok.javac.JavacTreeMaker; +import lombok.permit.Permit; + /** * Container for static utility methods useful to handlers written for javac. */ @@ -1484,8 +1486,14 @@ public class JavacHandlerUtil { if (isPrimitive(varDecl.vartype)) return null; Name fieldName = varDecl.name; + + JCLiteral message = maker.Literal(exceptionType.toExceptionMessage(fieldName.toString())); + if (exceptionType == NullCheckExceptionType.ASSERTION) { + return maker.Assert(maker.Binary(CTC_NOT_EQUAL, maker.Ident(fieldName), maker.Literal(CTC_BOT, null)), message); + } + JCExpression exType = genTypeRef(variable, exceptionType.getExceptionType()); - JCExpression exception = maker.NewClass(null, List.<JCExpression>nil(), exType, List.<JCExpression>of(maker.Literal(exceptionType.toExceptionMessage(fieldName.toString()))), null); + JCExpression exception = maker.NewClass(null, List.<JCExpression>nil(), exType, List.<JCExpression>of(message), null); JCStatement throwStatement = maker.Throw(exception); JCBlock throwBlock = maker.Block(0, List.of(throwStatement)); return maker.If(maker.Binary(CTC_EQUAL, maker.Ident(fieldName), maker.Literal(CTC_BOT, null)), throwBlock, null); diff --git a/test/transform/resource/after-delombok/BuilderSingularAnnotatedTypes.java b/test/transform/resource/after-delombok/BuilderSingularAnnotatedTypes.java index 93825659..88459e67 100644 --- a/test/transform/resource/after-delombok/BuilderSingularAnnotatedTypes.java +++ b/test/transform/resource/after-delombok/BuilderSingularAnnotatedTypes.java @@ -28,7 +28,7 @@ class BuilderSingularAnnotatedTypes { @java.lang.SuppressWarnings("all") public BuilderSingularAnnotatedTypesBuilder foo(@MyAnnotation @NonNull final String foo) { if (foo == null) { - throw new java.lang.NullPointerException("foo is marked @NonNull but is null"); + throw new java.lang.NullPointerException("foo is marked non-null but is null"); } if (this.foos == null) this.foos = new java.util.ArrayList<@MyAnnotation @NonNull String>(); this.foos.add(foo); @@ -48,10 +48,10 @@ class BuilderSingularAnnotatedTypes { @java.lang.SuppressWarnings("all") public BuilderSingularAnnotatedTypesBuilder bar(@MyAnnotation @NonNull final String barKey, @MyAnnotation @NonNull final Integer barValue) { if (barKey == null) { - throw new java.lang.NullPointerException("barKey is marked @NonNull but is null"); + throw new java.lang.NullPointerException("barKey is marked non-null but is null"); } if (barValue == null) { - throw new java.lang.NullPointerException("barValue is marked @NonNull but is null"); + throw new java.lang.NullPointerException("barValue is marked non-null but is null"); } if (this.bars$key == null) { this.bars$key = new java.util.ArrayList<@MyAnnotation @NonNull String>(); diff --git a/test/transform/resource/after-delombok/ConstructorsWithAccessors.java b/test/transform/resource/after-delombok/ConstructorsWithAccessors.java index 2e09b2df..3614d682 100644 --- a/test/transform/resource/after-delombok/ConstructorsWithAccessors.java +++ b/test/transform/resource/after-delombok/ConstructorsWithAccessors.java @@ -26,16 +26,16 @@ class ConstructorsWithAccessorsNonNull { @java.lang.SuppressWarnings("all") public ConstructorsWithAccessorsNonNull(@lombok.NonNull final Integer plower, @lombok.NonNull final Integer upper, @lombok.NonNull final Integer huh, @lombok.NonNull final Integer _huh2) { if (plower == null) { - throw new java.lang.NullPointerException("plower is marked @NonNull but is null"); + throw new java.lang.NullPointerException("plower is marked non-null but is null"); } if (upper == null) { - throw new java.lang.NullPointerException("upper is marked @NonNull but is null"); + throw new java.lang.NullPointerException("upper is marked non-null but is null"); } if (huh == null) { - throw new java.lang.NullPointerException("huh is marked @NonNull but is null"); + throw new java.lang.NullPointerException("huh is marked non-null but is null"); } if (_huh2 == null) { - throw new java.lang.NullPointerException("_huh2 is marked @NonNull but is null"); + throw new java.lang.NullPointerException("_huh2 is marked non-null but is null"); } this.plower = plower; this.pUpper = upper; diff --git a/test/transform/resource/after-delombok/DataOnLocalClass.java b/test/transform/resource/after-delombok/DataOnLocalClass.java index d611490b..80f3ca83 100644 --- a/test/transform/resource/after-delombok/DataOnLocalClass.java +++ b/test/transform/resource/after-delombok/DataOnLocalClass.java @@ -64,7 +64,7 @@ class DataOnLocalClass2 { @java.lang.SuppressWarnings("all") public InnerLocal(@lombok.NonNull final String name) { if (name == null) { - throw new java.lang.NullPointerException("name is marked @NonNull but is null"); + throw new java.lang.NullPointerException("name is marked non-null but is null"); } this.name = name; } @@ -76,7 +76,7 @@ class DataOnLocalClass2 { @java.lang.SuppressWarnings("all") public void setName(@lombok.NonNull final String name) { if (name == null) { - throw new java.lang.NullPointerException("name is marked @NonNull but is null"); + throw new java.lang.NullPointerException("name is marked non-null but is null"); } this.name = name; } diff --git a/test/transform/resource/after-delombok/NonNullOnParameter.java b/test/transform/resource/after-delombok/NonNullOnParameter.java index fa06e41b..4f6df920 100644 --- a/test/transform/resource/after-delombok/NonNullOnParameter.java +++ b/test/transform/resource/after-delombok/NonNullOnParameter.java @@ -2,22 +2,22 @@ class NonNullOnParameter extends Thread { NonNullOnParameter(@lombok.NonNull String arg) { this(arg, ""); if (arg == null) { - throw new java.lang.NullPointerException("arg is marked @NonNull but is null"); + throw new java.lang.NullPointerException("arg is marked non-null but is null"); } } NonNullOnParameter(@lombok.NonNull String arg, @lombok.NonNull String arg2) { super(arg); if (arg2 == null) { - throw new java.lang.NullPointerException("arg2 is marked @NonNull but is null"); + throw new java.lang.NullPointerException("arg2 is marked non-null but is null"); } if (arg == null) throw new NullPointerException(); } public void test2(@lombok.NonNull String arg, @lombok.NonNull String arg2, @lombok.NonNull String arg3) { if (arg == null) { - throw new java.lang.NullPointerException("arg is marked @NonNull but is null"); + throw new java.lang.NullPointerException("arg is marked non-null but is null"); } if (arg3 == null) { - throw new java.lang.NullPointerException("arg3 is marked @NonNull but is null"); + throw new java.lang.NullPointerException("arg3 is marked non-null but is null"); } if (arg2 == null) { throw new NullPointerException("arg2"); @@ -26,23 +26,29 @@ class NonNullOnParameter extends Thread { } public void test3(@lombok.NonNull String arg) { if (arg == null) { - throw new java.lang.NullPointerException("arg is marked @NonNull but is null"); + throw new java.lang.NullPointerException("arg is marked non-null but is null"); } if (arg != null) throw new IllegalStateException(); } public void test(@lombok.NonNull String stringArg, @lombok.NonNull String arg2, @lombok.NonNull int primitiveArg) { if (stringArg == null) { - throw new java.lang.NullPointerException("stringArg is marked @NonNull but is null"); + throw new java.lang.NullPointerException("stringArg is marked non-null but is null"); } if (arg2 == null) { - throw new java.lang.NullPointerException("arg2 is marked @NonNull but is null"); + throw new java.lang.NullPointerException("arg2 is marked non-null but is null"); } } public void test(@lombok.NonNull String arg) { if (arg == null) { - throw new java.lang.NullPointerException("arg is marked @NonNull but is null"); + throw new java.lang.NullPointerException("arg is marked non-null but is null"); } System.out.println("Hey"); if (arg == null) throw new NullPointerException(); } + public void testWithAssert(@lombok.NonNull String param) { + assert param != null; + } + public void testWithAssertAndMessage(@lombok.NonNull String param) { + assert param != null : "Oops"; + } } diff --git a/test/transform/resource/after-delombok/NonNullOnParameterAbstract.java b/test/transform/resource/after-delombok/NonNullOnParameterAbstract.java index a2dcb49c..88577f25 100644 --- a/test/transform/resource/after-delombok/NonNullOnParameterAbstract.java +++ b/test/transform/resource/after-delombok/NonNullOnParameterAbstract.java @@ -1,7 +1,7 @@ abstract class NonNullOnParameterAbstract { public void test(@lombok.NonNull String arg) { if (arg == null) { - throw new java.lang.NullPointerException("arg is marked @NonNull but is null"); + throw new java.lang.NullPointerException("arg is marked non-null but is null"); } System.out.println("Hey"); } diff --git a/test/transform/resource/after-delombok/NonNullOnParameterOfDefaultMethod.java b/test/transform/resource/after-delombok/NonNullOnParameterOfDefaultMethod.java index cf10253b..876a3440 100644 --- a/test/transform/resource/after-delombok/NonNullOnParameterOfDefaultMethod.java +++ b/test/transform/resource/after-delombok/NonNullOnParameterOfDefaultMethod.java @@ -3,7 +3,7 @@ interface NonNullOnParameterOfDefaultMethod { void test(@lombok.NonNull String arg); default void test2(@lombok.NonNull String arg) { if (arg == null) { - throw new java.lang.NullPointerException("arg is marked @NonNull but is null"); + throw new java.lang.NullPointerException("arg is marked non-null but is null"); } System.out.println(arg); } diff --git a/test/transform/resource/after-delombok/NonNullPlain.java b/test/transform/resource/after-delombok/NonNullPlain.java index d3de3dcf..24377237 100644 --- a/test/transform/resource/after-delombok/NonNullPlain.java +++ b/test/transform/resource/after-delombok/NonNullPlain.java @@ -13,7 +13,7 @@ class NonNullPlain { @java.lang.SuppressWarnings("all") public NonNullPlain(@lombok.NonNull final int i, @lombok.NonNull final String s) { if (s == null) { - throw new java.lang.NullPointerException("s is marked @NonNull but is null"); + throw new java.lang.NullPointerException("s is marked non-null but is null"); } this.i = i; this.s = s; @@ -39,7 +39,7 @@ class NonNullPlain { @java.lang.SuppressWarnings("all") public void setS(@lombok.NonNull final String s) { if (s == null) { - throw new java.lang.NullPointerException("s is marked @NonNull but is null"); + throw new java.lang.NullPointerException("s is marked non-null but is null"); } this.s = s; } diff --git a/test/transform/resource/after-delombok/NonNullTypeUse.java b/test/transform/resource/after-delombok/NonNullTypeUse.java index 27719480..7c438501 100644 --- a/test/transform/resource/after-delombok/NonNullTypeUse.java +++ b/test/transform/resource/after-delombok/NonNullTypeUse.java @@ -2,12 +2,12 @@ import lombok.NonNull; class NonNullTypeUse { void test1(@NonNull String[][][] args) { if (args == null) { - throw new java.lang.NullPointerException("args is marked @NonNull but is null"); + throw new java.lang.NullPointerException("args is marked non-null but is null"); } } void test2(String @NonNull [][][] args) { if (args == null) { - throw new java.lang.NullPointerException("args is marked @NonNull but is null"); + throw new java.lang.NullPointerException("args is marked non-null but is null"); } } void test3(String[] @NonNull [][] args) { @@ -16,17 +16,17 @@ class NonNullTypeUse { } void test5(@NonNull String simple) { if (simple == null) { - throw new java.lang.NullPointerException("simple is marked @NonNull but is null"); + throw new java.lang.NullPointerException("simple is marked non-null but is null"); } } void test6(java.lang.@NonNull String weird) { if (weird == null) { - throw new java.lang.NullPointerException("weird is marked @NonNull but is null"); + throw new java.lang.NullPointerException("weird is marked non-null but is null"); } } void test7(java.lang.String @NonNull [][] weird) { if (weird == null) { - throw new java.lang.NullPointerException("weird is marked @NonNull but is null"); + throw new java.lang.NullPointerException("weird is marked non-null but is null"); } } } diff --git a/test/transform/resource/after-delombok/NonNullWithAlternateException.java b/test/transform/resource/after-delombok/NonNullWithAlternateException.java index 982da7d8..7f30fd1f 100644 --- a/test/transform/resource/after-delombok/NonNullWithAlternateException.java +++ b/test/transform/resource/after-delombok/NonNullWithAlternateException.java @@ -3,14 +3,14 @@ public class NonNullWithAlternateException { private String test; public void testMethod(@lombok.NonNull String arg) { if (arg == null) { - throw new java.lang.IllegalArgumentException("arg is marked @NonNull but is null"); + throw new java.lang.IllegalArgumentException("arg is marked non-null but is null"); } System.out.println(arg); } @java.lang.SuppressWarnings("all") public void setTest(@lombok.NonNull final String test) { if (test == null) { - throw new java.lang.IllegalArgumentException("test is marked @NonNull but is null"); + throw new java.lang.IllegalArgumentException("test is marked non-null but is null"); } this.test = test; } diff --git a/test/transform/resource/after-delombok/NonNullWithAssertion.java b/test/transform/resource/after-delombok/NonNullWithAssertion.java new file mode 100644 index 00000000..15dc0254 --- /dev/null +++ b/test/transform/resource/after-delombok/NonNullWithAssertion.java @@ -0,0 +1,16 @@ +public class NonNullWithAssertion { + @lombok.NonNull + private String test; + public void testMethod(@lombok.NonNull String arg) { + assert arg != null : "arg is marked non-null but is null"; + System.out.println(arg); + } + public void testMethodWithIf(@lombok.NonNull String arg) { + if (arg == null) throw new NullPointerException("Oops"); + } + @java.lang.SuppressWarnings("all") + public void setTest(@lombok.NonNull final String test) { + assert test != null : "test is marked non-null but is null"; + this.test = test; + } +}
\ No newline at end of file diff --git a/test/transform/resource/after-delombok/NonNullWithSneakyThrows.java b/test/transform/resource/after-delombok/NonNullWithSneakyThrows.java index 5000f16d..44640164 100644 --- a/test/transform/resource/after-delombok/NonNullWithSneakyThrows.java +++ b/test/transform/resource/after-delombok/NonNullWithSneakyThrows.java @@ -2,7 +2,7 @@ class NonNullWithSneakyThrows { void test(@lombok.NonNull String in) { try { if (in == null) { - throw new java.lang.NullPointerException("in is marked @NonNull but is null"); + throw new java.lang.NullPointerException("in is marked non-null but is null"); } System.out.println(in); } catch (final java.lang.Throwable $ex) { diff --git a/test/transform/resource/after-delombok/SetterOnClass.java b/test/transform/resource/after-delombok/SetterOnClass.java index f880e20b..24f376cb 100644 --- a/test/transform/resource/after-delombok/SetterOnClass.java +++ b/test/transform/resource/after-delombok/SetterOnClass.java @@ -54,7 +54,7 @@ class SetterOnClass6 { @java.lang.SuppressWarnings("all") public void setNonNull(@lombok.NonNull final String nonNull) { if (nonNull == null) { - throw new java.lang.NullPointerException("nonNull is marked @NonNull but is null"); + throw new java.lang.NullPointerException("nonNull is marked non-null but is null"); } this.nonNull = nonNull; } diff --git a/test/transform/resource/after-delombok/SuperBuilderSingularAnnotatedTypes.java b/test/transform/resource/after-delombok/SuperBuilderSingularAnnotatedTypes.java index 1baf81aa..61c2557c 100644 --- a/test/transform/resource/after-delombok/SuperBuilderSingularAnnotatedTypes.java +++ b/test/transform/resource/after-delombok/SuperBuilderSingularAnnotatedTypes.java @@ -24,7 +24,7 @@ class SuperBuilderSingularAnnotatedTypes { @java.lang.SuppressWarnings("all") public B foo(@MyAnnotation @NonNull final String foo) { if (foo == null) { - throw new java.lang.NullPointerException("foo is marked @NonNull but is null"); + throw new java.lang.NullPointerException("foo is marked non-null but is null"); } if (this.foos == null) this.foos = new java.util.ArrayList<@MyAnnotation @NonNull String>(); this.foos.add(foo); @@ -44,10 +44,10 @@ class SuperBuilderSingularAnnotatedTypes { @java.lang.SuppressWarnings("all") public B bar(@MyAnnotation @NonNull final String barKey, @MyAnnotation @NonNull final Integer barValue) { if (barKey == null) { - throw new java.lang.NullPointerException("barKey is marked @NonNull but is null"); + throw new java.lang.NullPointerException("barKey is marked non-null but is null"); } if (barValue == null) { - throw new java.lang.NullPointerException("barValue is marked @NonNull but is null"); + throw new java.lang.NullPointerException("barValue is marked non-null but is null"); } if (this.bars$key == null) { this.bars$key = new java.util.ArrayList<@MyAnnotation @NonNull String>(); diff --git a/test/transform/resource/after-delombok/SuperBuilderWithNonNull.java b/test/transform/resource/after-delombok/SuperBuilderWithNonNull.java index cac5482b..ce5c838c 100644 --- a/test/transform/resource/after-delombok/SuperBuilderWithNonNull.java +++ b/test/transform/resource/after-delombok/SuperBuilderWithNonNull.java @@ -20,7 +20,7 @@ public class SuperBuilderWithNonNull { @java.lang.SuppressWarnings("all")
public B nonNullParentField(@lombok.NonNull final String nonNullParentField) {
if (nonNullParentField == null) {
- throw new java.lang.NullPointerException("nonNullParentField is marked @NonNull but is null");
+ throw new java.lang.NullPointerException("nonNullParentField is marked non-null but is null");
}
this.nonNullParentField = nonNullParentField;
nonNullParentField$set = true;
@@ -53,7 +53,7 @@ public class SuperBuilderWithNonNull { if (b.nonNullParentField$set) this.nonNullParentField = b.nonNullParentField;
else this.nonNullParentField = Parent.$default$nonNullParentField();
if (nonNullParentField == null) {
- throw new java.lang.NullPointerException("nonNullParentField is marked @NonNull but is null");
+ throw new java.lang.NullPointerException("nonNullParentField is marked non-null but is null");
}
}
@java.lang.SuppressWarnings("all")
@@ -77,7 +77,7 @@ public class SuperBuilderWithNonNull { @java.lang.SuppressWarnings("all")
public B nonNullChildField(@lombok.NonNull final String nonNullChildField) {
if (nonNullChildField == null) {
- throw new java.lang.NullPointerException("nonNullChildField is marked @NonNull but is null");
+ throw new java.lang.NullPointerException("nonNullChildField is marked non-null but is null");
}
this.nonNullChildField = nonNullChildField;
return self();
@@ -109,7 +109,7 @@ public class SuperBuilderWithNonNull { super(b);
this.nonNullChildField = b.nonNullChildField;
if (nonNullChildField == null) {
- throw new java.lang.NullPointerException("nonNullChildField is marked @NonNull but is null");
+ throw new java.lang.NullPointerException("nonNullChildField is marked non-null but is null");
}
}
@java.lang.SuppressWarnings("all")
diff --git a/test/transform/resource/after-delombok/WitherOnClass.java b/test/transform/resource/after-delombok/WitherOnClass.java index 93309c89..abc93446 100644 --- a/test/transform/resource/after-delombok/WitherOnClass.java +++ b/test/transform/resource/after-delombok/WitherOnClass.java @@ -36,7 +36,7 @@ class WitherOnClass3 { @java.lang.SuppressWarnings("all") public WitherOnClass3 withNonNull(@lombok.NonNull final String nonNull) { if (nonNull == null) { - throw new java.lang.NullPointerException("nonNull is marked @NonNull but is null"); + throw new java.lang.NullPointerException("nonNull is marked non-null but is null"); } return this.nonNull == nonNull ? this : new WitherOnClass3(this.couldBeNull, nonNull); } diff --git a/test/transform/resource/after-ecj/BuilderSingularAnnotatedTypes.java b/test/transform/resource/after-ecj/BuilderSingularAnnotatedTypes.java index 26023e1a..511c153a 100644 --- a/test/transform/resource/after-ecj/BuilderSingularAnnotatedTypes.java +++ b/test/transform/resource/after-ecj/BuilderSingularAnnotatedTypes.java @@ -17,7 +17,7 @@ import lombok.Singular; public @java.lang.SuppressWarnings("all") BuilderSingularAnnotatedTypesBuilder foo(final @MyAnnotation @NonNull String foo) { if ((foo == null)) { - throw new java.lang.NullPointerException("foo is marked @NonNull but is null"); + throw new java.lang.NullPointerException("foo is marked non-null but is null"); } if ((this.foos == null)) this.foos = new java.util.ArrayList<@MyAnnotation @NonNull String>(); @@ -38,11 +38,11 @@ import lombok.Singular; public @java.lang.SuppressWarnings("all") BuilderSingularAnnotatedTypesBuilder bar(final @MyAnnotation @NonNull String barKey, final @MyAnnotation @NonNull Integer barValue) { if ((barKey == null)) { - throw new java.lang.NullPointerException("barKey is marked @NonNull but is null"); + throw new java.lang.NullPointerException("barKey is marked non-null but is null"); } if ((barValue == null)) { - throw new java.lang.NullPointerException("barValue is marked @NonNull but is null"); + throw new java.lang.NullPointerException("barValue is marked non-null but is null"); } if ((this.bars$key == null)) { diff --git a/test/transform/resource/after-ecj/ConstructorsWithAccessors.java b/test/transform/resource/after-ecj/ConstructorsWithAccessors.java index 6050ab9f..552c5c2d 100644 --- a/test/transform/resource/after-ecj/ConstructorsWithAccessors.java +++ b/test/transform/resource/after-ecj/ConstructorsWithAccessors.java @@ -20,19 +20,19 @@ super(); if ((plower == null)) { - throw new java.lang.NullPointerException("plower is marked @NonNull but is null"); + throw new java.lang.NullPointerException("plower is marked non-null but is null"); } if ((upper == null)) { - throw new java.lang.NullPointerException("upper is marked @NonNull but is null"); + throw new java.lang.NullPointerException("upper is marked non-null but is null"); } if ((huh == null)) { - throw new java.lang.NullPointerException("huh is marked @NonNull but is null"); + throw new java.lang.NullPointerException("huh is marked non-null but is null"); } if ((_huh2 == null)) { - throw new java.lang.NullPointerException("_huh2 is marked @NonNull but is null"); + throw new java.lang.NullPointerException("_huh2 is marked non-null but is null"); } this.plower = plower; this.pUpper = upper; diff --git a/test/transform/resource/after-ecj/DataOnLocalClass.java b/test/transform/resource/after-ecj/DataOnLocalClass.java index ff2a3d20..ae986676 100644 --- a/test/transform/resource/after-ecj/DataOnLocalClass.java +++ b/test/transform/resource/after-ecj/DataOnLocalClass.java @@ -64,7 +64,7 @@ class DataOnLocalClass2 { public @java.lang.SuppressWarnings("all") void setName(final @lombok.NonNull String name) { if ((name == null)) { - throw new java.lang.NullPointerException("name is marked @NonNull but is null"); + throw new java.lang.NullPointerException("name is marked non-null but is null"); } this.name = name; } @@ -99,7 +99,7 @@ class DataOnLocalClass2 { super(); if ((name == null)) { - throw new java.lang.NullPointerException("name is marked @NonNull but is null"); + throw new java.lang.NullPointerException("name is marked non-null but is null"); } this.name = name; } diff --git a/test/transform/resource/after-ecj/NonNullOnParameter.java b/test/transform/resource/after-ecj/NonNullOnParameter.java index fde47e1d..4f873ab6 100644 --- a/test/transform/resource/after-ecj/NonNullOnParameter.java +++ b/test/transform/resource/after-ecj/NonNullOnParameter.java @@ -1,16 +1,18 @@ class NonNullOnParameter extends Thread { + <clinit>() { + } NonNullOnParameter(@lombok.NonNull String arg) { this(arg, ""); if ((arg == null)) { - throw new java.lang.NullPointerException("arg is marked @NonNull but is null"); + throw new java.lang.NullPointerException("arg is marked non-null but is null"); } } NonNullOnParameter(@lombok.NonNull String arg, @lombok.NonNull String arg2) { super(arg); if ((arg2 == null)) { - throw new java.lang.NullPointerException("arg2 is marked @NonNull but is null"); + throw new java.lang.NullPointerException("arg2 is marked non-null but is null"); } if ((arg == null)) throw new NullPointerException(); @@ -18,11 +20,11 @@ class NonNullOnParameter extends Thread { public void test2(@lombok.NonNull String arg, @lombok.NonNull String arg2, @lombok.NonNull String arg3) { if ((arg == null)) { - throw new java.lang.NullPointerException("arg is marked @NonNull but is null"); + throw new java.lang.NullPointerException("arg is marked non-null but is null"); } if ((arg3 == null)) { - throw new java.lang.NullPointerException("arg3 is marked @NonNull but is null"); + throw new java.lang.NullPointerException("arg3 is marked non-null but is null"); } if ((arg2 == null)) { @@ -34,7 +36,7 @@ class NonNullOnParameter extends Thread { public void test3(@lombok.NonNull String arg) { if ((arg == null)) { - throw new java.lang.NullPointerException("arg is marked @NonNull but is null"); + throw new java.lang.NullPointerException("arg is marked non-null but is null"); } if ((arg != null)) throw new IllegalStateException(); @@ -42,20 +44,26 @@ class NonNullOnParameter extends Thread { public void test(@lombok.NonNull String stringArg, @lombok.NonNull String arg2, @lombok.NonNull int primitiveArg) { if ((stringArg == null)) { - throw new java.lang.NullPointerException("stringArg is marked @NonNull but is null"); + throw new java.lang.NullPointerException("stringArg is marked non-null but is null"); } if ((arg2 == null)) { - throw new java.lang.NullPointerException("arg2 is marked @NonNull but is null"); + throw new java.lang.NullPointerException("arg2 is marked non-null but is null"); } } public void test(@lombok.NonNull String arg) { if ((arg == null)) { - throw new java.lang.NullPointerException("arg is marked @NonNull but is null"); + throw new java.lang.NullPointerException("arg is marked non-null but is null"); } System.out.println("Hey"); if ((arg == null)) throw new NullPointerException(); } + public void testWithAssert(@lombok.NonNull String param) { + assert (param != null); + } + public void testWithAssertAndMessage(@lombok.NonNull String param) { + assert (param != null): "Oops"; + } }
\ No newline at end of file diff --git a/test/transform/resource/after-ecj/NonNullOnParameterAbstract.java b/test/transform/resource/after-ecj/NonNullOnParameterAbstract.java index d3e1fdd6..cc8ddcaa 100644 --- a/test/transform/resource/after-ecj/NonNullOnParameterAbstract.java +++ b/test/transform/resource/after-ecj/NonNullOnParameterAbstract.java @@ -5,7 +5,7 @@ abstract class NonNullOnParameterAbstract { public void test(@lombok.NonNull String arg) { if ((arg == null)) { - throw new java.lang.NullPointerException("arg is marked @NonNull but is null"); + throw new java.lang.NullPointerException("arg is marked non-null but is null"); } System.out.println("Hey"); } diff --git a/test/transform/resource/after-ecj/NonNullOnParameterOfDefaultMethod.java b/test/transform/resource/after-ecj/NonNullOnParameterOfDefaultMethod.java index 7293bcf5..830cff13 100644 --- a/test/transform/resource/after-ecj/NonNullOnParameterOfDefaultMethod.java +++ b/test/transform/resource/after-ecj/NonNullOnParameterOfDefaultMethod.java @@ -3,7 +3,7 @@ interface NonNullOnParameterOfDefaultMethod { default void test2(@lombok.NonNull String arg) { if ((arg == null)) { - throw new java.lang.NullPointerException("arg is marked @NonNull but is null"); + throw new java.lang.NullPointerException("arg is marked non-null but is null"); } System.out.println(arg); } diff --git a/test/transform/resource/after-ecj/NonNullPlain.java b/test/transform/resource/after-ecj/NonNullPlain.java index c703f38a..bf43cb7f 100644 --- a/test/transform/resource/after-ecj/NonNullPlain.java +++ b/test/transform/resource/after-ecj/NonNullPlain.java @@ -9,7 +9,7 @@ import java.lang.annotation.*; super(); if ((s == null)) { - throw new java.lang.NullPointerException("s is marked @NonNull but is null"); + throw new java.lang.NullPointerException("s is marked non-null but is null"); } this.i = i; this.s = s; @@ -29,7 +29,7 @@ import java.lang.annotation.*; public @java.lang.SuppressWarnings("all") void setS(final @lombok.NonNull String s) { if ((s == null)) { - throw new java.lang.NullPointerException("s is marked @NonNull but is null"); + throw new java.lang.NullPointerException("s is marked non-null but is null"); } this.s = s; } diff --git a/test/transform/resource/after-ecj/NonNullTypeUse.java b/test/transform/resource/after-ecj/NonNullTypeUse.java index 4cf1aa5a..add140ea 100644 --- a/test/transform/resource/after-ecj/NonNullTypeUse.java +++ b/test/transform/resource/after-ecj/NonNullTypeUse.java @@ -6,13 +6,13 @@ class NonNullTypeUse { void test1(@NonNull String[][][] args) { if ((args == null)) { - throw new java.lang.NullPointerException("args is marked @NonNull but is null"); + throw new java.lang.NullPointerException("args is marked non-null but is null"); } } void test2(String @NonNull [][][] args) { if ((args == null)) { - throw new java.lang.NullPointerException("args is marked @NonNull but is null"); + throw new java.lang.NullPointerException("args is marked non-null but is null"); } } void test3(String[] @NonNull [][] args) { @@ -22,19 +22,19 @@ class NonNullTypeUse { void test5(@NonNull String simple) { if ((simple == null)) { - throw new java.lang.NullPointerException("simple is marked @NonNull but is null"); + throw new java.lang.NullPointerException("simple is marked non-null but is null"); } } void test6(java.lang.@NonNull String weird) { if ((weird == null)) { - throw new java.lang.NullPointerException("weird is marked @NonNull but is null"); + throw new java.lang.NullPointerException("weird is marked non-null but is null"); } } void test7(java.lang.String @NonNull [][] weird) { if ((weird == null)) { - throw new java.lang.NullPointerException("weird is marked @NonNull but is null"); + throw new java.lang.NullPointerException("weird is marked non-null but is null"); } } }
\ No newline at end of file diff --git a/test/transform/resource/after-ecj/NonNullWithAlternateException.java b/test/transform/resource/after-ecj/NonNullWithAlternateException.java index 39e9c0a8..9a2a4e3d 100644 --- a/test/transform/resource/after-ecj/NonNullWithAlternateException.java +++ b/test/transform/resource/after-ecj/NonNullWithAlternateException.java @@ -6,14 +6,14 @@ public class NonNullWithAlternateException { public void testMethod(@lombok.NonNull String arg) { if ((arg == null)) { - throw new java.lang.IllegalArgumentException("arg is marked @NonNull but is null"); + throw new java.lang.IllegalArgumentException("arg is marked non-null but is null"); } System.out.println(arg); } public @java.lang.SuppressWarnings("all") void setTest(final @lombok.NonNull String test) { if ((test == null)) { - throw new java.lang.IllegalArgumentException("test is marked @NonNull but is null"); + throw new java.lang.IllegalArgumentException("test is marked non-null but is null"); } this.test = test; } diff --git a/test/transform/resource/after-ecj/NonNullWithAssertion.java b/test/transform/resource/after-ecj/NonNullWithAssertion.java new file mode 100644 index 00000000..d6f2b0f1 --- /dev/null +++ b/test/transform/resource/after-ecj/NonNullWithAssertion.java @@ -0,0 +1,18 @@ +public class NonNullWithAssertion { + private @lombok.NonNull @lombok.Setter String test; + public NonNullWithAssertion() { + super(); + } + public void testMethod(@lombok.NonNull String arg) { + assert (arg != null): "arg is marked non-null but is null"; + System.out.println(arg); + } + public void testMethodWithIf(@lombok.NonNull String arg) { + if ((arg == null)) + throw new NullPointerException("Oops"); + } + public @java.lang.SuppressWarnings("all") void setTest(final @lombok.NonNull String test) { + assert (test != null): "test is marked non-null but is null"; + this.test = test; + } +}
\ No newline at end of file diff --git a/test/transform/resource/after-ecj/NonNullWithSneakyThrows.java b/test/transform/resource/after-ecj/NonNullWithSneakyThrows.java index 22799b5e..ee08dbf8 100644 --- a/test/transform/resource/after-ecj/NonNullWithSneakyThrows.java +++ b/test/transform/resource/after-ecj/NonNullWithSneakyThrows.java @@ -7,7 +7,7 @@ class NonNullWithSneakyThrows { { if ((in == null)) { - throw new java.lang.NullPointerException("in is marked @NonNull but is null"); + throw new java.lang.NullPointerException("in is marked non-null but is null"); } System.out.println(in); } diff --git a/test/transform/resource/after-ecj/SetterOnClass.java b/test/transform/resource/after-ecj/SetterOnClass.java index c7aec900..9ed77bd4 100644 --- a/test/transform/resource/after-ecj/SetterOnClass.java +++ b/test/transform/resource/after-ecj/SetterOnClass.java @@ -64,7 +64,7 @@ public @java.lang.SuppressWarnings("all") void setNonNull(final @lombok.NonNull String nonNull) { if ((nonNull == null)) { - throw new java.lang.NullPointerException("nonNull is marked @NonNull but is null"); + throw new java.lang.NullPointerException("nonNull is marked non-null but is null"); } this.nonNull = nonNull; } diff --git a/test/transform/resource/after-ecj/SuperBuilderSingularAnnotatedTypes.java b/test/transform/resource/after-ecj/SuperBuilderSingularAnnotatedTypes.java index bb02024d..9b89f2a8 100644 --- a/test/transform/resource/after-ecj/SuperBuilderSingularAnnotatedTypes.java +++ b/test/transform/resource/after-ecj/SuperBuilderSingularAnnotatedTypes.java @@ -19,7 +19,7 @@ import lombok.Singular; public @java.lang.SuppressWarnings("all") B foo(final @MyAnnotation @NonNull String foo) { if ((foo == null)) { - throw new java.lang.NullPointerException("foo is marked @NonNull but is null"); + throw new java.lang.NullPointerException("foo is marked non-null but is null"); } if ((this.foos == null)) this.foos = new java.util.ArrayList<@MyAnnotation @NonNull String>(); @@ -40,11 +40,11 @@ import lombok.Singular; public @java.lang.SuppressWarnings("all") B bar(final @MyAnnotation @NonNull String barKey, final @MyAnnotation @NonNull Integer barValue) { if ((barKey == null)) { - throw new java.lang.NullPointerException("barKey is marked @NonNull but is null"); + throw new java.lang.NullPointerException("barKey is marked non-null but is null"); } if ((barValue == null)) { - throw new java.lang.NullPointerException("barValue is marked @NonNull but is null"); + throw new java.lang.NullPointerException("barValue is marked non-null but is null"); } if ((this.bars$key == null)) { diff --git a/test/transform/resource/after-ecj/SuperBuilderWithNonNull.java b/test/transform/resource/after-ecj/SuperBuilderWithNonNull.java index 1c4bd53d..4b5cb188 100644 --- a/test/transform/resource/after-ecj/SuperBuilderWithNonNull.java +++ b/test/transform/resource/after-ecj/SuperBuilderWithNonNull.java @@ -41,7 +41,7 @@ public class SuperBuilderWithNonNull { this.nonNullParentField = Parent.$default$nonNullParentField();
if ((nonNullParentField == null))
{
- throw new java.lang.NullPointerException("nonNullParentField is marked @NonNull but is null");
+ throw new java.lang.NullPointerException("nonNullParentField is marked non-null but is null");
}
}
public static @java.lang.SuppressWarnings("all") ParentBuilder<?, ?> builder() {
@@ -81,7 +81,7 @@ public class SuperBuilderWithNonNull { this.nonNullChildField = b.nonNullChildField;
if ((nonNullChildField == null))
{
- throw new java.lang.NullPointerException("nonNullChildField is marked @NonNull but is null");
+ throw new java.lang.NullPointerException("nonNullChildField is marked non-null but is null");
}
}
public static @java.lang.SuppressWarnings("all") ChildBuilder<?, ?> builder() {
diff --git a/test/transform/resource/after-ecj/WitherOnClass.java b/test/transform/resource/after-ecj/WitherOnClass.java index 086ba591..166d1842 100644 --- a/test/transform/resource/after-ecj/WitherOnClass.java +++ b/test/transform/resource/after-ecj/WitherOnClass.java @@ -34,7 +34,7 @@ public @java.lang.SuppressWarnings("all") WitherOnClass3 withNonNull(final @lombok.NonNull String nonNull) { if ((nonNull == null)) { - throw new java.lang.NullPointerException("nonNull is marked @NonNull but is null"); + throw new java.lang.NullPointerException("nonNull is marked non-null but is null"); } return ((this.nonNull == nonNull) ? this : new WitherOnClass3(this.couldBeNull, nonNull)); } diff --git a/test/transform/resource/before/NonNullOnParameter.java b/test/transform/resource/before/NonNullOnParameter.java index 7eb4c565..22aceac7 100644 --- a/test/transform/resource/before/NonNullOnParameter.java +++ b/test/transform/resource/before/NonNullOnParameter.java @@ -27,4 +27,13 @@ class NonNullOnParameter extends Thread { System.out.println("Hey"); if (arg == null) throw new NullPointerException(); } + + public void testWithAssert(@lombok.NonNull String param) { + assert param != null; + } + + public void testWithAssertAndMessage(@lombok.NonNull String param) { + assert param != null : "Oops"; + } + }
\ No newline at end of file diff --git a/test/transform/resource/before/NonNullWithAssertion.java b/test/transform/resource/before/NonNullWithAssertion.java new file mode 100644 index 00000000..c3d271a6 --- /dev/null +++ b/test/transform/resource/before/NonNullWithAssertion.java @@ -0,0 +1,13 @@ +//CONF: lombok.nonNull.exceptionType = Assertion + +public class NonNullWithAssertion { + @lombok.NonNull @lombok.Setter private String test; + + public void testMethod(@lombok.NonNull String arg) { + System.out.println(arg); + } + + public void testMethodWithIf(@lombok.NonNull String arg) { + if (arg == null) throw new NullPointerException("Oops"); + } +} diff --git a/website/templates/features/NonNull.html b/website/templates/features/NonNull.html index 66ab2fc2..b09f0cda 100644 --- a/website/templates/features/NonNull.html +++ b/website/templates/features/NonNull.html @@ -21,9 +21,9 @@ <@f.confKeys> <dt> - <code>lombok.nonNull.exceptionType</code> = [<code>NullPointerException</code> | <code>IllegalArgumentException</code>] (default: <code>NullPointerException</code>). + <code>lombok.nonNull.exceptionType</code> = [<code>NullPointerException</code> | <code>IllegalArgumentException</code> | <code>Assertion</code>] (default: <code>NullPointerException</code>). </dt><dd> - When lombok generates a null-check <code>if</code> statement, by default, a <code>java.lang.NullPointerException</code> will be thrown with '<em>field name</em> is marked @NonNull but is null' as the exception message. However, you can use <code>IllegalArgumentException</code> in this configuration key to have lombok throw that exception with this message instead. + When lombok generates a null-check <code>if</code> statement, by default, a <code>java.lang.NullPointerException</code> will be thrown with '<em>field name</em> is marked @non-null but is null' as the exception message. However, you can use <code>IllegalArgumentException</code> in this configuration key to have lombok throw that exception with this message instead. By using <code>Assertion</code>, an <code>assert</code> statement with the same message will be generated. </dd><dt> <code>lombok.nonNull.flagUsage</code> = [<code>warning</code> | <code>error</code>] (default: not set) </dt><dd> @@ -33,7 +33,7 @@ <@f.smallPrint> <p> - Lombok's detection scheme for already existing null-checks consists of scanning for if statements that look just like lombok's own. Any 'throws' statement as the 'then' part of the if statement, whether in braces or not, counts. The conditional of the if statement <em>must</em> look exactly like <code>PARAMNAME == null</code>. The first statement in your method that is not such a null-check stops the process of inspecting for null-checks. + Lombok's detection scheme for already existing null-checks consists of scanning for if statements or assert statements that look just like lombok's own. Any 'throws' statement as the 'then' part of the if statement, whether in braces or not, counts. The conditional of the if statement <em>must</em> look exactly like <code>PARAMNAME == null</code>; the assert statement <em>must</em> look exactly like <code>PARAMNAME != null</code>. The first statement in your method that is not such a null-check stops the process of inspecting for null-checks. </p><p> While <code>@Data</code> and other method-generating lombok annotations will trigger on various well-known annotations that signify the field must never be <code>@NonNull</code>, this feature only triggers on lombok's own <code>@NonNull</code> annotation from the <code>lombok</code> package. </p><p> |