Skip to content

Commit

Permalink
[fixes #3133] Additional bits setting when creating type annotations
Browse files Browse the repository at this point in the history
  • Loading branch information
jopatai committed Mar 14, 2022
1 parent 70bda54 commit 0a1afc8
Show file tree
Hide file tree
Showing 7 changed files with 26 additions and 17 deletions.
18 changes: 11 additions & 7 deletions src/core/lombok/eclipse/handlers/EclipseHandlerUtil.java
Expand Up @@ -2601,25 +2601,25 @@ public static void createRelevantNonNullAnnotation(EclipseNode typeNode, MethodD
applyAnnotationToMethodDecl(typeNode, mth, lib.getNonNullAnnotation(), lib.isTypeUse());
}

public static void createRelevantNullableAnnotation(EclipseNode typeNode, Argument arg) {
public static void createRelevantNullableAnnotation(EclipseNode typeNode, Argument arg, MethodDeclaration mth) {
NullAnnotationLibrary lib = typeNode.getAst().readConfiguration(ConfigurationKeys.ADD_NULL_ANNOTATIONS);
if (lib == null) return;

applyAnnotationToVarDecl(typeNode, arg, lib.getNullableAnnotation(), lib.isTypeUse());
applyAnnotationToVarDecl(typeNode, arg, mth, lib.getNullableAnnotation(), lib.isTypeUse());
}

public static void createRelevantNullableAnnotation(EclipseNode typeNode, Argument arg, List<NullAnnotationLibrary> applied) {
public static void createRelevantNullableAnnotation(EclipseNode typeNode, Argument arg, MethodDeclaration mth, List<NullAnnotationLibrary> applied) {
NullAnnotationLibrary lib = typeNode.getAst().readConfiguration(ConfigurationKeys.ADD_NULL_ANNOTATIONS);
if (lib == null || applied.contains(lib)) return;

applyAnnotationToVarDecl(typeNode, arg, lib.getNullableAnnotation(), lib.isTypeUse());
applyAnnotationToVarDecl(typeNode, arg, mth, lib.getNullableAnnotation(), lib.isTypeUse());
}

public static void createRelevantNonNullAnnotation(EclipseNode typeNode, Argument arg) {
public static void createRelevantNonNullAnnotation(EclipseNode typeNode, Argument arg, MethodDeclaration mth) {
NullAnnotationLibrary lib = typeNode.getAst().readConfiguration(ConfigurationKeys.ADD_NULL_ANNOTATIONS);
if (lib == null) return;

applyAnnotationToVarDecl(typeNode, arg, lib.getNonNullAnnotation(), lib.isTypeUse());
applyAnnotationToVarDecl(typeNode, arg, mth, lib.getNonNullAnnotation(), lib.isTypeUse());
}

private static void applyAnnotationToMethodDecl(EclipseNode typeNode, MethodDeclaration mth, String annType, boolean typeUse) {
Expand Down Expand Up @@ -2653,9 +2653,10 @@ private static void applyAnnotationToMethodDecl(EclipseNode typeNode, MethodDecl
}
a[0] = ann;
mth.returnType.annotations[len - 1] = a;
mth.bits |= Eclipse.HasTypeAnnotations;
}
}
private static void applyAnnotationToVarDecl(EclipseNode typeNode, Argument arg, String annType, boolean typeUse) {
private static void applyAnnotationToVarDecl(EclipseNode typeNode, Argument arg, MethodDeclaration mth, String annType, boolean typeUse) {
if (annType == null) return;

int partCount = 1;
Expand Down Expand Up @@ -2686,6 +2687,9 @@ private static void applyAnnotationToVarDecl(EclipseNode typeNode, Argument arg,
}
a[0] = ann;
arg.type.annotations[len - 1] = a;
arg.type.bits |= Eclipse.HasTypeAnnotations;
arg.bits |= Eclipse.HasTypeAnnotations;
mth.bits |= Eclipse.HasTypeAnnotations;
}
}

Expand Down
7 changes: 4 additions & 3 deletions src/core/lombok/eclipse/handlers/EclipseSingularsRecipes.java
Expand Up @@ -44,6 +44,7 @@
import org.eclipse.jdt.internal.compiler.ast.IfStatement;
import org.eclipse.jdt.internal.compiler.ast.IntLiteral;
import org.eclipse.jdt.internal.compiler.ast.MessageSend;
import org.eclipse.jdt.internal.compiler.ast.MethodDeclaration;
import org.eclipse.jdt.internal.compiler.ast.NullLiteral;
import org.eclipse.jdt.internal.compiler.ast.OperatorIds;
import org.eclipse.jdt.internal.compiler.ast.ParameterizedQualifiedTypeReference;
Expand Down Expand Up @@ -430,7 +431,7 @@ protected static Reference getBuilderReference(String builderVariable) {
}
}

protected void nullBehaviorize(EclipseNode typeNode, SingularData data, List<Statement> statements, Argument arg) {
protected void nullBehaviorize(EclipseNode typeNode, SingularData data, List<Statement> statements, Argument arg, MethodDeclaration md) {
boolean ignoreNullCollections = data.isIgnoreNullCollections();

if (ignoreNullCollections) {
Expand All @@ -439,11 +440,11 @@ protected void nullBehaviorize(EclipseNode typeNode, SingularData data, List<Sta
b.statements = statements.toArray(new Statement[statements.size()]);
statements.clear();
statements.add(new IfStatement(isNotNull, b, 0, 0));
EclipseHandlerUtil.createRelevantNullableAnnotation(typeNode, arg);
EclipseHandlerUtil.createRelevantNullableAnnotation(typeNode, arg, md);
return;
}

EclipseHandlerUtil.createRelevantNonNullAnnotation(typeNode, arg);
EclipseHandlerUtil.createRelevantNonNullAnnotation(typeNode, arg, md);
Statement nullCheck = EclipseHandlerUtil.generateNullCheck(null, data.getPluralName(), typeNode, "%s cannot be null");
statements.add(0, nullCheck);
}
Expand Down
10 changes: 7 additions & 3 deletions src/core/lombok/eclipse/handlers/HandleEqualsAndHashCode.java
Expand Up @@ -642,13 +642,17 @@ public MethodDeclaration createEquals(EclipseNode type, Collection<Included<Ecli
method.bodyStart = method.declarationSourceStart = method.sourceStart = source.sourceStart;
method.bodyEnd = method.declarationSourceEnd = method.sourceEnd = source.sourceEnd;
QualifiedTypeReference objectRef = new QualifiedTypeReference(TypeConstants.JAVA_LANG_OBJECT, new long[] { p, p, p });
if (onParamTypeNullable != null) objectRef.annotations = new Annotation[][] {null, null, onParamTypeNullable};
if (onParamTypeNullable != null) {
objectRef.annotations = new Annotation[][] {null, null, onParamTypeNullable};
objectRef.bits |= Eclipse.HasTypeAnnotations;
method.bits |= Eclipse.HasTypeAnnotations;
}
setGeneratedBy(objectRef, source);
method.arguments = new Argument[] {new Argument(new char[] { 'o' }, 0, objectRef, Modifier.FINAL)};
method.arguments[0].sourceStart = pS; method.arguments[0].sourceEnd = pE;
if (!onParam.isEmpty() || onParamNullable != null)
method.arguments[0].annotations = copyAnnotations(source, onParam.toArray(new Annotation[0]), onParamNullable);
EclipseHandlerUtil.createRelevantNullableAnnotation(type, method.arguments[0], applied);
EclipseHandlerUtil.createRelevantNullableAnnotation(type, method.arguments[0], method, applied);
setGeneratedBy(method.arguments[0], source);

List<Statement> statements = new ArrayList<Statement>();
Expand Down Expand Up @@ -898,7 +902,7 @@ public MethodDeclaration createCanEqual(EclipseNode type, ASTNode source, List<A
method.arguments = new Argument[] {new Argument(otherName, 0, objectRef, Modifier.FINAL)};
method.arguments[0].sourceStart = pS; method.arguments[0].sourceEnd = pE;
if (!onParam.isEmpty()) method.arguments[0].annotations = onParam.toArray(new Annotation[0]);
EclipseHandlerUtil.createRelevantNullableAnnotation(type, method.arguments[0]);
EclipseHandlerUtil.createRelevantNullableAnnotation(type, method.arguments[0], method);
setGeneratedBy(method.arguments[0], source);

SingleNameReference otherRef = new SingleNameReference(otherName, p);
Expand Down
2 changes: 1 addition & 1 deletion src/core/lombok/eclipse/handlers/HandleWithBy.java
Expand Up @@ -373,7 +373,7 @@ public MethodDeclaration createWithBy(TypeDeclaration parent, EclipseNode fieldN
method.statements = statements.toArray(new Statement[0]);
}

createRelevantNonNullAnnotation(sourceNode, param);
createRelevantNonNullAnnotation(sourceNode, param, method);
createRelevantNonNullAnnotation(fieldNode, method);

method.traverse(new SetGeneratedByVisitor(source), parent.scope);
Expand Down
Expand Up @@ -207,7 +207,7 @@ void generatePluralMethod(CheckerFrameworkVersion cfv, boolean deprecate, TypeRe
paramType = addTypeArgs(getTypeArgumentsCount(), true, builderType, paramType, data.getTypeArgs());
Argument param = new Argument(data.getPluralName(), 0, paramType, ClassFileConstants.AccFinal);

nullBehaviorize(builderType, data, statements, param);
nullBehaviorize(builderType, data, statements, param, md);

if (returnStatement != null) statements.add(returnStatement);

Expand Down
Expand Up @@ -184,7 +184,7 @@ void generatePluralMethod(CheckerFrameworkVersion cfv, boolean deprecate, TypeRe
paramType = addTypeArgs(1, true, builderType, paramType, data.getTypeArgs());
Argument param = new Argument(data.getPluralName(), 0, paramType, ClassFileConstants.AccFinal);

nullBehaviorize(builderType, data, statements, param);
nullBehaviorize(builderType, data, statements, param, md);
if (returnStatement != null) statements.add(returnStatement);

md.statements = statements.toArray(new Statement[0]);
Expand Down
Expand Up @@ -316,7 +316,7 @@ private void generatePluralMethod(CheckerFrameworkVersion cfv, boolean deprecate
paramType = addTypeArgs(2, true, builderType, paramType, data.getTypeArgs());
Argument param = new Argument(data.getPluralName(), 0, paramType, ClassFileConstants.AccFinal);

nullBehaviorize(builderType, data, statements, param);
nullBehaviorize(builderType, data, statements, param, md);

if (returnStatement != null) statements.add(returnStatement);

Expand Down

0 comments on commit 0a1afc8

Please sign in to comment.