mirror of
https://github.com/tiennm99/lombok.git
synced 2026-10-18 14:13:43 +00:00
Merge branch 'master' into clone-type
This commit is contained in:
53 files changed
+1343
-207
No files matched your search
@@ -10,6 +10,7 @@ Dawid Rusin <dawidrusin90@gmail.com>
|
||||
Emil Lundberg <emil@yubico.com>
|
||||
Enrique da Costa Cambio <enrique.dacostacambio@gmail.com>
|
||||
Jacob Middag <jacob@gaddim.nl>
|
||||
Jan Matèrne <jhm@apache.org>
|
||||
Jan Rieke <it@janrieke.de>
|
||||
Jappe van der Hel <jappe.vanderhel@gmail.com>
|
||||
Kevin Chirls <kchirls@users.noreply.github.com>
|
||||
|
||||
@@ -171,6 +171,15 @@ the common tasks and can be called on to run the main aspects of all the sub-scr
|
||||
</target>
|
||||
|
||||
<target name="compile" depends="version, ensureBuildDeps, -unpackLibs, -ensureJdk9" description="Compiles the code.">
|
||||
<fail>
|
||||
For compiling with Java9 'modulepath' an Ant version 1.9.7+ or 1.10.0+ is required.
|
||||
Your current version is:
|
||||
${ant.version}
|
||||
<condition>
|
||||
<not><antversion atleast="1.9.8"/></not>
|
||||
</condition>
|
||||
</fail>
|
||||
|
||||
<!-- ant includes the destination dir on the classpath (and there are good reasons to do this), but that also means
|
||||
the bleeding edge lombok from the previous build is run, which means if there are bugs in it, you can't compile
|
||||
anymore until you 'ant clean'. That's very much not desired, so we kill the processor, which stops lombok from running.
|
||||
|
||||
@@ -8,6 +8,7 @@ Lombok Changelog
|
||||
* ENHANCEMENT: You can now configure the generated builder class name via the config system, using key `lombok.builder.className`. See the [Builder documentation](https://projectlombok.org/features/Builder) and [SuperBuilder documentation](https://projectlombok.org/features/experimental/SuperBuilder)
|
||||
* ENHANCEMENT: If you mix up eclipse's non-null support, such as `@NonNullByDefault`, with lombok's `@NonNull`, you get a bunch of warnings about dead code that are inappropriate. These warnings are now suppressed, thanks to a contribution from Till Brychcy! [Pull Request #2155](https://github.com/rzwitserloot/lombok/pull/2155)
|
||||
* ENHANCEMENT: `@NonNull` can now also generate checks using jdk's `Objects.requireNonNull` or Guava's `Preconditions.checkNotNull`. [Issue #1197](https://github.com/rzwitserloot/lombok/issues/1197)
|
||||
* EXPERIMENT: Lombok is working together with [checkerframework](https://checkerframework.org/) to enable detection of improper builder use (such as forgetting to set a mandatory property prior to calling `build()`). This experiment can be turned on by adding `checkerframework = true` to your `lombok.config` file.
|
||||
* BUGFIX: Delombok would turn something like `List<byte[]>...` in a method parameter to `List<byte...>...` [Issue #2140](https://github.com/rzwitserloot/lombok/issues/2140)
|
||||
* BUGFIX: Javac would generate the wrong equals and hashCode if a type-use annotation was put on an array type field [Issue #2165](https://github.com/rzwitserloot/lombok/issues/2165)
|
||||
* BUGFIX: Eclipse 2019-06 + JDK-12 compatibility + an `@Singular` builder entry would produce a cascade of error dialogs. [Issue #2169](https://github.com/rzwitserloot/lombok/issues/2169)
|
||||
|
||||
@@ -24,6 +24,7 @@ package lombok;
|
||||
import java.util.List;
|
||||
|
||||
import lombok.core.configuration.CallSuperType;
|
||||
import lombok.core.configuration.CheckerFrameworkVersion;
|
||||
import lombok.core.configuration.ConfigurationKey;
|
||||
import lombok.core.configuration.LogDeclaration;
|
||||
import lombok.core.configuration.FlagUsageType;
|
||||
@@ -627,5 +628,14 @@ public class ConfigurationKeys {
|
||||
* Copy these annotations to getters, setters, withers, builder-setters, etc.
|
||||
*/
|
||||
public static final ConfigurationKey<List<TypeName>> COPYABLE_ANNOTATIONS = new ConfigurationKey<List<TypeName>>("lombok.copyableAnnotations", "Copy these annotations to getters, setters, withers, builder-setters, etc.") {};
|
||||
|
||||
/**
|
||||
* lombok configuration: {@code checkerframework} = {@code true} | {@code false} | <String: MajorVer.MinorVer> (Default: false).
|
||||
*
|
||||
* If set, lombok will generate appropriate annotations from checkerframework.org on generated code. If set to {@code true}, all relevant annotations from the most recent version of
|
||||
* checkerframework.org that lombok supports will be generated. If set to a specific major/minor version number, only checkerframework annotations introduced on or before the stated
|
||||
* checkerframework.org version will be generated.
|
||||
*/
|
||||
public static final ConfigurationKey<CheckerFrameworkVersion> CHECKER_FRAMEWORK = new ConfigurationKey<CheckerFrameworkVersion>("checkerframework", "If set with the version of checkerframework.org (in major.minor, or just 'true' for the latest supported version), create relevant checkerframework.org annotations for code lombok generates (default: false).") {};
|
||||
|
||||
}
|
||||
@@ -0,0 +1,86 @@
|
||||
/*
|
||||
* Copyright (C) 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
|
||||
* 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.core.configuration;
|
||||
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
public final class CheckerFrameworkVersion implements ConfigurationValueType {
|
||||
private final int version;
|
||||
private static final int MAX_SUPPORTED = 3000;
|
||||
|
||||
public static final String NAME__SIDE_EFFECT_FREE = "org.checkerframework.dataflow.qual.SideEffectFree";
|
||||
public static final String NAME__UNIQUE = "org.checkerframework.common.aliasing.qual.Unique";
|
||||
public static final String NAME__RETURNS_RECEIVER = "org.checkerframework.checker.builder.qual.ReturnsReceiver";
|
||||
public static final String NAME__NOT_CALLED = "org.checkerframework.checker.builder.qual.NotCalledMethods";
|
||||
public static final String NAME__CALLED = "org.checkerframework.checker.builder.qual.CalledMethods";
|
||||
|
||||
public static final CheckerFrameworkVersion NONE = new CheckerFrameworkVersion(0);
|
||||
|
||||
private CheckerFrameworkVersion(int v) {
|
||||
this.version = v;
|
||||
}
|
||||
|
||||
private static final Pattern VERSION = Pattern.compile("^(\\d+)(?:\\.(\\d+))?(?:\\.\\d+)*$");
|
||||
|
||||
public boolean generateSideEffectFree() {
|
||||
return version > 0;
|
||||
}
|
||||
|
||||
public boolean generateUnique() {
|
||||
return version > 0;
|
||||
}
|
||||
|
||||
public boolean generateReturnsReceiver() {
|
||||
return version > 2999;
|
||||
}
|
||||
|
||||
public boolean generateCalledMethods() {
|
||||
return version > 2999;
|
||||
}
|
||||
|
||||
public static CheckerFrameworkVersion valueOf(String versionString) {
|
||||
if (versionString != null) versionString = versionString.trim();
|
||||
if (versionString == null || versionString.equalsIgnoreCase("false") || versionString.equals("0")) return new CheckerFrameworkVersion(0);
|
||||
if (versionString.equalsIgnoreCase("true")) return new CheckerFrameworkVersion(MAX_SUPPORTED);
|
||||
Matcher m = VERSION.matcher(versionString);
|
||||
if (!m.matches()) throw new IllegalArgumentException("Expected 'true' or 'false' or a major/minor version, such as '2.9'");
|
||||
int major = Integer.parseInt(m.group(1));
|
||||
int minor = (m.group(2) != null && !m.group(2).isEmpty()) ? Integer.parseInt(m.group(2)) : 0;
|
||||
if (minor > 999) throw new IllegalArgumentException("Minor version must be between 0 and 999");
|
||||
int v = major * 1000 + minor;
|
||||
if (v > MAX_SUPPORTED) {
|
||||
String s = (v / 1000) + "." + (v % 1000);
|
||||
throw new IllegalArgumentException("Lombok supports at most v" + s + "; reduce the value of key 'checkerframework' to " + s);
|
||||
}
|
||||
return new CheckerFrameworkVersion(v);
|
||||
}
|
||||
|
||||
public static String description() {
|
||||
return "checkerframework-version";
|
||||
}
|
||||
|
||||
public static String exampleValue() {
|
||||
String s = (MAX_SUPPORTED / 1000) + "." + (MAX_SUPPORTED % 1000);
|
||||
return "major.minor (example: 2.9 - and no higher than " + s + ") or true or false";
|
||||
}
|
||||
}
|
||||
@@ -111,6 +111,7 @@ import lombok.core.AnnotationValues;
|
||||
import lombok.core.AnnotationValues.AnnotationValue;
|
||||
import lombok.core.LombokImmutableList;
|
||||
import lombok.core.TypeResolver;
|
||||
import lombok.core.configuration.CheckerFrameworkVersion;
|
||||
import lombok.core.configuration.NullCheckExceptionType;
|
||||
import lombok.core.configuration.TypeName;
|
||||
import lombok.core.debug.ProblemReporter;
|
||||
@@ -184,6 +185,23 @@ public class EclipseHandlerUtil {
|
||||
return ma;
|
||||
}
|
||||
|
||||
public static MarkerAnnotation generateNamedAnnotation(ASTNode source, String typeName) {
|
||||
char[][] cc = fromQualifiedName(typeName);
|
||||
QualifiedTypeReference qtr = new QualifiedTypeReference(cc, poss(source, cc.length));
|
||||
setGeneratedBy(qtr, source);
|
||||
MarkerAnnotation ma = new MarkerAnnotation(qtr, source.sourceStart);
|
||||
// No matter what value you input for sourceEnd, the AST->DOM converter of eclipse will reparse to find the end, and will fail as
|
||||
// it can't find code that isn't really there. This results in the end position being set to 2 or 0 or some weird magic value, and thus,
|
||||
// length, as calculated by end-start, is all screwed up, resulting in IllegalArgumentException during a setSourceRange call MUCH later in the process.
|
||||
// We solve it by going with a voodoo magic source start value such that the calculated length so happens to exactly be 0. 0 lengths are accepted
|
||||
// by eclipse. For some reason.
|
||||
// TL;DR: Don't change 1. 1 is sacred. Trust the 1.
|
||||
// issue: #408.
|
||||
ma.sourceStart = 1;
|
||||
setGeneratedBy(ma, source);
|
||||
return ma;
|
||||
}
|
||||
|
||||
public static boolean isFieldDeprecated(EclipseNode fieldNode) {
|
||||
if (!(fieldNode.get() instanceof FieldDeclaration)) return false;
|
||||
FieldDeclaration field = (FieldDeclaration) fieldNode.get();
|
||||
@@ -199,6 +217,11 @@ public class EclipseHandlerUtil {
|
||||
return false;
|
||||
}
|
||||
|
||||
public static CheckerFrameworkVersion getCheckerFrameworkVersion(EclipseNode node) {
|
||||
CheckerFrameworkVersion cfv = node.getAst().readConfiguration(ConfigurationKeys.CHECKER_FRAMEWORK);
|
||||
return cfv != null ? cfv : CheckerFrameworkVersion.NONE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if the given TypeReference node is likely to be a reference to the provided class.
|
||||
*
|
||||
@@ -1908,11 +1931,13 @@ public class EclipseHandlerUtil {
|
||||
* Create an annotation of the given name, and is marked as being generated by the given source.
|
||||
*/
|
||||
public static MarkerAnnotation makeMarkerAnnotation(char[][] name, ASTNode source) {
|
||||
long pos = (long)source.sourceStart << 32 | source.sourceEnd;
|
||||
TypeReference typeRef = new QualifiedTypeReference(name, new long[] {pos, pos, pos});
|
||||
long pos = (long) source.sourceStart << 32 | source.sourceEnd;
|
||||
long[] poss = new long[name.length];
|
||||
Arrays.fill(poss, pos);
|
||||
TypeReference typeRef = new QualifiedTypeReference(name, poss);
|
||||
setGeneratedBy(typeRef, source);
|
||||
MarkerAnnotation ann = new MarkerAnnotation(typeRef, (int)(pos >> 32));
|
||||
ann.declarationSourceEnd = ann.sourceEnd = ann.statementEnd = (int)pos;
|
||||
MarkerAnnotation ann = new MarkerAnnotation(typeRef, (int) (pos >> 32));
|
||||
ann.declarationSourceEnd = ann.sourceEnd = ann.statementEnd = (int) pos;
|
||||
setGeneratedBy(ann, source);
|
||||
return ann;
|
||||
}
|
||||
|
||||
@@ -33,6 +33,7 @@ import java.util.Map;
|
||||
|
||||
import org.eclipse.jdt.internal.compiler.ast.ASTNode;
|
||||
import org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration;
|
||||
import org.eclipse.jdt.internal.compiler.ast.Annotation;
|
||||
import org.eclipse.jdt.internal.compiler.ast.ConditionalExpression;
|
||||
import org.eclipse.jdt.internal.compiler.ast.EqualExpression;
|
||||
import org.eclipse.jdt.internal.compiler.ast.Expression;
|
||||
@@ -62,6 +63,7 @@ import lombok.AccessLevel;
|
||||
import lombok.core.LombokImmutableList;
|
||||
import lombok.core.SpiLoadUtil;
|
||||
import lombok.core.TypeLibrary;
|
||||
import lombok.core.configuration.CheckerFrameworkVersion;
|
||||
import lombok.eclipse.EclipseNode;
|
||||
|
||||
public class EclipseSingularsRecipes {
|
||||
@@ -235,7 +237,7 @@ public class EclipseSingularsRecipes {
|
||||
* If you need more control over the return type and value, use
|
||||
* {@link #generateMethods(SingularData, boolean, EclipseNode, boolean, TypeReferenceMaker, StatementMaker)}.
|
||||
*/
|
||||
public void generateMethods(SingularData data, boolean deprecate, final EclipseNode builderType, boolean fluent, final boolean chain, AccessLevel access) {
|
||||
public void generateMethods(CheckerFrameworkVersion cfv, SingularData data, boolean deprecate, final EclipseNode builderType, boolean fluent, final boolean chain, AccessLevel access) {
|
||||
TypeReferenceMaker returnTypeMaker = new TypeReferenceMaker() {
|
||||
@Override public TypeReference make() {
|
||||
return chain ? cloneSelfType(builderType) : TypeReference.baseTypeReference(TypeIds.T_void, 0);
|
||||
@@ -248,14 +250,14 @@ public class EclipseSingularsRecipes {
|
||||
}
|
||||
};
|
||||
|
||||
generateMethods(data, deprecate, builderType, fluent, returnTypeMaker, returnStatementMaker, access);
|
||||
generateMethods(cfv, data, deprecate, builderType, fluent, returnTypeMaker, returnStatementMaker, access);
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates the singular, plural, and clear methods for the given {@link SingularData}.
|
||||
* Uses the given {@code returnTypeMaker} and {@code returnStatementMaker} for the generated methods.
|
||||
*/
|
||||
public abstract void generateMethods(SingularData data, boolean deprecate, EclipseNode builderType, boolean fluent, TypeReferenceMaker returnTypeMaker, StatementMaker returnStatementMaker, AccessLevel access);
|
||||
public abstract void generateMethods(CheckerFrameworkVersion cfv, SingularData data, boolean deprecate, EclipseNode builderType, boolean fluent, TypeReferenceMaker returnTypeMaker, StatementMaker returnStatementMaker, AccessLevel access);
|
||||
|
||||
public abstract void appendBuildCode(SingularData data, EclipseNode builderType, List<Statement> statements, char[] targetVariableName, String builderVariable);
|
||||
|
||||
@@ -272,6 +274,15 @@ public class EclipseSingularsRecipes {
|
||||
|
||||
// -- Utility methods --
|
||||
|
||||
protected Annotation[] generateSelfReturnAnnotations(boolean deprecate, CheckerFrameworkVersion cfv, ASTNode source) {
|
||||
Annotation deprecated = deprecate ? generateDeprecatedAnnotation(source) : null;
|
||||
Annotation returnsReceiver = cfv.generateReturnsReceiver() ? generateNamedAnnotation(source, CheckerFrameworkVersion.NAME__RETURNS_RECEIVER) : null;
|
||||
if (deprecated == null && returnsReceiver == null) return null;
|
||||
if (deprecated == null) return new Annotation[] {returnsReceiver};
|
||||
if (returnsReceiver == null) return new Annotation[] {deprecated};
|
||||
return new Annotation[] {deprecated, returnsReceiver};
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the requested number of type arguments to the provided type, copying each argument in {@code typeArgs}. If typeArgs is too long, the extra elements are ignored.
|
||||
* If {@code typeArgs} is null or too short, {@code java.lang.Object} will be substituted for each missing type argument.
|
||||
|
||||
@@ -37,6 +37,7 @@ import org.eclipse.jdt.internal.compiler.ast.AbstractVariableDeclaration;
|
||||
import org.eclipse.jdt.internal.compiler.ast.AllocationExpression;
|
||||
import org.eclipse.jdt.internal.compiler.ast.Annotation;
|
||||
import org.eclipse.jdt.internal.compiler.ast.Argument;
|
||||
import org.eclipse.jdt.internal.compiler.ast.ArrayInitializer;
|
||||
import org.eclipse.jdt.internal.compiler.ast.Assignment;
|
||||
import org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration;
|
||||
import org.eclipse.jdt.internal.compiler.ast.ConditionalExpression;
|
||||
@@ -57,9 +58,11 @@ import org.eclipse.jdt.internal.compiler.ast.ParameterizedSingleTypeReference;
|
||||
import org.eclipse.jdt.internal.compiler.ast.QualifiedThisReference;
|
||||
import org.eclipse.jdt.internal.compiler.ast.QualifiedTypeReference;
|
||||
import org.eclipse.jdt.internal.compiler.ast.ReturnStatement;
|
||||
import org.eclipse.jdt.internal.compiler.ast.SingleMemberAnnotation;
|
||||
import org.eclipse.jdt.internal.compiler.ast.SingleNameReference;
|
||||
import org.eclipse.jdt.internal.compiler.ast.SingleTypeReference;
|
||||
import org.eclipse.jdt.internal.compiler.ast.Statement;
|
||||
import org.eclipse.jdt.internal.compiler.ast.StringLiteral;
|
||||
import org.eclipse.jdt.internal.compiler.ast.ThisReference;
|
||||
import org.eclipse.jdt.internal.compiler.ast.TrueLiteral;
|
||||
import org.eclipse.jdt.internal.compiler.ast.TypeDeclaration;
|
||||
@@ -84,6 +87,7 @@ import lombok.core.handlers.HandlerUtil;
|
||||
import lombok.core.handlers.InclusionExclusionUtils.Included;
|
||||
import lombok.core.AnnotationValues;
|
||||
import lombok.core.HandlerPriority;
|
||||
import lombok.core.configuration.CheckerFrameworkVersion;
|
||||
import lombok.eclipse.Eclipse;
|
||||
import lombok.eclipse.EclipseAnnotationHandler;
|
||||
import lombok.eclipse.EclipseNode;
|
||||
@@ -155,7 +159,8 @@ public class HandleBuilder extends EclipseAnnotationHandler<Builder> {
|
||||
|
||||
@Override public void handle(AnnotationValues<Builder> annotation, Annotation ast, EclipseNode annotationNode) {
|
||||
handleFlagUsage(annotationNode, ConfigurationKeys.BUILDER_FLAG_USAGE, "@Builder");
|
||||
|
||||
CheckerFrameworkVersion cfv = getCheckerFrameworkVersion(annotationNode);
|
||||
|
||||
long p = (long) ast.sourceStart << 32 | ast.sourceEnd;
|
||||
|
||||
Builder builderInstance = annotation.getInstance();
|
||||
@@ -487,14 +492,14 @@ public class HandleBuilder extends EclipseAnnotationHandler<Builder> {
|
||||
}
|
||||
|
||||
for (BuilderFieldData bfd : builderFields) {
|
||||
makeSetterMethodsForBuilder(builderType, bfd, annotationNode, fluent, chain, accessForInners, bfd.originalFieldNode);
|
||||
makeSetterMethodsForBuilder(cfv, builderType, bfd, annotationNode, fluent, chain, accessForInners, bfd.originalFieldNode);
|
||||
}
|
||||
|
||||
{
|
||||
MemberExistsResult methodExists = methodExists(buildMethodName, builderType, -1);
|
||||
if (methodExists == MemberExistsResult.EXISTS_BY_LOMBOK) methodExists = methodExists(buildMethodName, builderType, 0);
|
||||
if (methodExists == MemberExistsResult.NOT_EXISTS) {
|
||||
MethodDeclaration md = generateBuildMethod(tdParent, isStatic, buildMethodName, nameOfStaticBuilderMethod, returnType, builderFields, builderType, thrownExceptions, addCleaning, ast, accessForInners);
|
||||
MethodDeclaration md = generateBuildMethod(cfv, tdParent, isStatic, buildMethodName, nameOfStaticBuilderMethod, returnType, builderFields, builderType, thrownExceptions, addCleaning, ast, accessForInners);
|
||||
if (md != null) injectMethod(builderType, md);
|
||||
}
|
||||
}
|
||||
@@ -517,7 +522,7 @@ public class HandleBuilder extends EclipseAnnotationHandler<Builder> {
|
||||
|
||||
if (generateBuilderMethod && methodExists(builderMethodName, tdParent, -1) != MemberExistsResult.NOT_EXISTS) generateBuilderMethod = false;
|
||||
if (generateBuilderMethod) {
|
||||
MethodDeclaration md = generateBuilderMethod(isStatic, builderMethodName, builderClassName, tdParent, typeParams, ast, accessForOuters);
|
||||
MethodDeclaration md = generateBuilderMethod(cfv, isStatic, builderMethodName, builderClassName, tdParent, typeParams, ast, accessForOuters);
|
||||
if (md != null) injectMethod(tdParent, md);
|
||||
}
|
||||
|
||||
@@ -534,7 +539,7 @@ public class HandleBuilder extends EclipseAnnotationHandler<Builder> {
|
||||
tps[i].name = typeArgsForToBuilder.get(i);
|
||||
}
|
||||
}
|
||||
MethodDeclaration md = generateToBuilderMethod(toBuilderMethodName, builderClassName, tdParent, tps, builderFields, fluent, ast, accessForOuters);
|
||||
MethodDeclaration md = generateToBuilderMethod(cfv, toBuilderMethodName, builderClassName, tdParent, tps, builderFields, fluent, ast, accessForOuters);
|
||||
|
||||
if (md != null) injectMethod(tdParent, md);
|
||||
}
|
||||
@@ -547,7 +552,7 @@ public class HandleBuilder extends EclipseAnnotationHandler<Builder> {
|
||||
}
|
||||
|
||||
private static final char[] BUILDER_TEMP_VAR = {'b', 'u', 'i', 'l', 'd', 'e', 'r'};
|
||||
private MethodDeclaration generateToBuilderMethod(String methodName, String builderClassName, EclipseNode type, TypeParameter[] typeParams, List<BuilderFieldData> builderFields, boolean fluent, ASTNode source, AccessLevel access) {
|
||||
private MethodDeclaration generateToBuilderMethod(CheckerFrameworkVersion cfv, String methodName, String builderClassName, EclipseNode type, TypeParameter[] typeParams, List<BuilderFieldData> builderFields, boolean fluent, ASTNode source, AccessLevel access) {
|
||||
int pS = source.sourceStart, pE = source.sourceEnd;
|
||||
long p = (long) pS << 32 | pE;
|
||||
|
||||
@@ -623,6 +628,10 @@ public class HandleBuilder extends EclipseAnnotationHandler<Builder> {
|
||||
out.statements = new Statement[] {new ReturnStatement(receiver, pS, pE)};
|
||||
}
|
||||
|
||||
if (cfv.generateUnique()) {
|
||||
out.annotations = new Annotation[] {generateNamedAnnotation(source, CheckerFrameworkVersion.NAME__UNIQUE)};
|
||||
}
|
||||
|
||||
out.traverse(new SetGeneratedByVisitor(source), ((TypeDeclaration) type.get()).scope);
|
||||
return out;
|
||||
|
||||
@@ -650,7 +659,35 @@ public class HandleBuilder extends EclipseAnnotationHandler<Builder> {
|
||||
return decl;
|
||||
}
|
||||
|
||||
public MethodDeclaration generateBuildMethod(EclipseNode tdParent, boolean isStatic, String name, char[] staticName, TypeReference returnType, List<BuilderFieldData> builderFields, EclipseNode type, TypeReference[] thrownExceptions, boolean addCleaning, ASTNode source, AccessLevel access) {
|
||||
static Argument[] generateBuildArgs(CheckerFrameworkVersion cfv, EclipseNode type, List<BuilderFieldData> builderFields, ASTNode source) {
|
||||
if (!cfv.generateCalledMethods()) return null;
|
||||
|
||||
List<char[]> mandatories = new ArrayList<char[]>();
|
||||
for (BuilderFieldData bfd : builderFields) {
|
||||
if (bfd.singularData == null && bfd.nameOfSetFlag == null) mandatories.add(bfd.name);
|
||||
}
|
||||
|
||||
if (mandatories.size() == 0) return null;
|
||||
char[][] nameCalled = fromQualifiedName(CheckerFrameworkVersion.NAME__CALLED);
|
||||
SingleMemberAnnotation ann = new SingleMemberAnnotation(new QualifiedTypeReference(nameCalled, poss(source, nameCalled.length)), source.sourceStart);
|
||||
if (mandatories.size() == 1) {
|
||||
ann.memberValue = new StringLiteral(mandatories.get(0), 0, 0, 0);
|
||||
} else {
|
||||
ArrayInitializer arr = new ArrayInitializer();
|
||||
arr.sourceStart = source.sourceStart;
|
||||
arr.sourceEnd = source.sourceEnd;
|
||||
arr.expressions = new Expression[mandatories.size()];
|
||||
for (int i = 0; i < arr.expressions.length; i++) {
|
||||
arr.expressions[i] = new StringLiteral(mandatories.get(i), source.sourceStart, source.sourceEnd, 0);
|
||||
}
|
||||
ann.memberValue = arr;
|
||||
}
|
||||
Argument arg = new Argument(new char[] { 't', 'h', 'i', 's' }, 0, new SingleTypeReference(type.getName().toCharArray(), source.sourceStart), Modifier.FINAL);
|
||||
arg.annotations = new Annotation[] {ann};
|
||||
return new Argument[] {arg};
|
||||
}
|
||||
|
||||
public MethodDeclaration generateBuildMethod(CheckerFrameworkVersion cfv, EclipseNode tdParent, boolean isStatic, String name, char[] staticName, TypeReference returnType, List<BuilderFieldData> builderFields, EclipseNode type, TypeReference[] thrownExceptions, boolean addCleaning, ASTNode source, AccessLevel access) {
|
||||
MethodDeclaration out = new MethodDeclaration(((CompilationUnitDeclaration) type.top().get()).compilationResult);
|
||||
out.bits |= ECLIPSE_DO_NOT_TOUCH_FLAG;
|
||||
List<Statement> statements = new ArrayList<Statement>();
|
||||
@@ -723,6 +760,10 @@ public class HandleBuilder extends EclipseAnnotationHandler<Builder> {
|
||||
}
|
||||
}
|
||||
out.statements = statements.isEmpty() ? null : statements.toArray(new Statement[0]);
|
||||
if (cfv.generateSideEffectFree()) {
|
||||
out.annotations = new Annotation[] {generateNamedAnnotation(source, CheckerFrameworkVersion.NAME__SIDE_EFFECT_FREE)};
|
||||
}
|
||||
out.arguments = generateBuildArgs(cfv, type, builderFields, source);
|
||||
out.traverse(new SetGeneratedByVisitor(source), (ClassScope) null);
|
||||
return out;
|
||||
}
|
||||
@@ -754,7 +795,7 @@ public class HandleBuilder extends EclipseAnnotationHandler<Builder> {
|
||||
return out;
|
||||
}
|
||||
|
||||
public MethodDeclaration generateBuilderMethod(boolean isStatic, String builderMethodName, String builderClassName, EclipseNode type, TypeParameter[] typeParams, ASTNode source, AccessLevel access) {
|
||||
public MethodDeclaration generateBuilderMethod(CheckerFrameworkVersion cfv, boolean isStatic, String builderMethodName, String builderClassName, EclipseNode type, TypeParameter[] typeParams, ASTNode source, AccessLevel access) {
|
||||
int pS = source.sourceStart, pE = source.sourceEnd;
|
||||
long p = (long) pS << 32 | pE;
|
||||
|
||||
@@ -768,7 +809,15 @@ public class HandleBuilder extends EclipseAnnotationHandler<Builder> {
|
||||
AllocationExpression invoke = new AllocationExpression();
|
||||
invoke.type = namePlusTypeParamsToTypeReference(builderClassName.toCharArray(), typeParams, p);
|
||||
out.statements = new Statement[] {new ReturnStatement(invoke, pS, pE)};
|
||||
|
||||
Annotation uniqueAnn = cfv.generateUnique() ? generateNamedAnnotation(source, CheckerFrameworkVersion.NAME__UNIQUE) : null;
|
||||
Annotation sefAnn = cfv.generateSideEffectFree() ? generateNamedAnnotation(source, CheckerFrameworkVersion.NAME__SIDE_EFFECT_FREE) : null;
|
||||
if (uniqueAnn != null && sefAnn != null) {
|
||||
out.annotations = new Annotation[] {uniqueAnn, sefAnn};
|
||||
} else if (uniqueAnn != null) {
|
||||
out.annotations = new Annotation[] {uniqueAnn};
|
||||
} else if (sefAnn != null) {
|
||||
out.annotations = new Annotation[] {sefAnn};
|
||||
}
|
||||
out.traverse(new SetGeneratedByVisitor(source), ((TypeDeclaration) type.get()).scope);
|
||||
return out;
|
||||
}
|
||||
@@ -813,18 +862,19 @@ public class HandleBuilder extends EclipseAnnotationHandler<Builder> {
|
||||
|
||||
private static final AbstractMethodDeclaration[] EMPTY = {};
|
||||
|
||||
public void makeSetterMethodsForBuilder(EclipseNode builderType, BuilderFieldData bfd, EclipseNode sourceNode, boolean fluent, boolean chain, AccessLevel access, EclipseNode originalFieldNode) {
|
||||
public void makeSetterMethodsForBuilder(CheckerFrameworkVersion cfv, EclipseNode builderType, BuilderFieldData bfd, EclipseNode sourceNode, boolean fluent, boolean chain, AccessLevel access, EclipseNode originalFieldNode) {
|
||||
boolean deprecate = isFieldDeprecated(bfd.originalFieldNode);
|
||||
if (bfd.singularData == null || bfd.singularData.getSingularizer() == null) {
|
||||
makeSimpleSetterMethodForBuilder(builderType, deprecate, bfd.createdFields.get(0), bfd.name, bfd.nameOfSetFlag, sourceNode, fluent, chain, bfd.annotations, access, originalFieldNode);
|
||||
makeSimpleSetterMethodForBuilder(cfv, builderType, deprecate, bfd.createdFields.get(0), bfd.name, bfd.nameOfSetFlag, sourceNode, fluent, chain, bfd.annotations, access, originalFieldNode);
|
||||
} else {
|
||||
bfd.singularData.getSingularizer().generateMethods(bfd.singularData, deprecate, builderType, fluent, chain, access);
|
||||
bfd.singularData.getSingularizer().generateMethods(cfv, bfd.singularData, deprecate, builderType, fluent, chain, access);
|
||||
}
|
||||
}
|
||||
|
||||
private void makeSimpleSetterMethodForBuilder(EclipseNode builderType, boolean deprecate, EclipseNode fieldNode, char[] paramName, char[] nameOfSetFlag, EclipseNode sourceNode, boolean fluent, boolean chain, Annotation[] annotations, AccessLevel access, EclipseNode originalFieldNode) {
|
||||
private void makeSimpleSetterMethodForBuilder(CheckerFrameworkVersion cfv, EclipseNode builderType, boolean deprecate, EclipseNode fieldNode, char[] paramName, char[] nameOfSetFlag, EclipseNode sourceNode, boolean fluent, boolean chain, Annotation[] annotations, AccessLevel access, EclipseNode originalFieldNode) {
|
||||
TypeDeclaration td = (TypeDeclaration) builderType.get();
|
||||
AbstractMethodDeclaration[] existing = td.methods;
|
||||
ASTNode source = sourceNode.get();
|
||||
if (existing == null) existing = EMPTY;
|
||||
int len = existing.length;
|
||||
FieldDeclaration fd = (FieldDeclaration) fieldNode.get();
|
||||
@@ -838,11 +888,20 @@ public class HandleBuilder extends EclipseAnnotationHandler<Builder> {
|
||||
|
||||
String setterName = fluent ? new String(paramName) : HandlerUtil.buildAccessorName("set", new String(paramName));
|
||||
|
||||
List<Annotation> methodAnnsList = Collections.<Annotation>emptyList();
|
||||
Annotation[] methodAnns = EclipseHandlerUtil.findCopyableToSetterAnnotations(originalFieldNode);
|
||||
if (methodAnns != null && methodAnns.length > 0) methodAnnsList = Arrays.asList(methodAnns);
|
||||
List<Annotation> methodAnnsList = Arrays.asList(EclipseHandlerUtil.findCopyableToSetterAnnotations(originalFieldNode));
|
||||
MethodDeclaration setter = HandleSetter.createSetter(td, deprecate, fieldNode, setterName, paramName, nameOfSetFlag, chain, toEclipseModifier(access),
|
||||
sourceNode, methodAnnsList, annotations != null ? Arrays.asList(copyAnnotations(sourceNode.get(), annotations)) : Collections.<Annotation>emptyList());
|
||||
sourceNode, methodAnnsList, annotations != null ? Arrays.asList(copyAnnotations(source, annotations)) : Collections.<Annotation>emptyList());
|
||||
if (cfv.generateCalledMethods()) {
|
||||
Argument[] arr = setter.arguments == null ? new Argument[0] : setter.arguments;
|
||||
Argument[] newArr = new Argument[arr.length + 1];
|
||||
System.arraycopy(arr, 0, newArr, 1, arr.length);
|
||||
newArr[0] = new Argument(new char[] { 't', 'h', 'i', 's' }, 0, new SingleTypeReference(builderType.getName().toCharArray(), 0), Modifier.FINAL);
|
||||
char[][] nameNotCalled = fromQualifiedName(CheckerFrameworkVersion.NAME__NOT_CALLED);
|
||||
SingleMemberAnnotation ann = new SingleMemberAnnotation(new QualifiedTypeReference(nameNotCalled, poss(source, nameNotCalled.length)), source.sourceStart);
|
||||
ann.memberValue = new StringLiteral(setterName.toCharArray(), 0, 0, 0);
|
||||
newArr[0].annotations = new Annotation[] {ann};
|
||||
setter.arguments = newArr;
|
||||
}
|
||||
injectMethod(builderType, setter);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2010-2018 The Project Lombok Authors.
|
||||
* Copyright (C) 2010-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
|
||||
@@ -39,6 +39,7 @@ import lombok.ConfigurationKeys;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.core.AST.Kind;
|
||||
import lombok.core.configuration.CheckerFrameworkVersion;
|
||||
import lombok.core.AnnotationValues;
|
||||
import lombok.eclipse.EclipseAnnotationHandler;
|
||||
import lombok.eclipse.EclipseNode;
|
||||
@@ -456,14 +457,14 @@ public class HandleConstructor {
|
||||
constructor.arguments = params.isEmpty() ? null : params.toArray(new Argument[0]);
|
||||
|
||||
/* Generate annotations that must be put on the generated method, and attach them. */ {
|
||||
Annotation[] constructorProperties = null;
|
||||
if (addConstructorProperties && !isLocalType(type)) {
|
||||
constructorProperties = createConstructorProperties(source, fieldsToParam);
|
||||
}
|
||||
Annotation[] constructorProperties = null, checkerFramework = null;
|
||||
if (addConstructorProperties && !isLocalType(type)) constructorProperties = createConstructorProperties(source, fieldsToParam);
|
||||
if (getCheckerFrameworkVersion(type).generateUnique()) checkerFramework = new Annotation[] { generateNamedAnnotation(source, CheckerFrameworkVersion.NAME__UNIQUE) };
|
||||
|
||||
constructor.annotations = copyAnnotations(source,
|
||||
onConstructor.toArray(new Annotation[0]),
|
||||
constructorProperties);
|
||||
constructorProperties,
|
||||
checkerFramework);
|
||||
}
|
||||
|
||||
constructor.traverse(new SetGeneratedByVisitor(source), typeDeclaration.scope);
|
||||
@@ -551,7 +552,9 @@ public class HandleConstructor {
|
||||
assigns.add(nameRef);
|
||||
|
||||
Argument parameter = new Argument(field.name, fieldPos, copyType(field.type, source), Modifier.FINAL);
|
||||
parameter.annotations = copyAnnotations(source, findCopyableAnnotations(fieldNode));
|
||||
Annotation[] checkerFramework = null;
|
||||
if (getCheckerFrameworkVersion(fieldNode).generateUnique()) checkerFramework = new Annotation[] { generateNamedAnnotation(source, CheckerFrameworkVersion.NAME__UNIQUE) };
|
||||
parameter.annotations = copyAnnotations(source, findCopyableAnnotations(fieldNode), checkerFramework);
|
||||
params.add(parameter);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2009-2018 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
|
||||
@@ -42,6 +42,7 @@ import lombok.core.handlers.InclusionExclusionUtils;
|
||||
import lombok.core.handlers.InclusionExclusionUtils.Included;
|
||||
import lombok.core.AnnotationValues;
|
||||
import lombok.core.configuration.CallSuperType;
|
||||
import lombok.core.configuration.CheckerFrameworkVersion;
|
||||
import lombok.eclipse.Eclipse;
|
||||
import lombok.eclipse.EclipseAnnotationHandler;
|
||||
import lombok.eclipse.EclipseNode;
|
||||
@@ -235,7 +236,12 @@ public class HandleEqualsAndHashCode extends EclipseAnnotationHandler<EqualsAndH
|
||||
method.modifiers = toEclipseModifier(AccessLevel.PUBLIC);
|
||||
method.returnType = TypeReference.baseTypeReference(TypeIds.T_int, 0);
|
||||
setGeneratedBy(method.returnType, source);
|
||||
method.annotations = new Annotation[] {makeMarkerAnnotation(TypeConstants.JAVA_LANG_OVERRIDE, source)};
|
||||
Annotation overrideAnnotation = makeMarkerAnnotation(TypeConstants.JAVA_LANG_OVERRIDE, source);
|
||||
if (getCheckerFrameworkVersion(type).generateSideEffectFree()) {
|
||||
method.annotations = new Annotation[] { overrideAnnotation, generateNamedAnnotation(source, CheckerFrameworkVersion.NAME__SIDE_EFFECT_FREE) };
|
||||
} else {
|
||||
method.annotations = new Annotation[] { overrideAnnotation };
|
||||
}
|
||||
method.selector = "hashCode".toCharArray();
|
||||
method.thrownExceptions = null;
|
||||
method.typeParameters = null;
|
||||
@@ -508,7 +514,12 @@ public class HandleEqualsAndHashCode extends EclipseAnnotationHandler<EqualsAndH
|
||||
method.returnType = TypeReference.baseTypeReference(TypeIds.T_boolean, 0);
|
||||
method.returnType.sourceStart = pS; method.returnType.sourceEnd = pE;
|
||||
setGeneratedBy(method.returnType, source);
|
||||
method.annotations = new Annotation[] {makeMarkerAnnotation(TypeConstants.JAVA_LANG_OVERRIDE, source)};
|
||||
Annotation overrideAnnotation = makeMarkerAnnotation(TypeConstants.JAVA_LANG_OVERRIDE, source);
|
||||
if (getCheckerFrameworkVersion(type).generateSideEffectFree()) {
|
||||
method.annotations = new Annotation[] { overrideAnnotation, generateNamedAnnotation(source, CheckerFrameworkVersion.NAME__SIDE_EFFECT_FREE) };
|
||||
} else {
|
||||
method.annotations = new Annotation[] { overrideAnnotation };
|
||||
}
|
||||
method.selector = "equals".toCharArray();
|
||||
method.thrownExceptions = null;
|
||||
method.typeParameters = null;
|
||||
@@ -785,6 +796,7 @@ public class HandleEqualsAndHashCode extends EclipseAnnotationHandler<EqualsAndH
|
||||
setGeneratedBy(returnStatement, source);
|
||||
|
||||
method.statements = new Statement[] {returnStatement};
|
||||
if (getCheckerFrameworkVersion(type).generateSideEffectFree()) method.annotations = new Annotation[] { generateNamedAnnotation(source, CheckerFrameworkVersion.NAME__SIDE_EFFECT_FREE) };
|
||||
return method;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2009-2016 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
|
||||
@@ -38,6 +38,7 @@ import lombok.experimental.Delegate;
|
||||
import lombok.Getter;
|
||||
import lombok.core.AST.Kind;
|
||||
import lombok.core.AnnotationValues;
|
||||
import lombok.core.configuration.CheckerFrameworkVersion;
|
||||
import lombok.eclipse.EclipseAnnotationHandler;
|
||||
import lombok.eclipse.EclipseNode;
|
||||
import lombok.eclipse.agent.PatchDelegate;
|
||||
@@ -262,16 +263,16 @@ public class HandleGetter extends EclipseAnnotationHandler<Getter> {
|
||||
|
||||
EclipseHandlerUtil.registerCreatedLazyGetter((FieldDeclaration) fieldNode.get(), method.selector, returnType);
|
||||
|
||||
/* Generate annotations that must be put on the generated method, and attach them. */ {
|
||||
Annotation[] deprecated = null;
|
||||
if (isFieldDeprecated(fieldNode)) {
|
||||
deprecated = new Annotation[] { generateDeprecatedAnnotation(source) };
|
||||
}
|
||||
/* Generate annotations that must be put on the generated method, and attach them. */ {
|
||||
Annotation[] deprecated = null, checkerFramework = null;
|
||||
if (isFieldDeprecated(fieldNode)) deprecated = new Annotation[] { generateDeprecatedAnnotation(source) };
|
||||
if (getCheckerFrameworkVersion(fieldNode).generateSideEffectFree()) checkerFramework = new Annotation[] { generateNamedAnnotation(source, CheckerFrameworkVersion.NAME__SIDE_EFFECT_FREE) };
|
||||
|
||||
method.annotations = copyAnnotations(source,
|
||||
onMethod.toArray(new Annotation[0]),
|
||||
findCopyableAnnotations(fieldNode),
|
||||
findDelegatesAndMarkAsHandled(fieldNode),
|
||||
checkerFramework,
|
||||
deprecated);
|
||||
}
|
||||
|
||||
|
||||
@@ -36,6 +36,7 @@ import lombok.AccessLevel;
|
||||
import lombok.ConfigurationKeys;
|
||||
import lombok.Setter;
|
||||
import lombok.core.AST.Kind;
|
||||
import lombok.core.configuration.CheckerFrameworkVersion;
|
||||
import lombok.core.AnnotationValues;
|
||||
import lombok.eclipse.EclipseAnnotationHandler;
|
||||
import lombok.eclipse.EclipseNode;
|
||||
@@ -200,7 +201,11 @@ public class HandleSetter extends EclipseAnnotationHandler<Setter> {
|
||||
returnThis = new ReturnStatement(thisRef, pS, pE);
|
||||
}
|
||||
|
||||
return createSetter(parent, deprecate, fieldNode, name, paramName, booleanFieldToSet, returnType, returnThis, modifier, sourceNode, onMethod, onParam);
|
||||
MethodDeclaration d = createSetter(parent, deprecate, fieldNode, name, paramName, booleanFieldToSet, returnType, returnThis, modifier, sourceNode, onMethod, onParam);
|
||||
if (shouldReturnThis && getCheckerFrameworkVersion(sourceNode).generateReturnsReceiver()) {
|
||||
d.annotations = copyAnnotations(source, d.annotations, new Annotation[] { generateNamedAnnotation(source, CheckerFrameworkVersion.NAME__RETURNS_RECEIVER) });
|
||||
}
|
||||
return d;
|
||||
}
|
||||
|
||||
static MethodDeclaration createSetter(TypeDeclaration parent, boolean deprecate, EclipseNode fieldNode, String name, char[] paramName, char[] booleanFieldToSet, TypeReference returnType, Statement returnStatement, int modifier, EclipseNode sourceNode, List<Annotation> onMethod, List<Annotation> onParam) {
|
||||
|
||||
@@ -57,9 +57,11 @@ import org.eclipse.jdt.internal.compiler.ast.ParameterizedSingleTypeReference;
|
||||
import org.eclipse.jdt.internal.compiler.ast.QualifiedNameReference;
|
||||
import org.eclipse.jdt.internal.compiler.ast.QualifiedTypeReference;
|
||||
import org.eclipse.jdt.internal.compiler.ast.ReturnStatement;
|
||||
import org.eclipse.jdt.internal.compiler.ast.SingleMemberAnnotation;
|
||||
import org.eclipse.jdt.internal.compiler.ast.SingleNameReference;
|
||||
import org.eclipse.jdt.internal.compiler.ast.SingleTypeReference;
|
||||
import org.eclipse.jdt.internal.compiler.ast.Statement;
|
||||
import org.eclipse.jdt.internal.compiler.ast.StringLiteral;
|
||||
import org.eclipse.jdt.internal.compiler.ast.SuperReference;
|
||||
import org.eclipse.jdt.internal.compiler.ast.ThisReference;
|
||||
import org.eclipse.jdt.internal.compiler.ast.TypeDeclaration;
|
||||
@@ -81,6 +83,7 @@ import lombok.ConfigurationKeys;
|
||||
import lombok.Singular;
|
||||
import lombok.ToString;
|
||||
import lombok.core.AST.Kind;
|
||||
import lombok.core.configuration.CheckerFrameworkVersion;
|
||||
import lombok.core.handlers.HandlerUtil;
|
||||
import lombok.core.handlers.InclusionExclusionUtils.Included;
|
||||
import lombok.core.AnnotationValues;
|
||||
@@ -119,6 +122,7 @@ public class HandleSuperBuilder extends EclipseAnnotationHandler<SuperBuilder> {
|
||||
@Override
|
||||
public void handle(AnnotationValues<SuperBuilder> annotation, Annotation ast, EclipseNode annotationNode) {
|
||||
handleExperimentalFlagUsage(annotationNode, ConfigurationKeys.SUPERBUILDER_FLAG_USAGE, "@SuperBuilder");
|
||||
CheckerFrameworkVersion cfv = getCheckerFrameworkVersion(annotationNode);
|
||||
|
||||
long p = (long) ast.sourceStart << 32 | ast.sourceEnd;
|
||||
|
||||
@@ -269,7 +273,7 @@ public class HandleSuperBuilder extends EclipseAnnotationHandler<SuperBuilder> {
|
||||
// If there is no superclass, superclassBuilderClassExpression is still == null at this point.
|
||||
// You can use it to check whether to inherit or not.
|
||||
|
||||
generateBuilderBasedConstructor(tdParent, typeParams, builderFields, annotationNode, builderClassName,
|
||||
generateBuilderBasedConstructor(cfv, tdParent, typeParams, builderFields, annotationNode, builderClassName,
|
||||
superclassBuilderClass != null);
|
||||
|
||||
// Create the abstract builder class, or reuse an existing one.
|
||||
@@ -334,12 +338,12 @@ public class HandleSuperBuilder extends EclipseAnnotationHandler<SuperBuilder> {
|
||||
}
|
||||
|
||||
// Generate abstract self() and build() methods in the abstract builder.
|
||||
injectMethod(builderType, generateAbstractSelfMethod(tdParent, superclassBuilderClass != null, builderGenericName));
|
||||
injectMethod(builderType, generateAbstractBuildMethod(tdParent, buildMethodName, superclassBuilderClass != null, classGenericName, ast));
|
||||
injectMethod(builderType, generateAbstractSelfMethod(cfv, tdParent, superclassBuilderClass != null, builderGenericName));
|
||||
injectMethod(builderType, generateAbstractBuildMethod(cfv, builderType, buildMethodName, builderFields, superclassBuilderClass != null, classGenericName, ast));
|
||||
|
||||
// Create the setter methods in the abstract builder.
|
||||
for (BuilderFieldData bfd : builderFields) {
|
||||
generateSetterMethodsForBuilder(builderType, bfd, annotationNode, builderGenericName);
|
||||
generateSetterMethodsForBuilder(cfv, builderType, bfd, annotationNode, builderGenericName);
|
||||
}
|
||||
|
||||
// Create the toString() method for the abstract builder.
|
||||
@@ -386,22 +390,22 @@ public class HandleSuperBuilder extends EclipseAnnotationHandler<SuperBuilder> {
|
||||
annotationNode.addWarning("Not generating toBuilder() as it already exists.");
|
||||
break;
|
||||
case NOT_EXISTS:
|
||||
injectMethod(tdParent, generateToBuilderMethod(builderClassName, builderImplClassName, tdParent, typeParams, ast));
|
||||
injectMethod(tdParent, generateToBuilderMethod(cfv, builderClassName, builderImplClassName, tdParent, typeParams, ast));
|
||||
default:
|
||||
// Should not happen.
|
||||
}
|
||||
}
|
||||
|
||||
// Create the self() and build() methods in the BuilderImpl.
|
||||
injectMethod(builderImplType, generateSelfMethod(builderImplType, typeParams, p));
|
||||
injectMethod(builderImplType, generateSelfMethod(cfv, builderImplType, typeParams, p));
|
||||
if (methodExists(buildMethodName, builderImplType, -1) == MemberExistsResult.NOT_EXISTS) {
|
||||
injectMethod(builderImplType, generateBuildMethod(tdParent, buildMethodName, returnType, ast));
|
||||
injectMethod(builderImplType, generateBuildMethod(cfv, builderImplType, buildMethodName, returnType, builderFields, ast));
|
||||
}
|
||||
|
||||
// Add the builder() method to the annotated class.
|
||||
if (generateBuilderMethod && methodExists(builderMethodName, tdParent, -1) != MemberExistsResult.NOT_EXISTS) generateBuilderMethod = false;
|
||||
if (generateBuilderMethod) {
|
||||
MethodDeclaration md = generateBuilderMethod(builderMethodName, builderClassName, builderImplClassName, tdParent, typeParams, ast);
|
||||
MethodDeclaration md = generateBuilderMethod(cfv, builderMethodName, builderClassName, builderImplClassName, tdParent, typeParams, ast);
|
||||
if (md != null) injectMethod(tdParent, md);
|
||||
}
|
||||
|
||||
@@ -483,6 +487,7 @@ public class HandleSuperBuilder extends EclipseAnnotationHandler<SuperBuilder> {
|
||||
* the type (with the {@code @Builder} annotation) for which a
|
||||
* constructor should be generated.
|
||||
* @param typeParams
|
||||
* @param cfv Settings for generating checker framework annotations
|
||||
* @param builderFields a list of fields in the builder which should be assigned to new instances.
|
||||
* @param source the annotation (used for setting source code locations for the generated code).
|
||||
* @param callBuilderBasedSuperConstructor
|
||||
@@ -490,7 +495,7 @@ public class HandleSuperBuilder extends EclipseAnnotationHandler<SuperBuilder> {
|
||||
* constructor with the builder as argument. Requires
|
||||
* {@code builderClassAsParameter != null}.
|
||||
*/
|
||||
private void generateBuilderBasedConstructor(EclipseNode typeNode, TypeParameter[] typeParams, List<BuilderFieldData> builderFields,
|
||||
private void generateBuilderBasedConstructor(CheckerFrameworkVersion cfv, EclipseNode typeNode, TypeParameter[] typeParams, List<BuilderFieldData> builderFields,
|
||||
EclipseNode sourceNode, String builderClassName, boolean callBuilderBasedSuperConstructor) {
|
||||
|
||||
ASTNode source = sourceNode.get();
|
||||
@@ -501,6 +506,7 @@ public class HandleSuperBuilder extends EclipseAnnotationHandler<SuperBuilder> {
|
||||
ConstructorDeclaration constructor = new ConstructorDeclaration(((CompilationUnitDeclaration) typeNode.top().get()).compilationResult);
|
||||
|
||||
constructor.modifiers = toEclipseModifier(AccessLevel.PROTECTED);
|
||||
if (cfv.generateUnique()) constructor.annotations = new Annotation[] {generateNamedAnnotation(source, CheckerFrameworkVersion.NAME__UNIQUE)};
|
||||
constructor.selector = typeDeclaration.name;
|
||||
if (callBuilderBasedSuperConstructor) {
|
||||
constructor.constructorCall = new ExplicitConstructorCall(ExplicitConstructorCall.Super);
|
||||
@@ -572,7 +578,7 @@ public class HandleSuperBuilder extends EclipseAnnotationHandler<SuperBuilder> {
|
||||
injectMethod(typeNode, constructor);
|
||||
}
|
||||
|
||||
private MethodDeclaration generateBuilderMethod(String builderMethodName, String builderClassName, String builderImplClassName, EclipseNode type, TypeParameter[] typeParams, ASTNode source) {
|
||||
private MethodDeclaration generateBuilderMethod(CheckerFrameworkVersion cfv, String builderMethodName, String builderClassName, String builderImplClassName, EclipseNode type, TypeParameter[] typeParams, ASTNode source) {
|
||||
int pS = source.sourceStart, pE = source.sourceEnd;
|
||||
long p = (long) pS << 32 | pE;
|
||||
|
||||
@@ -591,6 +597,8 @@ public class HandleSuperBuilder extends EclipseAnnotationHandler<SuperBuilder> {
|
||||
invoke.type = namePlusTypeParamsToTypeReference(builderImplClassName.toCharArray(), typeParams, p);
|
||||
out.statements = new Statement[] {new ReturnStatement(invoke, pS, pE)};
|
||||
|
||||
if (cfv.generateUnique()) out.annotations = new Annotation[] {generateNamedAnnotation(source, CheckerFrameworkVersion.NAME__UNIQUE)};
|
||||
|
||||
out.traverse(new SetGeneratedByVisitor(source), ((TypeDeclaration) type.get()).scope);
|
||||
return out;
|
||||
}
|
||||
@@ -603,7 +611,7 @@ public class HandleSuperBuilder extends EclipseAnnotationHandler<SuperBuilder> {
|
||||
* }
|
||||
* </pre>
|
||||
*/
|
||||
private MethodDeclaration generateToBuilderMethod(String builderClassName, String builderImplClassName, EclipseNode type, TypeParameter[] typeParams, ASTNode source) {
|
||||
private MethodDeclaration generateToBuilderMethod(CheckerFrameworkVersion cfv, String builderClassName, String builderImplClassName, EclipseNode type, TypeParameter[] typeParams, ASTNode source) {
|
||||
int pS = source.sourceStart, pE = source.sourceEnd;
|
||||
long p = (long) pS << 32 | pE;
|
||||
|
||||
@@ -623,6 +631,8 @@ public class HandleSuperBuilder extends EclipseAnnotationHandler<SuperBuilder> {
|
||||
invokeFillMethod.arguments = new Expression[] {new ThisReference(0, 0)};
|
||||
out.statements = new Statement[] {new ReturnStatement(invokeFillMethod, pS, pE)};
|
||||
|
||||
if (cfv.generateUnique()) out.annotations = new Annotation[] {generateNamedAnnotation(source, CheckerFrameworkVersion.NAME__UNIQUE)};
|
||||
|
||||
out.traverse(new SetGeneratedByVisitor(source), ((TypeDeclaration) type.get()).scope);
|
||||
return out;
|
||||
}
|
||||
@@ -755,44 +765,64 @@ public class HandleSuperBuilder extends EclipseAnnotationHandler<SuperBuilder> {
|
||||
return ms;
|
||||
}
|
||||
|
||||
private MethodDeclaration generateAbstractSelfMethod(EclipseNode tdParent, boolean override, String builderGenericName) {
|
||||
private MethodDeclaration generateAbstractSelfMethod(CheckerFrameworkVersion cfv, EclipseNode tdParent, boolean override, String builderGenericName) {
|
||||
MethodDeclaration out = new MethodDeclaration(((CompilationUnitDeclaration) tdParent.top().get()).compilationResult);
|
||||
out.selector = SELF_METHOD_NAME;
|
||||
out.bits |= ECLIPSE_DO_NOT_TOUCH_FLAG;
|
||||
out.modifiers = ClassFileConstants.AccAbstract | ClassFileConstants.AccProtected | ExtraCompilerModifiers.AccSemicolonBody;
|
||||
if (override) out.annotations = new Annotation[] {makeMarkerAnnotation(TypeConstants.JAVA_LANG_OVERRIDE, tdParent.get())};
|
||||
Annotation overrideAnn = override ? makeMarkerAnnotation(TypeConstants.JAVA_LANG_OVERRIDE, tdParent.get()) : null;
|
||||
Annotation rrAnn = cfv.generateReturnsReceiver() ? generateNamedAnnotation(tdParent.get(), CheckerFrameworkVersion.NAME__RETURNS_RECEIVER): null;
|
||||
Annotation sefAnn = cfv.generateSideEffectFree() ? generateNamedAnnotation(tdParent.get(), CheckerFrameworkVersion.NAME__SIDE_EFFECT_FREE): null;
|
||||
if (overrideAnn != null && rrAnn != null && sefAnn != null) out.annotations = new Annotation[] {overrideAnn, rrAnn, sefAnn};
|
||||
else if (overrideAnn != null && rrAnn != null) out.annotations = new Annotation[] {overrideAnn, rrAnn};
|
||||
else if (overrideAnn != null && sefAnn != null) out.annotations = new Annotation[] {overrideAnn, sefAnn};
|
||||
else if (overrideAnn != null) out.annotations = new Annotation[] {overrideAnn};
|
||||
else if (rrAnn != null && sefAnn != null) out.annotations = new Annotation[] {rrAnn, sefAnn};
|
||||
else if (rrAnn != null) out.annotations = new Annotation[] {rrAnn};
|
||||
else if (sefAnn != null) out.annotations = new Annotation[] {sefAnn};
|
||||
out.returnType = new SingleTypeReference(builderGenericName.toCharArray(), 0);
|
||||
return out;
|
||||
}
|
||||
|
||||
private MethodDeclaration generateSelfMethod(EclipseNode builderImplType, TypeParameter[] typeParams, long p) {
|
||||
private MethodDeclaration generateSelfMethod(CheckerFrameworkVersion cfv, EclipseNode builderImplType, TypeParameter[] typeParams, long p) {
|
||||
MethodDeclaration out = new MethodDeclaration(((CompilationUnitDeclaration) builderImplType.top().get()).compilationResult);
|
||||
out.selector = SELF_METHOD_NAME;
|
||||
out.bits |= ECLIPSE_DO_NOT_TOUCH_FLAG;
|
||||
out.modifiers = ClassFileConstants.AccProtected;
|
||||
out.annotations = new Annotation[] {makeMarkerAnnotation(TypeConstants.JAVA_LANG_OVERRIDE, builderImplType.get())};
|
||||
Annotation overrideAnn = makeMarkerAnnotation(TypeConstants.JAVA_LANG_OVERRIDE, builderImplType.get());
|
||||
Annotation rrAnn = cfv.generateReturnsReceiver() ? generateNamedAnnotation(builderImplType.get(), CheckerFrameworkVersion.NAME__RETURNS_RECEIVER): null;
|
||||
Annotation sefAnn = cfv.generateSideEffectFree() ? generateNamedAnnotation(builderImplType.get(), CheckerFrameworkVersion.NAME__SIDE_EFFECT_FREE): null;
|
||||
if (rrAnn != null && sefAnn != null) out.annotations = new Annotation[] {overrideAnn, rrAnn, sefAnn};
|
||||
else if (rrAnn != null) out.annotations = new Annotation[] {overrideAnn, rrAnn};
|
||||
else if (sefAnn != null) out.annotations = new Annotation[] {overrideAnn, sefAnn};
|
||||
else out.annotations = new Annotation[] {overrideAnn};
|
||||
out.returnType = namePlusTypeParamsToTypeReference(builderImplType.getName().toCharArray(), typeParams, p);
|
||||
out.statements = new Statement[] {new ReturnStatement(new ThisReference(0, 0), 0, 0)};
|
||||
return out;
|
||||
}
|
||||
|
||||
private MethodDeclaration generateAbstractBuildMethod(EclipseNode tdParent, String methodName, boolean override,
|
||||
private MethodDeclaration generateAbstractBuildMethod(CheckerFrameworkVersion cfv, EclipseNode builderType, String methodName, List<BuilderFieldData> builderFields, boolean override,
|
||||
String classGenericName, ASTNode source) {
|
||||
|
||||
MethodDeclaration out = new MethodDeclaration(((CompilationUnitDeclaration) tdParent.top().get()).compilationResult);
|
||||
MethodDeclaration out = new MethodDeclaration(((CompilationUnitDeclaration) builderType.top().get()).compilationResult);
|
||||
out.bits |= ECLIPSE_DO_NOT_TOUCH_FLAG;
|
||||
|
||||
out.modifiers = ClassFileConstants.AccPublic | ClassFileConstants.AccAbstract | ExtraCompilerModifiers.AccSemicolonBody;
|
||||
out.selector = methodName.toCharArray();
|
||||
out.bits |= ECLIPSE_DO_NOT_TOUCH_FLAG;
|
||||
out.returnType = new SingleTypeReference(classGenericName.toCharArray(), 0);
|
||||
if (override) out.annotations = new Annotation[] {makeMarkerAnnotation(TypeConstants.JAVA_LANG_OVERRIDE, source)};
|
||||
Annotation overrideAnn = override ? makeMarkerAnnotation(TypeConstants.JAVA_LANG_OVERRIDE, source) : null;
|
||||
Annotation sefAnn = cfv.generateSideEffectFree() ? generateNamedAnnotation(source, CheckerFrameworkVersion.NAME__SIDE_EFFECT_FREE): null;
|
||||
if (overrideAnn != null && sefAnn != null) out.annotations = new Annotation[] {overrideAnn, sefAnn};
|
||||
else if (overrideAnn != null) out.annotations = new Annotation[] {overrideAnn};
|
||||
else if (sefAnn != null) out.annotations = new Annotation[] {sefAnn};
|
||||
out.arguments = HandleBuilder.generateBuildArgs(cfv, builderType, builderFields, source);
|
||||
out.traverse(new SetGeneratedByVisitor(source), (ClassScope) null);
|
||||
return out;
|
||||
}
|
||||
|
||||
private MethodDeclaration generateBuildMethod(EclipseNode tdParent, String name, TypeReference returnType, ASTNode source) {
|
||||
MethodDeclaration out = new MethodDeclaration(((CompilationUnitDeclaration) tdParent.top().get()).compilationResult);
|
||||
private MethodDeclaration generateBuildMethod(CheckerFrameworkVersion cfv, EclipseNode builderType, String name, TypeReference returnType, List<BuilderFieldData> builderFields, ASTNode source) {
|
||||
MethodDeclaration out = new MethodDeclaration(((CompilationUnitDeclaration) builderType.top().get()).compilationResult);
|
||||
out.bits |= ECLIPSE_DO_NOT_TOUCH_FLAG;
|
||||
List<Statement> statements = new ArrayList<Statement>();
|
||||
|
||||
@@ -800,7 +830,10 @@ public class HandleSuperBuilder extends EclipseAnnotationHandler<SuperBuilder> {
|
||||
out.selector = name.toCharArray();
|
||||
out.bits |= ECLIPSE_DO_NOT_TOUCH_FLAG;
|
||||
out.returnType = returnType;
|
||||
out.annotations = new Annotation[] {makeMarkerAnnotation(TypeConstants.JAVA_LANG_OVERRIDE, source)};
|
||||
Annotation overrideAnn = makeMarkerAnnotation(TypeConstants.JAVA_LANG_OVERRIDE, source);
|
||||
Annotation sefAnn = cfv.generateSideEffectFree() ? generateNamedAnnotation(source, CheckerFrameworkVersion.NAME__SIDE_EFFECT_FREE): null;
|
||||
if (sefAnn != null) out.annotations = new Annotation[] {overrideAnn, sefAnn};
|
||||
else out.annotations = new Annotation[] {overrideAnn};
|
||||
|
||||
AllocationExpression allocationStatement = new AllocationExpression();
|
||||
allocationStatement.type = copyType(out.returnType);
|
||||
@@ -809,6 +842,7 @@ public class HandleSuperBuilder extends EclipseAnnotationHandler<SuperBuilder> {
|
||||
statements.add(new ReturnStatement(allocationStatement, 0, 0));
|
||||
out.statements = statements.isEmpty() ? null : statements.toArray(new Statement[0]);
|
||||
out.traverse(new SetGeneratedByVisitor(source), (ClassScope) null);
|
||||
out.arguments = HandleBuilder.generateBuildArgs(cfv, builderType, builderFields, source);
|
||||
return out;
|
||||
}
|
||||
|
||||
@@ -872,7 +906,7 @@ public class HandleSuperBuilder extends EclipseAnnotationHandler<SuperBuilder> {
|
||||
}
|
||||
}
|
||||
|
||||
private void generateSetterMethodsForBuilder(EclipseNode builderType, BuilderFieldData bfd, EclipseNode sourceNode, final String builderGenericName) {
|
||||
private void generateSetterMethodsForBuilder(CheckerFrameworkVersion cfv, EclipseNode builderType, BuilderFieldData bfd, EclipseNode sourceNode, final String builderGenericName) {
|
||||
boolean deprecate = isFieldDeprecated(bfd.originalFieldNode);
|
||||
|
||||
TypeReferenceMaker returnTypeMaker = new TypeReferenceMaker() {
|
||||
@@ -891,14 +925,15 @@ public class HandleSuperBuilder extends EclipseAnnotationHandler<SuperBuilder> {
|
||||
};
|
||||
|
||||
if (bfd.singularData == null || bfd.singularData.getSingularizer() == null) {
|
||||
generateSimpleSetterMethodForBuilder(builderType, deprecate, bfd.createdFields.get(0), bfd.name, bfd.nameOfSetFlag, true, returnTypeMaker.make(), returnStatementMaker.make(), sourceNode, bfd.annotations, bfd.originalFieldNode);
|
||||
generateSimpleSetterMethodForBuilder(cfv, builderType, deprecate, bfd.createdFields.get(0), bfd.name, bfd.nameOfSetFlag, true, returnTypeMaker.make(), returnStatementMaker.make(), sourceNode, bfd.annotations, bfd.originalFieldNode);
|
||||
} else {
|
||||
bfd.singularData.getSingularizer().generateMethods(bfd.singularData, deprecate, builderType, true, returnTypeMaker, returnStatementMaker, AccessLevel.PUBLIC);
|
||||
bfd.singularData.getSingularizer().generateMethods(cfv, bfd.singularData, deprecate, builderType, true, returnTypeMaker, returnStatementMaker, AccessLevel.PUBLIC);
|
||||
}
|
||||
}
|
||||
|
||||
private void generateSimpleSetterMethodForBuilder(EclipseNode builderType, boolean deprecate, EclipseNode fieldNode, char[] paramName, char[] nameOfSetFlag, boolean fluent, TypeReference returnType, Statement returnStatement, EclipseNode sourceNode, Annotation[] annosOnParam, EclipseNode originalFieldNode) {
|
||||
private void generateSimpleSetterMethodForBuilder(CheckerFrameworkVersion cfv, EclipseNode builderType, boolean deprecate, EclipseNode fieldNode, char[] paramName, char[] nameOfSetFlag, boolean fluent, TypeReference returnType, Statement returnStatement, EclipseNode sourceNode, Annotation[] annosOnParam, EclipseNode originalFieldNode) {
|
||||
TypeDeclaration td = (TypeDeclaration) builderType.get();
|
||||
ASTNode source = sourceNode.get();
|
||||
AbstractMethodDeclaration[] existing = td.methods;
|
||||
if (existing == null) existing = EMPTY_METHODS;
|
||||
int len = existing.length;
|
||||
@@ -913,11 +948,24 @@ public class HandleSuperBuilder extends EclipseAnnotationHandler<SuperBuilder> {
|
||||
|
||||
String setterName = fluent ? new String(paramName) : HandlerUtil.buildAccessorName("set", new String(paramName));
|
||||
|
||||
List<Annotation> methodAnnsList = Collections.<Annotation>emptyList();
|
||||
Annotation[] methodAnns = EclipseHandlerUtil.findCopyableToSetterAnnotations(originalFieldNode);
|
||||
if (methodAnns != null && methodAnns.length > 0) methodAnnsList = Arrays.asList(methodAnns);
|
||||
List<Annotation> methodAnnsList = Arrays.asList(EclipseHandlerUtil.findCopyableToSetterAnnotations(originalFieldNode));
|
||||
if (cfv.generateReturnsReceiver()) {
|
||||
methodAnnsList = new ArrayList<Annotation>(methodAnnsList);
|
||||
methodAnnsList.add(generateNamedAnnotation(source, CheckerFrameworkVersion.NAME__RETURNS_RECEIVER));
|
||||
}
|
||||
MethodDeclaration setter = HandleSetter.createSetter(td, deprecate, fieldNode, setterName, paramName, nameOfSetFlag, returnType, returnStatement, ClassFileConstants.AccPublic,
|
||||
sourceNode, methodAnnsList, annosOnParam != null ? Arrays.asList(copyAnnotations(sourceNode.get(), annosOnParam)) : Collections.<Annotation>emptyList());
|
||||
sourceNode, methodAnnsList, annosOnParam != null ? Arrays.asList(copyAnnotations(source, annosOnParam)) : Collections.<Annotation>emptyList());
|
||||
if (cfv.generateCalledMethods()) {
|
||||
Argument[] arr = setter.arguments == null ? new Argument[0] : setter.arguments;
|
||||
Argument[] newArr = new Argument[arr.length + 1];
|
||||
System.arraycopy(arr, 0, newArr, 1, arr.length);
|
||||
newArr[0] = new Argument(new char[] { 't', 'h', 'i', 's' }, 0, new SingleTypeReference(builderType.getName().toCharArray(), 0), Modifier.FINAL);
|
||||
char[][] nameNotCalled = fromQualifiedName(CheckerFrameworkVersion.NAME__NOT_CALLED);
|
||||
SingleMemberAnnotation ann = new SingleMemberAnnotation(new QualifiedTypeReference(nameNotCalled, poss(source, nameNotCalled.length)), source.sourceStart);
|
||||
ann.memberValue = new StringLiteral(setterName.toCharArray(), 0, 0, 0);
|
||||
newArr[0].annotations = new Annotation[] {ann};
|
||||
setter.arguments = newArr;
|
||||
}
|
||||
injectMethod(builderType, setter);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2009-2018 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
|
||||
@@ -60,6 +60,7 @@ import lombok.ToString;
|
||||
import lombok.core.AST.Kind;
|
||||
import lombok.core.AnnotationValues;
|
||||
import lombok.core.configuration.CallSuperType;
|
||||
import lombok.core.configuration.CheckerFrameworkVersion;
|
||||
import lombok.core.handlers.HandlerUtil.FieldAccess;
|
||||
import lombok.core.handlers.InclusionExclusionUtils;
|
||||
import lombok.core.handlers.InclusionExclusionUtils.Included;
|
||||
@@ -300,7 +301,12 @@ public class HandleToString extends EclipseAnnotationHandler<ToString> {
|
||||
method.modifiers = toEclipseModifier(AccessLevel.PUBLIC);
|
||||
method.returnType = new QualifiedTypeReference(TypeConstants.JAVA_LANG_STRING, new long[] {p, p, p});
|
||||
setGeneratedBy(method.returnType, source);
|
||||
method.annotations = new Annotation[] {makeMarkerAnnotation(TypeConstants.JAVA_LANG_OVERRIDE, source)};
|
||||
Annotation overrideAnnotation = makeMarkerAnnotation(TypeConstants.JAVA_LANG_OVERRIDE, source);
|
||||
if (getCheckerFrameworkVersion(type).generateSideEffectFree()) {
|
||||
method.annotations = new Annotation[] { overrideAnnotation, generateNamedAnnotation(source, CheckerFrameworkVersion.NAME__SIDE_EFFECT_FREE) };
|
||||
} else {
|
||||
method.annotations = new Annotation[] { overrideAnnotation };
|
||||
}
|
||||
method.arguments = null;
|
||||
method.selector = "toString".toCharArray();
|
||||
method.thrownExceptions = null;
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2012-2014 The Project Lombok Authors.
|
||||
* Copyright (C) 2012-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
|
||||
@@ -33,6 +33,7 @@ import java.util.List;
|
||||
import lombok.AccessLevel;
|
||||
import lombok.ConfigurationKeys;
|
||||
import lombok.core.AST.Kind;
|
||||
import lombok.core.configuration.CheckerFrameworkVersion;
|
||||
import lombok.core.AnnotationValues;
|
||||
import lombok.eclipse.EclipseAnnotationHandler;
|
||||
import lombok.eclipse.EclipseNode;
|
||||
@@ -226,11 +227,11 @@ public class HandleWither extends EclipseAnnotationHandler<Wither> {
|
||||
method.returnType = cloneSelfType(fieldNode, source);
|
||||
if (method.returnType == null) return null;
|
||||
|
||||
Annotation[] deprecated = null;
|
||||
if (isFieldDeprecated(fieldNode)) {
|
||||
deprecated = new Annotation[] { generateDeprecatedAnnotation(source) };
|
||||
}
|
||||
method.annotations = copyAnnotations(source, onMethod.toArray(new Annotation[0]), deprecated);
|
||||
Annotation[] deprecated = null, checkerFramework = null;
|
||||
if (isFieldDeprecated(fieldNode)) deprecated = new Annotation[] { generateDeprecatedAnnotation(source) };
|
||||
if (getCheckerFrameworkVersion(fieldNode).generateSideEffectFree()) checkerFramework = new Annotation[] { generateNamedAnnotation(source, CheckerFrameworkVersion.NAME__SIDE_EFFECT_FREE) };
|
||||
|
||||
method.annotations = copyAnnotations(source, onMethod.toArray(new Annotation[0]), checkerFramework, deprecated);
|
||||
Argument param = new Argument(field.name, p, copyType(field.type, source), ClassFileConstants.AccFinal);
|
||||
param.sourceStart = pS; param.sourceEnd = pE;
|
||||
method.arguments = new Argument[] { param };
|
||||
|
||||
@@ -31,6 +31,7 @@ import java.util.List;
|
||||
import lombok.AccessLevel;
|
||||
import lombok.core.GuavaTypeMap;
|
||||
import lombok.core.LombokImmutableList;
|
||||
import lombok.core.configuration.CheckerFrameworkVersion;
|
||||
import lombok.core.handlers.HandlerUtil;
|
||||
import lombok.eclipse.EclipseNode;
|
||||
import lombok.eclipse.handlers.HandleNonNull;
|
||||
@@ -111,13 +112,13 @@ abstract class EclipseGuavaSingularizer extends EclipseSingularizer {
|
||||
return Collections.singletonList(injectFieldAndMarkGenerated(builderType, buildField));
|
||||
}
|
||||
|
||||
@Override public void generateMethods(SingularData data, boolean deprecate, EclipseNode builderType, boolean fluent, TypeReferenceMaker returnTypeMaker, StatementMaker returnStatementMaker, AccessLevel access) {
|
||||
generateSingularMethod(deprecate, returnTypeMaker.make(), returnStatementMaker.make(), data, builderType, fluent, access);
|
||||
generatePluralMethod(deprecate, returnTypeMaker.make(), returnStatementMaker.make(), data, builderType, fluent, access);
|
||||
generateClearMethod(deprecate, returnTypeMaker.make(), returnStatementMaker.make(), data, builderType, access);
|
||||
@Override public void generateMethods(CheckerFrameworkVersion cfv, SingularData data, boolean deprecate, EclipseNode builderType, boolean fluent, TypeReferenceMaker returnTypeMaker, StatementMaker returnStatementMaker, AccessLevel access) {
|
||||
generateSingularMethod(cfv, deprecate, returnTypeMaker.make(), returnStatementMaker.make(), data, builderType, fluent, access);
|
||||
generatePluralMethod(cfv, deprecate, returnTypeMaker.make(), returnStatementMaker.make(), data, builderType, fluent, access);
|
||||
generateClearMethod(cfv, deprecate, returnTypeMaker.make(), returnStatementMaker.make(), data, builderType, access);
|
||||
}
|
||||
|
||||
void generateClearMethod(boolean deprecate, TypeReference returnType, Statement returnStatement, SingularData data, EclipseNode builderType, AccessLevel access) {
|
||||
void generateClearMethod(CheckerFrameworkVersion cfv, boolean deprecate, TypeReference returnType, Statement returnStatement, SingularData data, EclipseNode builderType, AccessLevel access) {
|
||||
MethodDeclaration md = new MethodDeclaration(((CompilationUnitDeclaration) builderType.top().get()).compilationResult);
|
||||
md.bits |= ECLIPSE_DO_NOT_TOUCH_FLAG;
|
||||
md.modifiers = toEclipseModifier(access);
|
||||
@@ -128,13 +129,13 @@ abstract class EclipseGuavaSingularizer extends EclipseSingularizer {
|
||||
md.selector = HandlerUtil.buildAccessorName("clear", new String(data.getPluralName())).toCharArray();
|
||||
md.statements = returnStatement != null ? new Statement[] {a, returnStatement} : new Statement[] {a};
|
||||
md.returnType = returnType;
|
||||
md.annotations = deprecate ? new Annotation[] { generateDeprecatedAnnotation(data.getSource()) } : null;
|
||||
md.annotations = generateSelfReturnAnnotations(deprecate, cfv, data.getSource());
|
||||
|
||||
data.setGeneratedByRecursive(md);
|
||||
injectMethod(builderType, md);
|
||||
}
|
||||
|
||||
void generateSingularMethod(boolean deprecate, TypeReference returnType, Statement returnStatement, SingularData data, EclipseNode builderType, boolean fluent, AccessLevel access) {
|
||||
void generateSingularMethod(CheckerFrameworkVersion cfv, boolean deprecate, TypeReference returnType, Statement returnStatement, SingularData data, EclipseNode builderType, boolean fluent, AccessLevel access) {
|
||||
LombokImmutableList<String> suffixes = getArgumentSuffixes();
|
||||
char[][] names = new char[suffixes.size()][];
|
||||
for (int i = 0; i < suffixes.size(); i++) {
|
||||
@@ -172,13 +173,13 @@ abstract class EclipseGuavaSingularizer extends EclipseSingularizer {
|
||||
}
|
||||
md.returnType = returnType;
|
||||
md.selector = fluent ? data.getSingularName() : HandlerUtil.buildAccessorName(getAddMethodName(), new String(data.getSingularName())).toCharArray();
|
||||
md.annotations = deprecate ? new Annotation[] { generateDeprecatedAnnotation(data.getSource()) } : null;
|
||||
md.annotations = generateSelfReturnAnnotations(deprecate, cfv, data.getSource());
|
||||
|
||||
data.setGeneratedByRecursive(md);
|
||||
HandleNonNull.INSTANCE.fix(injectMethod(builderType, md));
|
||||
}
|
||||
|
||||
void generatePluralMethod(boolean deprecate, TypeReference returnType, Statement returnStatement, SingularData data, EclipseNode builderType, boolean fluent, AccessLevel access) {
|
||||
void generatePluralMethod(CheckerFrameworkVersion cfv, boolean deprecate, TypeReference returnType, Statement returnStatement, SingularData data, EclipseNode builderType, boolean fluent, AccessLevel access) {
|
||||
MethodDeclaration md = new MethodDeclaration(((CompilationUnitDeclaration) builderType.top().get()).compilationResult);
|
||||
md.bits |= ECLIPSE_DO_NOT_TOUCH_FLAG;
|
||||
md.modifiers = toEclipseModifier(access);
|
||||
@@ -204,7 +205,7 @@ abstract class EclipseGuavaSingularizer extends EclipseSingularizer {
|
||||
md.arguments = new Argument[] {param};
|
||||
md.returnType = returnType;
|
||||
md.selector = fluent ? data.getPluralName() : HandlerUtil.buildAccessorName(getAddMethodName() + "All", new String(data.getPluralName())).toCharArray();
|
||||
md.annotations = deprecate ? new Annotation[] { generateDeprecatedAnnotation(data.getSource()) } : null;
|
||||
md.annotations = generateSelfReturnAnnotations(deprecate, cfv, data.getSource());
|
||||
|
||||
data.setGeneratedByRecursive(md);
|
||||
injectMethod(builderType, md);
|
||||
|
||||
+12
-11
@@ -29,6 +29,7 @@ import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
import lombok.AccessLevel;
|
||||
import lombok.core.configuration.CheckerFrameworkVersion;
|
||||
import lombok.core.handlers.HandlerUtil;
|
||||
import lombok.eclipse.EclipseNode;
|
||||
import lombok.eclipse.handlers.HandleNonNull;
|
||||
@@ -91,18 +92,18 @@ abstract class EclipseJavaUtilListSetSingularizer extends EclipseJavaUtilSingula
|
||||
return Collections.singletonList(injectFieldAndMarkGenerated(builderType, buildField));
|
||||
}
|
||||
|
||||
@Override public void generateMethods(SingularData data, boolean deprecate, EclipseNode builderType, boolean fluent, TypeReferenceMaker returnTypeMaker, StatementMaker returnStatementMaker, AccessLevel access) {
|
||||
@Override public void generateMethods(CheckerFrameworkVersion cfv, SingularData data, boolean deprecate, EclipseNode builderType, boolean fluent, TypeReferenceMaker returnTypeMaker, StatementMaker returnStatementMaker, AccessLevel access) {
|
||||
if (useGuavaInstead(builderType)) {
|
||||
guavaListSetSingularizer.generateMethods(data, deprecate, builderType, fluent, returnTypeMaker, returnStatementMaker, access);
|
||||
guavaListSetSingularizer.generateMethods(cfv, data, deprecate, builderType, fluent, returnTypeMaker, returnStatementMaker, access);
|
||||
return;
|
||||
}
|
||||
|
||||
generateSingularMethod(deprecate, returnTypeMaker.make(), returnStatementMaker.make(), data, builderType, fluent, access);
|
||||
generatePluralMethod(deprecate, returnTypeMaker.make(), returnStatementMaker.make(), data, builderType, fluent, access);
|
||||
generateClearMethod(deprecate, returnTypeMaker.make(), returnStatementMaker.make(), data, builderType, access);
|
||||
generateSingularMethod(cfv, deprecate, returnTypeMaker.make(), returnStatementMaker.make(), data, builderType, fluent, access);
|
||||
generatePluralMethod(cfv, deprecate, returnTypeMaker.make(), returnStatementMaker.make(), data, builderType, fluent, access);
|
||||
generateClearMethod(cfv, deprecate, returnTypeMaker.make(), returnStatementMaker.make(), data, builderType, access);
|
||||
}
|
||||
|
||||
private void generateClearMethod(boolean deprecate, TypeReference returnType, Statement returnStatement, SingularData data, EclipseNode builderType, AccessLevel access) {
|
||||
private void generateClearMethod(CheckerFrameworkVersion cfv, boolean deprecate, TypeReference returnType, Statement returnStatement, SingularData data, EclipseNode builderType, AccessLevel access) {
|
||||
MethodDeclaration md = new MethodDeclaration(((CompilationUnitDeclaration) builderType.top().get()).compilationResult);
|
||||
md.bits |= ECLIPSE_DO_NOT_TOUCH_FLAG;
|
||||
md.modifiers = toEclipseModifier(access);
|
||||
@@ -118,13 +119,13 @@ abstract class EclipseJavaUtilListSetSingularizer extends EclipseJavaUtilSingula
|
||||
Statement clearStatement = new IfStatement(new EqualExpression(thisDotField, new NullLiteral(0, 0), OperatorIds.NOT_EQUAL), clearMsg, 0, 0);
|
||||
md.statements = returnStatement != null ? new Statement[] {clearStatement, returnStatement} : new Statement[] {clearStatement};
|
||||
md.returnType = returnType;
|
||||
md.annotations = deprecate ? new Annotation[] { generateDeprecatedAnnotation(data.getSource()) } : null;
|
||||
md.annotations = generateSelfReturnAnnotations(deprecate, cfv, data.getSource());
|
||||
|
||||
data.setGeneratedByRecursive(md);
|
||||
injectMethod(builderType, md);
|
||||
}
|
||||
|
||||
void generateSingularMethod(boolean deprecate, TypeReference returnType, Statement returnStatement, SingularData data, EclipseNode builderType, boolean fluent, AccessLevel access) {
|
||||
void generateSingularMethod(CheckerFrameworkVersion cfv, boolean deprecate, TypeReference returnType, Statement returnStatement, SingularData data, EclipseNode builderType, boolean fluent, AccessLevel access) {
|
||||
MethodDeclaration md = new MethodDeclaration(((CompilationUnitDeclaration) builderType.top().get()).compilationResult);
|
||||
md.bits |= ECLIPSE_DO_NOT_TOUCH_FLAG;
|
||||
md.modifiers = toEclipseModifier(access);
|
||||
@@ -150,13 +151,13 @@ abstract class EclipseJavaUtilListSetSingularizer extends EclipseJavaUtilSingula
|
||||
md.arguments = new Argument[] {param};
|
||||
md.returnType = returnType;
|
||||
md.selector = fluent ? data.getSingularName() : HandlerUtil.buildAccessorName("add", new String(data.getSingularName())).toCharArray();
|
||||
md.annotations = deprecate ? new Annotation[] { generateDeprecatedAnnotation(data.getSource()) } : null;
|
||||
md.annotations = generateSelfReturnAnnotations(deprecate, cfv, data.getSource());
|
||||
|
||||
data.setGeneratedByRecursive(md);
|
||||
HandleNonNull.INSTANCE.fix(injectMethod(builderType, md));
|
||||
}
|
||||
|
||||
void generatePluralMethod(boolean deprecate, TypeReference returnType, Statement returnStatement, SingularData data, EclipseNode builderType, boolean fluent, AccessLevel access) {
|
||||
void generatePluralMethod(CheckerFrameworkVersion cfv, boolean deprecate, TypeReference returnType, Statement returnStatement, SingularData data, EclipseNode builderType, boolean fluent, AccessLevel access) {
|
||||
MethodDeclaration md = new MethodDeclaration(((CompilationUnitDeclaration) builderType.top().get()).compilationResult);
|
||||
md.bits |= ECLIPSE_DO_NOT_TOUCH_FLAG;
|
||||
md.modifiers = toEclipseModifier(access);
|
||||
@@ -181,7 +182,7 @@ abstract class EclipseJavaUtilListSetSingularizer extends EclipseJavaUtilSingula
|
||||
md.arguments = new Argument[] {param};
|
||||
md.returnType = returnType;
|
||||
md.selector = fluent ? data.getPluralName() : HandlerUtil.buildAccessorName("addAll", new String(data.getPluralName())).toCharArray();
|
||||
md.annotations = deprecate ? new Annotation[] { generateDeprecatedAnnotation(data.getSource()) } : null;
|
||||
md.annotations = generateSelfReturnAnnotations(deprecate, cfv, data.getSource());
|
||||
|
||||
data.setGeneratedByRecursive(md);
|
||||
injectMethod(builderType, md);
|
||||
|
||||
@@ -54,6 +54,7 @@ import org.mangosdk.spi.ProviderFor;
|
||||
|
||||
import lombok.AccessLevel;
|
||||
import lombok.core.LombokImmutableList;
|
||||
import lombok.core.configuration.CheckerFrameworkVersion;
|
||||
import lombok.core.handlers.HandlerUtil;
|
||||
import lombok.eclipse.EclipseNode;
|
||||
import lombok.eclipse.handlers.EclipseSingularsRecipes.EclipseSingularizer;
|
||||
@@ -150,18 +151,18 @@ public class EclipseJavaUtilMapSingularizer extends EclipseJavaUtilSingularizer
|
||||
return Arrays.asList(keyFieldNode, valueFieldNode);
|
||||
}
|
||||
|
||||
@Override public void generateMethods(SingularData data, boolean deprecate, EclipseNode builderType, boolean fluent, TypeReferenceMaker returnTypeMaker, StatementMaker returnStatementMaker, AccessLevel access) {
|
||||
@Override public void generateMethods(CheckerFrameworkVersion cfv, SingularData data, boolean deprecate, EclipseNode builderType, boolean fluent, TypeReferenceMaker returnTypeMaker, StatementMaker returnStatementMaker, AccessLevel access) {
|
||||
if (useGuavaInstead(builderType)) {
|
||||
guavaMapSingularizer.generateMethods(data, deprecate, builderType, fluent, returnTypeMaker, returnStatementMaker, access);
|
||||
guavaMapSingularizer.generateMethods(cfv, data, deprecate, builderType, fluent, returnTypeMaker, returnStatementMaker, access);
|
||||
return;
|
||||
}
|
||||
|
||||
generateSingularMethod(deprecate, returnTypeMaker.make(), returnStatementMaker.make(), data, builderType, fluent, access);
|
||||
generatePluralMethod(deprecate, returnTypeMaker.make(), returnStatementMaker.make(), data, builderType, fluent, access);
|
||||
generateClearMethod(deprecate, returnTypeMaker.make(), returnStatementMaker.make(), data, builderType, access);
|
||||
generateSingularMethod(cfv, deprecate, returnTypeMaker.make(), returnStatementMaker.make(), data, builderType, fluent, access);
|
||||
generatePluralMethod(cfv, deprecate, returnTypeMaker.make(), returnStatementMaker.make(), data, builderType, fluent, access);
|
||||
generateClearMethod(cfv, deprecate, returnTypeMaker.make(), returnStatementMaker.make(), data, builderType, access);
|
||||
}
|
||||
|
||||
private void generateClearMethod(boolean deprecate, TypeReference returnType, Statement returnStatement, SingularData data, EclipseNode builderType, AccessLevel access) {
|
||||
private void generateClearMethod(CheckerFrameworkVersion cfv, boolean deprecate, TypeReference returnType, Statement returnStatement, SingularData data, EclipseNode builderType, AccessLevel access) {
|
||||
MethodDeclaration md = new MethodDeclaration(((CompilationUnitDeclaration) builderType.top().get()).compilationResult);
|
||||
md.bits |= ECLIPSE_DO_NOT_TOUCH_FLAG;
|
||||
md.modifiers = toEclipseModifier(access);
|
||||
@@ -188,13 +189,13 @@ public class EclipseJavaUtilMapSingularizer extends EclipseJavaUtilSingularizer
|
||||
Statement clearStatement = new IfStatement(new EqualExpression(thisDotField, new NullLiteral(0, 0), OperatorIds.NOT_EQUAL), clearMsgs, 0, 0);
|
||||
md.statements = returnStatement != null ? new Statement[] {clearStatement, returnStatement} : new Statement[] {clearStatement};
|
||||
md.returnType = returnType;
|
||||
md.annotations = deprecate ? new Annotation[] { generateDeprecatedAnnotation(data.getSource()) } : null;
|
||||
md.annotations = generateSelfReturnAnnotations(deprecate, cfv, data.getSource());
|
||||
|
||||
data.setGeneratedByRecursive(md);
|
||||
injectMethod(builderType, md);
|
||||
}
|
||||
|
||||
private void generateSingularMethod(boolean deprecate, TypeReference returnType, Statement returnStatement, SingularData data, EclipseNode builderType, boolean fluent, AccessLevel access) {
|
||||
private void generateSingularMethod(CheckerFrameworkVersion cfv, boolean deprecate, TypeReference returnType, Statement returnStatement, SingularData data, EclipseNode builderType, boolean fluent, AccessLevel access) {
|
||||
MethodDeclaration md = new MethodDeclaration(((CompilationUnitDeclaration) builderType.top().get()).compilationResult);
|
||||
md.bits |= ECLIPSE_DO_NOT_TOUCH_FLAG;
|
||||
md.modifiers = toEclipseModifier(access);
|
||||
@@ -245,13 +246,13 @@ public class EclipseJavaUtilMapSingularizer extends EclipseJavaUtilSingularizer
|
||||
md.arguments = new Argument[] {keyParam, valueParam};
|
||||
md.returnType = returnType;
|
||||
md.selector = fluent ? data.getSingularName() : HandlerUtil.buildAccessorName("put", new String(data.getSingularName())).toCharArray();
|
||||
md.annotations = deprecate ? new Annotation[] { generateDeprecatedAnnotation(data.getSource()) } : null;
|
||||
md.annotations = generateSelfReturnAnnotations(deprecate, cfv, data.getSource());
|
||||
|
||||
data.setGeneratedByRecursive(md);
|
||||
HandleNonNull.INSTANCE.fix(injectMethod(builderType, md));
|
||||
}
|
||||
|
||||
private void generatePluralMethod(boolean deprecate, TypeReference returnType, Statement returnStatement, SingularData data, EclipseNode builderType, boolean fluent, AccessLevel access) {
|
||||
private void generatePluralMethod(CheckerFrameworkVersion cfv, boolean deprecate, TypeReference returnType, Statement returnStatement, SingularData data, EclipseNode builderType, boolean fluent, AccessLevel access) {
|
||||
MethodDeclaration md = new MethodDeclaration(((CompilationUnitDeclaration) builderType.top().get()).compilationResult);
|
||||
md.bits |= ECLIPSE_DO_NOT_TOUCH_FLAG;
|
||||
md.modifiers = toEclipseModifier(access);
|
||||
@@ -309,7 +310,7 @@ public class EclipseJavaUtilMapSingularizer extends EclipseJavaUtilSingularizer
|
||||
md.arguments = new Argument[] {param};
|
||||
md.returnType = returnType;
|
||||
md.selector = fluent ? data.getPluralName() : HandlerUtil.buildAccessorName("putAll", new String(data.getPluralName())).toCharArray();
|
||||
md.annotations = deprecate ? new Annotation[] { generateDeprecatedAnnotation(data.getSource()) } : null;
|
||||
md.annotations = generateSelfReturnAnnotations(deprecate, cfv, data.getSource());
|
||||
|
||||
data.setGeneratedByRecursive(md);
|
||||
injectMethod(builderType, md);
|
||||
|
||||
@@ -58,6 +58,7 @@ import lombok.ToString;
|
||||
import lombok.core.AST.Kind;
|
||||
import lombok.core.AnnotationValues;
|
||||
import lombok.core.HandlerPriority;
|
||||
import lombok.core.configuration.CheckerFrameworkVersion;
|
||||
import lombok.core.handlers.HandlerUtil;
|
||||
import lombok.core.handlers.InclusionExclusionUtils.Included;
|
||||
import lombok.experimental.NonFinal;
|
||||
@@ -102,6 +103,7 @@ public class HandleBuilder extends JavacAnnotationHandler<Builder> {
|
||||
|
||||
@Override public void handle(AnnotationValues<Builder> annotation, JCAnnotation ast, JavacNode annotationNode) {
|
||||
handleFlagUsage(annotationNode, ConfigurationKeys.BUILDER_FLAG_USAGE, "@Builder");
|
||||
CheckerFrameworkVersion cfv = getCheckerFrameworkVersion(annotationNode);
|
||||
|
||||
Builder builderInstance = annotation.getInstance();
|
||||
AccessLevel accessForOuters = builderInstance.access();
|
||||
@@ -434,14 +436,14 @@ public class HandleBuilder extends JavacAnnotationHandler<Builder> {
|
||||
}
|
||||
|
||||
for (BuilderFieldData bfd : builderFields) {
|
||||
makeSetterMethodsForBuilder(builderType, bfd, annotationNode, fluent, chain, accessForInners);
|
||||
makeSetterMethodsForBuilder(cfv, builderType, bfd, annotationNode, fluent, chain, accessForInners);
|
||||
}
|
||||
|
||||
{
|
||||
MemberExistsResult methodExists = methodExists(buildMethodName, builderType, -1);
|
||||
if (methodExists == MemberExistsResult.EXISTS_BY_LOMBOK) methodExists = methodExists(buildMethodName, builderType, 0);
|
||||
if (methodExists == MemberExistsResult.NOT_EXISTS) {
|
||||
JCMethodDecl md = generateBuildMethod(tdParent, isStatic, buildMethodName, nameOfBuilderMethod, returnType, builderFields, builderType, thrownExceptions, ast, addCleaning, accessForInners);
|
||||
JCMethodDecl md = generateBuildMethod(cfv, tdParent, isStatic, buildMethodName, nameOfBuilderMethod, returnType, builderFields, builderType, thrownExceptions, ast, addCleaning, accessForInners);
|
||||
if (md != null) {
|
||||
injectMethod(builderType, md);
|
||||
recursiveSetGeneratedBy(md, ast, annotationNode.getContext());
|
||||
@@ -465,7 +467,7 @@ public class HandleBuilder extends JavacAnnotationHandler<Builder> {
|
||||
|
||||
if (generateBuilderMethod && methodExists(builderMethodName, tdParent, -1) != MemberExistsResult.NOT_EXISTS) generateBuilderMethod = false;
|
||||
if (generateBuilderMethod) {
|
||||
JCMethodDecl md = generateBuilderMethod(isStatic, builderMethodName, builderClassName, annotationNode, tdParent, typeParams, accessForOuters);
|
||||
JCMethodDecl md = generateBuilderMethod(cfv, isStatic, builderMethodName, builderClassName, annotationNode, tdParent, typeParams, accessForOuters);
|
||||
recursiveSetGeneratedBy(md, ast, annotationNode.getContext());
|
||||
if (md != null) injectMethod(tdParent, md);
|
||||
}
|
||||
@@ -485,7 +487,7 @@ public class HandleBuilder extends JavacAnnotationHandler<Builder> {
|
||||
}
|
||||
tps = lb.toList();
|
||||
}
|
||||
JCMethodDecl md = generateToBuilderMethod(toBuilderMethodName, builderClassName, tdParent, tps, builderFields, fluent, ast, accessForOuters);
|
||||
JCMethodDecl md = generateToBuilderMethod(cfv, toBuilderMethodName, builderClassName, tdParent, tps, builderFields, fluent, ast, accessForOuters);
|
||||
if (md != null) {
|
||||
recursiveSetGeneratedBy(md, ast, annotationNode.getContext());
|
||||
injectMethod(tdParent, md);
|
||||
@@ -534,7 +536,7 @@ public class HandleBuilder extends JavacAnnotationHandler<Builder> {
|
||||
}
|
||||
|
||||
private static final String BUILDER_TEMP_VAR = "builder";
|
||||
private JCMethodDecl generateToBuilderMethod(String toBuilderMethodName, String builderClassName, JavacNode type, List<JCTypeParameter> typeParams, java.util.List<BuilderFieldData> builderFields, boolean fluent, JCAnnotation ast, AccessLevel access) {
|
||||
private JCMethodDecl generateToBuilderMethod(CheckerFrameworkVersion cfv, String toBuilderMethodName, String builderClassName, JavacNode type, List<JCTypeParameter> typeParams, java.util.List<BuilderFieldData> builderFields, boolean fluent, JCAnnotation ast, AccessLevel access) {
|
||||
// return new ThingieBuilder<A, B>().setA(this.a).setB(this.b);
|
||||
JavacTreeMaker maker = type.getTreeMaker();
|
||||
|
||||
@@ -585,7 +587,8 @@ public class HandleBuilder extends JavacAnnotationHandler<Builder> {
|
||||
statements.append(maker.Return(invoke));
|
||||
}
|
||||
JCBlock body = maker.Block(0, statements.toList());
|
||||
return maker.MethodDef(maker.Modifiers(toJavacModifier(access)), type.toName(toBuilderMethodName), namePlusTypeParamsToTypeReference(maker, type.toName(builderClassName), typeParams), List.<JCTypeParameter>nil(), List.<JCVariableDecl>nil(), List.<JCExpression>nil(), body, null);
|
||||
List<JCAnnotation> annsOnMethod = cfv.generateUnique() ? List.of(maker.Annotation(genTypeRef(type, CheckerFrameworkVersion.NAME__UNIQUE), List.<JCExpression>nil())) : List.<JCAnnotation>nil();
|
||||
return maker.MethodDef(maker.Modifiers(toJavacModifier(access), annsOnMethod), type.toName(toBuilderMethodName), namePlusTypeParamsToTypeReference(maker, type.toName(builderClassName), typeParams), List.<JCTypeParameter>nil(), List.<JCVariableDecl>nil(), List.<JCExpression>nil(), body, null);
|
||||
}
|
||||
|
||||
private JCMethodDecl generateCleanMethod(java.util.List<BuilderFieldData> builderFields, JavacNode type, JCTree source) {
|
||||
@@ -617,7 +620,30 @@ public class HandleBuilder extends JavacAnnotationHandler<Builder> {
|
||||
*/
|
||||
}
|
||||
|
||||
private JCMethodDecl generateBuildMethod(JavacNode tdParent, boolean isStatic, String buildName, Name builderName, JCExpression returnType, java.util.List<BuilderFieldData> builderFields, JavacNode type, List<JCExpression> thrownExceptions, JCTree source, boolean addCleaning, AccessLevel access) {
|
||||
static List<JCVariableDecl> generateBuildArgs(CheckerFrameworkVersion cfv, JavacNode type, java.util.List<BuilderFieldData> builderFields) {
|
||||
if (!cfv.generateCalledMethods()) return List.<JCVariableDecl>nil();
|
||||
|
||||
ArrayList<String> mandatories = new ArrayList<String>();
|
||||
for (BuilderFieldData bfd : builderFields) {
|
||||
if (bfd.singularData == null && bfd.nameOfSetFlag == null) mandatories.add(bfd.name.toString());
|
||||
}
|
||||
|
||||
JCExpression arg;
|
||||
JavacTreeMaker maker = type.getTreeMaker();
|
||||
if (mandatories.size() == 0) return List.<JCVariableDecl>nil();
|
||||
if (mandatories.size() == 1) arg = maker.Literal(mandatories.get(0));
|
||||
else {
|
||||
List<JCExpression> elems = List.nil();
|
||||
for (int i = mandatories.size() - 1; i >= 0; i--) elems = elems.prepend(maker.Literal(mandatories.get(i)));
|
||||
arg = maker.NewArray(null, List.<JCExpression>nil(), elems);
|
||||
}
|
||||
JCAnnotation recvAnno = maker.Annotation(genTypeRef(type, CheckerFrameworkVersion.NAME__CALLED), List.of(arg));
|
||||
JCClassDecl builderTypeNode = (JCClassDecl) type.get();
|
||||
JCVariableDecl recv = maker.VarDef(maker.Modifiers(0L, List.<JCAnnotation>of(recvAnno)), type.toName("this"), maker.Ident(builderTypeNode.name), null);
|
||||
return List.of(recv);
|
||||
}
|
||||
|
||||
private JCMethodDecl generateBuildMethod(CheckerFrameworkVersion cfv, JavacNode tdParent, boolean isStatic, String buildName, Name builderName, JCExpression returnType, java.util.List<BuilderFieldData> builderFields, JavacNode type, List<JCExpression> thrownExceptions, JCTree source, boolean addCleaning, AccessLevel access) {
|
||||
JavacTreeMaker maker = type.getTreeMaker();
|
||||
|
||||
JCExpression call;
|
||||
@@ -670,7 +696,9 @@ public class HandleBuilder extends JavacAnnotationHandler<Builder> {
|
||||
|
||||
JCBlock body = maker.Block(0, statements.toList());
|
||||
|
||||
return maker.MethodDef(maker.Modifiers(toJavacModifier(access)), type.toName(buildName), returnType, List.<JCTypeParameter>nil(), List.<JCVariableDecl>nil(), thrownExceptions, body, null);
|
||||
List<JCAnnotation> annsOnMethod = cfv.generateSideEffectFree() ? List.of(maker.Annotation(genTypeRef(type, CheckerFrameworkVersion.NAME__SIDE_EFFECT_FREE), List.<JCExpression>nil())) : List.<JCAnnotation>nil();
|
||||
List<JCVariableDecl> params = generateBuildArgs(cfv, type, builderFields);
|
||||
return maker.MethodDef(maker.Modifiers(toJavacModifier(access), annsOnMethod), type.toName(buildName), returnType, List.<JCTypeParameter>nil(), params, thrownExceptions, body, null);
|
||||
}
|
||||
|
||||
public static JCMethodDecl generateDefaultProvider(Name methodName, JavacNode fieldNode, List<JCTypeParameter> params) {
|
||||
@@ -685,7 +713,7 @@ public class HandleBuilder extends JavacAnnotationHandler<Builder> {
|
||||
return maker.MethodDef(maker.Modifiers(modifiers), methodName, cloneType(maker, field.vartype, field, fieldNode.getContext()), copyTypeParams(fieldNode, params), List.<JCVariableDecl>nil(), List.<JCExpression>nil(), body, null);
|
||||
}
|
||||
|
||||
public JCMethodDecl generateBuilderMethod(boolean isStatic, String builderMethodName, String builderClassName, JavacNode source, JavacNode type, List<JCTypeParameter> typeParams, AccessLevel access) {
|
||||
public JCMethodDecl generateBuilderMethod(CheckerFrameworkVersion cfv, boolean isStatic, String builderMethodName, String builderClassName, JavacNode source, JavacNode type, List<JCTypeParameter> typeParams, AccessLevel access) {
|
||||
JavacTreeMaker maker = type.getTreeMaker();
|
||||
|
||||
ListBuffer<JCExpression> typeArgs = new ListBuffer<JCExpression>();
|
||||
@@ -699,7 +727,14 @@ public class HandleBuilder extends JavacAnnotationHandler<Builder> {
|
||||
JCBlock body = maker.Block(0, List.<JCStatement>of(statement));
|
||||
int modifiers = toJavacModifier(access);
|
||||
if (isStatic) modifiers |= Flags.STATIC;
|
||||
return maker.MethodDef(maker.Modifiers(modifiers), type.toName(builderMethodName), namePlusTypeParamsToTypeReference(maker, type.toName(builderClassName), typeParams), copyTypeParams(source, typeParams), List.<JCVariableDecl>nil(), List.<JCExpression>nil(), body, null);
|
||||
JCAnnotation annUnique = cfv.generateUnique() ? maker.Annotation(genTypeRef(type, CheckerFrameworkVersion.NAME__UNIQUE), List.<JCExpression>nil()) : null;
|
||||
JCAnnotation annSef = cfv.generateSideEffectFree() ? maker.Annotation(genTypeRef(type, CheckerFrameworkVersion.NAME__SIDE_EFFECT_FREE), List.<JCExpression>nil()) : null;
|
||||
List<JCAnnotation> annsOnMethod;
|
||||
if (annUnique != null && annSef != null) annsOnMethod = List.of(annUnique, annSef);
|
||||
else if (annUnique != null) annsOnMethod = List.of(annUnique);
|
||||
else if (annSef != null) annsOnMethod = List.of(annSef);
|
||||
else annsOnMethod = List.nil();
|
||||
return maker.MethodDef(maker.Modifiers(modifiers, annsOnMethod), type.toName(builderMethodName), namePlusTypeParamsToTypeReference(maker, type.toName(builderClassName), typeParams), copyTypeParams(source, typeParams), List.<JCVariableDecl>nil(), List.<JCExpression>nil(), body, null);
|
||||
}
|
||||
|
||||
public void generateBuilderFields(JavacNode builderType, java.util.List<BuilderFieldData> builderFields, JCTree source) {
|
||||
@@ -741,16 +776,16 @@ public class HandleBuilder extends JavacAnnotationHandler<Builder> {
|
||||
for (JCVariableDecl gen : generated) recursiveSetGeneratedBy(gen, source, builderType.getContext());
|
||||
}
|
||||
|
||||
public void makeSetterMethodsForBuilder(JavacNode builderType, BuilderFieldData fieldNode, JavacNode source, boolean fluent, boolean chain, AccessLevel access) {
|
||||
public void makeSetterMethodsForBuilder(CheckerFrameworkVersion cfv, JavacNode builderType, BuilderFieldData fieldNode, JavacNode source, boolean fluent, boolean chain, AccessLevel access) {
|
||||
boolean deprecate = isFieldDeprecated(fieldNode.originalFieldNode);
|
||||
if (fieldNode.singularData == null || fieldNode.singularData.getSingularizer() == null) {
|
||||
makeSimpleSetterMethodForBuilder(builderType, deprecate, fieldNode.createdFields.get(0), fieldNode.name, fieldNode.nameOfSetFlag, source, fluent, chain, fieldNode.annotations, fieldNode.originalFieldNode, access);
|
||||
makeSimpleSetterMethodForBuilder(cfv, builderType, deprecate, fieldNode.createdFields.get(0), fieldNode.name, fieldNode.nameOfSetFlag, source, fluent, chain, fieldNode.annotations, fieldNode.originalFieldNode, access);
|
||||
} else {
|
||||
fieldNode.singularData.getSingularizer().generateMethods(fieldNode.singularData, deprecate, builderType, source.get(), fluent, chain, access);
|
||||
fieldNode.singularData.getSingularizer().generateMethods(cfv, fieldNode.singularData, deprecate, builderType, source.get(), fluent, chain, access);
|
||||
}
|
||||
}
|
||||
|
||||
private void makeSimpleSetterMethodForBuilder(JavacNode builderType, boolean deprecate, JavacNode fieldNode, Name paramName, Name nameOfSetFlag, JavacNode source, boolean fluent, boolean chain, List<JCAnnotation> annosOnParam, JavacNode originalFieldNode, AccessLevel access) {
|
||||
private void makeSimpleSetterMethodForBuilder(CheckerFrameworkVersion cfv, JavacNode builderType, boolean deprecate, JavacNode fieldNode, Name paramName, Name nameOfSetFlag, JavacNode source, boolean fluent, boolean chain, List<JCAnnotation> annosOnParam, JavacNode originalFieldNode, AccessLevel access) {
|
||||
Name fieldName = ((JCVariableDecl) fieldNode.get()).name;
|
||||
|
||||
for (JavacNode child : builderType.down()) {
|
||||
@@ -766,6 +801,12 @@ public class HandleBuilder extends JavacAnnotationHandler<Builder> {
|
||||
|
||||
List<JCAnnotation> methodAnns = JavacHandlerUtil.findCopyableToSetterAnnotations(originalFieldNode);
|
||||
JCMethodDecl newMethod = HandleSetter.createSetter(toJavacModifier(access), deprecate, fieldNode, maker, setterName, paramName, nameOfSetFlag, chain, source, methodAnns, annosOnParam);
|
||||
if (cfv.generateCalledMethods()) {
|
||||
JCAnnotation ncAnno = maker.Annotation(genTypeRef(source, CheckerFrameworkVersion.NAME__NOT_CALLED), List.<JCExpression>of(maker.Literal(newMethod.getName().toString())));
|
||||
JCClassDecl builderTypeNode = (JCClassDecl) builderType.get();
|
||||
JCVariableDecl recv = maker.VarDef(maker.Modifiers(0L, List.<JCAnnotation>of(ncAnno)), builderType.toName("this"), maker.Ident(builderTypeNode.name), null);
|
||||
newMethod.params = List.of(recv, newMethod.params.get(0));
|
||||
}
|
||||
recursiveSetGeneratedBy(newMethod, source.get(), builderType.getContext());
|
||||
copyJavadoc(originalFieldNode, newMethod, CopyJavadoc.SETTER);
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2010-2018 The Project Lombok Authors.
|
||||
* Copyright (C) 2010-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
|
||||
@@ -56,6 +56,7 @@ import lombok.RequiredArgsConstructor;
|
||||
import lombok.core.AST.Kind;
|
||||
import lombok.core.AnnotationValues;
|
||||
import lombok.core.LombokNode;
|
||||
import lombok.core.configuration.CheckerFrameworkVersion;
|
||||
import lombok.delombok.LombokOptionsFactory;
|
||||
import lombok.javac.Javac;
|
||||
import lombok.javac.JavacAST;
|
||||
@@ -222,7 +223,6 @@ public class HandleConstructor {
|
||||
boolean staticConstrRequired = staticName != null && !staticName.equals("");
|
||||
|
||||
if (skipIfConstructorExists != SkipIfConstructorExists.NO) {
|
||||
|
||||
for (JavacNode child : typeNode.down()) {
|
||||
if (child.getKind() == Kind.ANNOTATION) {
|
||||
boolean skipGeneration = annotationTypeMatches(NoArgsConstructor.class, child) ||
|
||||
@@ -247,7 +247,7 @@ public class HandleConstructor {
|
||||
}
|
||||
|
||||
if (noArgs && noArgsConstructorExists(typeNode)) return;
|
||||
|
||||
|
||||
ListBuffer<Type> argTypes = new ListBuffer<Type>();
|
||||
for (JavacNode fieldNode : fields) {
|
||||
Type mirror = getMirrorForFieldType(fieldNode);
|
||||
@@ -374,7 +374,7 @@ public class HandleConstructor {
|
||||
addConstructorProperties(mods, typeNode, fieldsToParam);
|
||||
}
|
||||
if (onConstructor != null) mods.annotations = mods.annotations.appendList(copyAnnotations(onConstructor));
|
||||
|
||||
if (getCheckerFrameworkVersion(source).generateUnique()) mods.annotations = mods.annotations.prepend(maker.Annotation(genTypeRef(source, CheckerFrameworkVersion.NAME__UNIQUE), List.<JCExpression>nil()));
|
||||
return recursiveSetGeneratedBy(maker.MethodDef(mods, typeNode.toName("<init>"),
|
||||
null, List.<JCTypeParameter>nil(), params.toList(), List.<JCExpression>nil(),
|
||||
maker.Block(0L, nullChecks.appendList(assigns).toList()), null), source.get(), typeNode.getContext());
|
||||
@@ -453,6 +453,7 @@ public class HandleConstructor {
|
||||
JCClassDecl type = (JCClassDecl) typeNode.get();
|
||||
|
||||
JCModifiers mods = maker.Modifiers(Flags.STATIC | toJavacModifier(level));
|
||||
if (getCheckerFrameworkVersion(typeNode).generateUnique()) mods.annotations = mods.annotations.prepend(maker.Annotation(genTypeRef(typeNode, CheckerFrameworkVersion.NAME__UNIQUE), List.<JCExpression>nil()));
|
||||
|
||||
JCExpression returnType, constructorType;
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2009-2018 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
|
||||
@@ -59,6 +59,7 @@ import lombok.EqualsAndHashCode;
|
||||
import lombok.core.AST.Kind;
|
||||
import lombok.core.AnnotationValues;
|
||||
import lombok.core.configuration.CallSuperType;
|
||||
import lombok.core.configuration.CheckerFrameworkVersion;
|
||||
import lombok.core.handlers.HandlerUtil;
|
||||
import lombok.core.handlers.HandlerUtil.FieldAccess;
|
||||
import lombok.core.handlers.InclusionExclusionUtils;
|
||||
@@ -203,7 +204,10 @@ public class HandleEqualsAndHashCode extends JavacAnnotationHandler<EqualsAndHas
|
||||
JavacTreeMaker maker = typeNode.getTreeMaker();
|
||||
|
||||
JCAnnotation overrideAnnotation = maker.Annotation(genJavaLangTypeRef(typeNode, "Override"), List.<JCExpression>nil());
|
||||
JCModifiers mods = maker.Modifiers(Flags.PUBLIC, List.of(overrideAnnotation));
|
||||
List<JCAnnotation> annsOnMethod = List.of(overrideAnnotation);
|
||||
CheckerFrameworkVersion checkerFramework = getCheckerFrameworkVersion(typeNode);
|
||||
if (checkerFramework.generateSideEffectFree()) annsOnMethod = annsOnMethod.prepend(maker.Annotation(genTypeRef(typeNode, CheckerFrameworkVersion.NAME__SIDE_EFFECT_FREE), List.<JCExpression>nil()));
|
||||
JCModifiers mods = maker.Modifiers(Flags.PUBLIC, annsOnMethod);
|
||||
JCExpression returnType = maker.TypeIdent(CTC_INT);
|
||||
ListBuffer<JCStatement> statements = new ListBuffer<JCStatement>();
|
||||
|
||||
@@ -378,7 +382,12 @@ public class HandleEqualsAndHashCode extends JavacAnnotationHandler<EqualsAndHas
|
||||
Name thisName = typeNode.toName("this");
|
||||
|
||||
JCAnnotation overrideAnnotation = maker.Annotation(genJavaLangTypeRef(typeNode, "Override"), List.<JCExpression>nil());
|
||||
JCModifiers mods = maker.Modifiers(Flags.PUBLIC, List.of(overrideAnnotation));
|
||||
List<JCAnnotation> annsOnMethod = List.of(overrideAnnotation);
|
||||
CheckerFrameworkVersion checkerFramework = getCheckerFrameworkVersion(typeNode);
|
||||
if (checkerFramework.generateSideEffectFree()) {
|
||||
annsOnMethod = annsOnMethod.prepend(maker.Annotation(genTypeRef(typeNode, CheckerFrameworkVersion.NAME__SIDE_EFFECT_FREE), List.<JCExpression>nil()));
|
||||
}
|
||||
JCModifiers mods = maker.Modifiers(Flags.PUBLIC, annsOnMethod);
|
||||
JCExpression objectType = genJavaLangTypeRef(typeNode, "Object");
|
||||
JCExpression returnType = maker.TypeIdent(CTC_BOOLEAN);
|
||||
|
||||
@@ -497,7 +506,12 @@ public class HandleEqualsAndHashCode extends JavacAnnotationHandler<EqualsAndHas
|
||||
*/
|
||||
JavacTreeMaker maker = typeNode.getTreeMaker();
|
||||
|
||||
JCModifiers mods = maker.Modifiers(Flags.PROTECTED, List.<JCAnnotation>nil());
|
||||
List<JCAnnotation> annsOnMethod = List.nil();
|
||||
CheckerFrameworkVersion checkerFramework = getCheckerFrameworkVersion(typeNode);
|
||||
if (checkerFramework.generateSideEffectFree()) {
|
||||
annsOnMethod = annsOnMethod.prepend(maker.Annotation(genTypeRef(typeNode, CheckerFrameworkVersion.NAME__SIDE_EFFECT_FREE), List.<JCExpression>nil()));
|
||||
}
|
||||
JCModifiers mods = maker.Modifiers(Flags.PROTECTED, annsOnMethod);
|
||||
JCExpression returnType = maker.TypeIdent(CTC_BOOLEAN);
|
||||
Name canEqualName = typeNode.toName("canEqual");
|
||||
JCExpression objectType = genJavaLangTypeRef(typeNode, "Object");
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2009-2017 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
|
||||
@@ -37,6 +37,7 @@ import lombok.experimental.Delegate;
|
||||
import lombok.Getter;
|
||||
import lombok.core.AST.Kind;
|
||||
import lombok.core.AnnotationValues;
|
||||
import lombok.core.configuration.CheckerFrameworkVersion;
|
||||
import lombok.javac.JavacAnnotationHandler;
|
||||
import lombok.javac.JavacNode;
|
||||
import lombok.javac.JavacTreeMaker;
|
||||
@@ -167,6 +168,7 @@ public class HandleGetter extends JavacAnnotationHandler<Getter> {
|
||||
|
||||
public void createGetterForField(AccessLevel level,
|
||||
JavacNode fieldNode, JavacNode source, boolean whineIfExists, boolean lazy, List<JCAnnotation> onMethod) {
|
||||
|
||||
if (fieldNode.getKind() != Kind.FIELD) {
|
||||
source.addError("@Getter is only supported on a class or a field.");
|
||||
return;
|
||||
@@ -246,9 +248,8 @@ public class HandleGetter extends JavacAnnotationHandler<Getter> {
|
||||
List<JCAnnotation> copyableAnnotations = findCopyableAnnotations(field);
|
||||
List<JCAnnotation> delegates = findDelegatesAndRemoveFromField(field);
|
||||
List<JCAnnotation> annsOnMethod = copyAnnotations(onMethod).appendList(copyableAnnotations);
|
||||
if (isFieldDeprecated(field)) {
|
||||
annsOnMethod = annsOnMethod.prepend(treeMaker.Annotation(genJavaLangTypeRef(field, "Deprecated"), List.<JCExpression>nil()));
|
||||
}
|
||||
if (getCheckerFrameworkVersion(field).generateSideEffectFree()) annsOnMethod = annsOnMethod.prepend(treeMaker.Annotation(genTypeRef(field, CheckerFrameworkVersion.NAME__SIDE_EFFECT_FREE), List.<JCExpression>nil()));
|
||||
if (isFieldDeprecated(field)) annsOnMethod = annsOnMethod.prepend(treeMaker.Annotation(genJavaLangTypeRef(field, "Deprecated"), List.<JCExpression>nil()));
|
||||
|
||||
JCMethodDecl decl = recursiveSetGeneratedBy(treeMaker.MethodDef(treeMaker.Modifiers(access, annsOnMethod), methodName, methodType,
|
||||
methodGenericParams, parameters, throwsClauses, methodBody, annotationMethodDefaultValue), source, field.getContext());
|
||||
|
||||
@@ -32,6 +32,7 @@ import lombok.ConfigurationKeys;
|
||||
import lombok.Setter;
|
||||
import lombok.core.AST.Kind;
|
||||
import lombok.core.AnnotationValues;
|
||||
import lombok.core.configuration.CheckerFrameworkVersion;
|
||||
import lombok.javac.Javac;
|
||||
import lombok.javac.JavacAnnotationHandler;
|
||||
import lombok.javac.JavacNode;
|
||||
@@ -214,7 +215,15 @@ public class HandleSetter extends JavacAnnotationHandler<Setter> {
|
||||
returnStatement = treeMaker.Return(treeMaker.Ident(field.toName("this")));
|
||||
}
|
||||
|
||||
return createSetter(access, deprecate, field, treeMaker, setterName, paramName, booleanFieldToSet, returnType, returnStatement, source, onMethod, onParam);
|
||||
JCMethodDecl d = createSetter(access, deprecate, field, treeMaker, setterName, paramName, booleanFieldToSet, returnType, returnStatement, source, onMethod, onParam);
|
||||
if (shouldReturnThis && getCheckerFrameworkVersion(source).generateReturnsReceiver()) {
|
||||
List<JCAnnotation> annotations = d.mods.annotations;
|
||||
if (annotations == null) annotations = List.nil();
|
||||
JCAnnotation anno = treeMaker.Annotation(genTypeRef(source, CheckerFrameworkVersion.NAME__RETURNS_RECEIVER), List.<JCExpression>nil());
|
||||
recursiveSetGeneratedBy(anno, source.get(), field.getContext());
|
||||
d.mods.annotations = annotations.prepend(anno);
|
||||
}
|
||||
return d;
|
||||
}
|
||||
|
||||
public static JCMethodDecl createSetter(long access, boolean deprecate, JavacNode field, JavacTreeMaker treeMaker, String setterName, Name paramName, Name booleanFieldToSet, JCExpression methodType, JCStatement returnStatement, JavacNode source, List<JCAnnotation> onMethod, List<JCAnnotation> onParam) {
|
||||
|
||||
@@ -62,6 +62,7 @@ import lombok.ConfigurationKeys;
|
||||
import lombok.Singular;
|
||||
import lombok.ToString;
|
||||
import lombok.core.AST.Kind;
|
||||
import lombok.core.configuration.CheckerFrameworkVersion;
|
||||
import lombok.core.AnnotationValues;
|
||||
import lombok.core.HandlerPriority;
|
||||
import lombok.core.handlers.HandlerUtil;
|
||||
@@ -93,7 +94,7 @@ public class HandleSuperBuilder extends JavacAnnotationHandler<SuperBuilder> {
|
||||
@Override
|
||||
public void handle(AnnotationValues<SuperBuilder> annotation, JCAnnotation ast, JavacNode annotationNode) {
|
||||
handleExperimentalFlagUsage(annotationNode, ConfigurationKeys.SUPERBUILDER_FLAG_USAGE, "@SuperBuilder");
|
||||
|
||||
CheckerFrameworkVersion cfv = getCheckerFrameworkVersion(annotationNode);
|
||||
SuperBuilder superbuilderAnnotation = annotation.getInstance();
|
||||
deleteAnnotationIfNeccessary(annotationNode, SuperBuilder.class);
|
||||
|
||||
@@ -284,16 +285,16 @@ public class HandleSuperBuilder extends JavacAnnotationHandler<SuperBuilder> {
|
||||
}
|
||||
|
||||
// Generate abstract self() and build() methods in the abstract builder.
|
||||
JCMethodDecl asm = generateAbstractSelfMethod(tdParent, superclassBuilderClassExpression != null, builderGenericName);
|
||||
JCMethodDecl asm = generateAbstractSelfMethod(cfv, tdParent, superclassBuilderClassExpression != null, builderGenericName);
|
||||
recursiveSetGeneratedBy(asm, ast, annotationNode.getContext());
|
||||
injectMethod(builderType, asm);
|
||||
JCMethodDecl abm = generateAbstractBuildMethod(tdParent, buildMethodName, superclassBuilderClassExpression != null, classGenericName);
|
||||
JCMethodDecl abm = generateAbstractBuildMethod(cfv, tdParent, buildMethodName, builderFields, superclassBuilderClassExpression != null, classGenericName);
|
||||
recursiveSetGeneratedBy(abm, ast, annotationNode.getContext());
|
||||
injectMethod(builderType, abm);
|
||||
|
||||
// Create the setter methods in the abstract builder.
|
||||
for (BuilderFieldData bfd : builderFields) {
|
||||
generateSetterMethodsForBuilder(builderType, bfd, annotationNode, builderGenericName);
|
||||
generateSetterMethodsForBuilder(cfv, builderType, bfd, annotationNode, builderGenericName);
|
||||
}
|
||||
|
||||
// Create the toString() method for the abstract builder.
|
||||
@@ -339,18 +340,18 @@ public class HandleSuperBuilder extends JavacAnnotationHandler<SuperBuilder> {
|
||||
if (cd != null) injectMethod(builderImplType, cd);
|
||||
|
||||
// Create the self() and build() methods in the BuilderImpl.
|
||||
JCMethodDecl selfMethod = generateSelfMethod(builderImplType, typeParams);
|
||||
JCMethodDecl selfMethod = generateSelfMethod(cfv, builderImplType, typeParams);
|
||||
recursiveSetGeneratedBy(selfMethod, ast, annotationNode.getContext());
|
||||
injectMethod(builderImplType, selfMethod);
|
||||
if (methodExists(buildMethodName, builderImplType, -1) == MemberExistsResult.NOT_EXISTS) {
|
||||
JCMethodDecl buildMethod = generateBuildMethod(buildMethodName, tdParent, builderImplType, thrownExceptions);
|
||||
JCMethodDecl buildMethod = generateBuildMethod(cfv, buildMethodName, tdParent, builderImplType, builderFields, thrownExceptions);
|
||||
recursiveSetGeneratedBy(buildMethod, ast, annotationNode.getContext());
|
||||
injectMethod(builderImplType, buildMethod);
|
||||
}
|
||||
}
|
||||
|
||||
// Generate a constructor in the annotated class that takes a builder as argument.
|
||||
generateBuilderBasedConstructor(tdParent, typeParams, builderFields, annotationNode, builderClassName,
|
||||
generateBuilderBasedConstructor(cfv, tdParent, typeParams, builderFields, annotationNode, builderClassName,
|
||||
superclassBuilderClassExpression != null);
|
||||
|
||||
if (isAbstract) {
|
||||
@@ -362,7 +363,7 @@ public class HandleSuperBuilder extends JavacAnnotationHandler<SuperBuilder> {
|
||||
// Allow users to specify their own builder() methods, e.g., to provide default values.
|
||||
if (generateBuilderMethod && methodExists(builderMethodName, tdParent, -1) != MemberExistsResult.NOT_EXISTS) generateBuilderMethod = false;
|
||||
if (generateBuilderMethod) {
|
||||
JCMethodDecl builderMethod = generateBuilderMethod(builderMethodName, builderClassName, builderImplClassName, annotationNode, tdParent, typeParams);
|
||||
JCMethodDecl builderMethod = generateBuilderMethod(cfv, builderMethodName, builderClassName, builderImplClassName, annotationNode, tdParent, typeParams);
|
||||
recursiveSetGeneratedBy(builderMethod, ast, annotationNode.getContext());
|
||||
if (builderMethod != null) injectMethod(tdParent, builderMethod);
|
||||
}
|
||||
@@ -374,7 +375,7 @@ public class HandleSuperBuilder extends JavacAnnotationHandler<SuperBuilder> {
|
||||
annotationNode.addWarning("Not generating toBuilder() as it already exists.");
|
||||
return;
|
||||
case NOT_EXISTS:
|
||||
JCMethodDecl md = generateToBuilderMethod(builderClassName, builderImplClassName, annotationNode, tdParent, typeParams);
|
||||
JCMethodDecl md = generateToBuilderMethod(cfv, builderClassName, builderImplClassName, annotationNode, tdParent, typeParams);
|
||||
if (md != null) {
|
||||
recursiveSetGeneratedBy(md, ast, annotationNode.getContext());
|
||||
injectMethod(tdParent, md);
|
||||
@@ -483,7 +484,7 @@ public class HandleSuperBuilder extends JavacAnnotationHandler<SuperBuilder> {
|
||||
* constructor with the builder as argument. Requires
|
||||
* {@code builderClassAsParameter != null}.
|
||||
*/
|
||||
private void generateBuilderBasedConstructor(JavacNode typeNode, List<JCTypeParameter> typeParams, java.util.List<BuilderFieldData> builderFields, JavacNode source, String builderClassName, boolean callBuilderBasedSuperConstructor) {
|
||||
private void generateBuilderBasedConstructor(CheckerFrameworkVersion cfv, JavacNode typeNode, List<JCTypeParameter> typeParams, java.util.List<BuilderFieldData> builderFields, JavacNode source, String builderClassName, boolean callBuilderBasedSuperConstructor) {
|
||||
JavacTreeMaker maker = typeNode.getTreeMaker();
|
||||
|
||||
AccessLevel level = AccessLevel.PROTECTED;
|
||||
@@ -519,7 +520,8 @@ public class HandleSuperBuilder extends JavacAnnotationHandler<SuperBuilder> {
|
||||
}
|
||||
}
|
||||
|
||||
JCModifiers mods = maker.Modifiers(toJavacModifier(level), List.<JCAnnotation>nil());
|
||||
List<JCAnnotation> annsOnMethod = cfv.generateUnique() ? List.of(maker.Annotation(genTypeRef(typeNode, CheckerFrameworkVersion.NAME__SIDE_EFFECT_FREE), List.<JCExpression>nil())) : List.<JCAnnotation>nil();
|
||||
JCModifiers mods = maker.Modifiers(toJavacModifier(level), annsOnMethod);
|
||||
|
||||
// Create a constructor that has just the builder as parameter.
|
||||
ListBuffer<JCVariableDecl> params = new ListBuffer<JCVariableDecl>();
|
||||
@@ -551,7 +553,7 @@ public class HandleSuperBuilder extends JavacAnnotationHandler<SuperBuilder> {
|
||||
injectMethod(typeNode, constr, null, Javac.createVoidType(typeNode.getSymbolTable(), CTC_VOID));
|
||||
}
|
||||
|
||||
private JCMethodDecl generateBuilderMethod(String builderMethodName, String builderClassName, String builderImplClassName, JavacNode source, JavacNode type, List<JCTypeParameter> typeParams) {
|
||||
private JCMethodDecl generateBuilderMethod(CheckerFrameworkVersion cfv, String builderMethodName, String builderClassName, String builderImplClassName, JavacNode source, JavacNode type, List<JCTypeParameter> typeParams) {
|
||||
JavacTreeMaker maker = type.getTreeMaker();
|
||||
|
||||
ListBuffer<JCExpression> typeArgs = new ListBuffer<JCExpression>();
|
||||
@@ -573,7 +575,8 @@ public class HandleSuperBuilder extends JavacAnnotationHandler<SuperBuilder> {
|
||||
typeParameterNames.add(wildcard);
|
||||
JCTypeApply returnType = maker.TypeApply(maker.Ident(type.toName(builderClassName)), typeParameterNames.toList());
|
||||
|
||||
return maker.MethodDef(maker.Modifiers(modifiers), type.toName(builderMethodName), returnType, copyTypeParams(source, typeParams), List.<JCVariableDecl>nil(), List.<JCExpression>nil(), body, null);
|
||||
List<JCAnnotation> annsOnMethod = cfv.generateUnique() ? List.of(maker.Annotation(genTypeRef(type, CheckerFrameworkVersion.NAME__SIDE_EFFECT_FREE), List.<JCExpression>nil())) : List.<JCAnnotation>nil();
|
||||
return maker.MethodDef(maker.Modifiers(modifiers, annsOnMethod), type.toName(builderMethodName), returnType, copyTypeParams(source, typeParams), List.<JCVariableDecl>nil(), List.<JCExpression>nil(), body, null);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -584,7 +587,7 @@ public class HandleSuperBuilder extends JavacAnnotationHandler<SuperBuilder> {
|
||||
* }
|
||||
* </pre>
|
||||
*/
|
||||
private JCMethodDecl generateToBuilderMethod(String builderClassName, String builderImplClassName, JavacNode source, JavacNode type, List<JCTypeParameter> typeParams) {
|
||||
private JCMethodDecl generateToBuilderMethod(CheckerFrameworkVersion cfv, String builderClassName, String builderImplClassName, JavacNode source, JavacNode type, List<JCTypeParameter> typeParams) {
|
||||
JavacTreeMaker maker = type.getTreeMaker();
|
||||
|
||||
ListBuffer<JCExpression> typeArgs = new ListBuffer<JCExpression>();
|
||||
@@ -607,7 +610,8 @@ public class HandleSuperBuilder extends JavacAnnotationHandler<SuperBuilder> {
|
||||
typeParameterNames.add(wildcard);
|
||||
JCTypeApply returnType = maker.TypeApply(maker.Ident(type.toName(builderClassName)), typeParameterNames.toList());
|
||||
|
||||
return maker.MethodDef(maker.Modifiers(modifiers), type.toName(TO_BUILDER_METHOD_NAME), returnType, List.<JCTypeParameter>nil(), List.<JCVariableDecl>nil(), List.<JCExpression>nil(), body, null);
|
||||
List<JCAnnotation> annsOnMethod = cfv.generateUnique() ? List.of(maker.Annotation(genTypeRef(type, CheckerFrameworkVersion.NAME__SIDE_EFFECT_FREE), List.<JCExpression>nil())) : List.<JCAnnotation>nil();
|
||||
return maker.MethodDef(maker.Modifiers(modifiers, annsOnMethod), type.toName(TO_BUILDER_METHOD_NAME), returnType, List.<JCTypeParameter>nil(), List.<JCVariableDecl>nil(), List.<JCExpression>nil(), body, null);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -737,25 +741,34 @@ public class HandleSuperBuilder extends JavacAnnotationHandler<SuperBuilder> {
|
||||
return exec;
|
||||
}
|
||||
|
||||
private JCMethodDecl generateAbstractSelfMethod(JavacNode type, boolean override, String builderGenericName) {
|
||||
private JCMethodDecl generateAbstractSelfMethod(CheckerFrameworkVersion cfv, JavacNode type, boolean override, String builderGenericName) {
|
||||
JavacTreeMaker maker = type.getTreeMaker();
|
||||
List<JCAnnotation> annotations = List.nil();
|
||||
if (override) {
|
||||
JCAnnotation overrideAnnotation = maker.Annotation(genJavaLangTypeRef(type, "Override"), List.<JCExpression>nil());
|
||||
annotations = List.of(overrideAnnotation);
|
||||
}
|
||||
JCAnnotation overrideAnnotation = override ? maker.Annotation(genJavaLangTypeRef(type, "Override"), List.<JCExpression>nil()) : null;
|
||||
JCAnnotation rrAnnotation = cfv.generateReturnsReceiver() ? maker.Annotation(genTypeRef(type, CheckerFrameworkVersion.NAME__RETURNS_RECEIVER), List.<JCExpression>nil()) : null;
|
||||
JCAnnotation sefAnnotation = cfv.generateSideEffectFree() ? maker.Annotation(genTypeRef(type, CheckerFrameworkVersion.NAME__SIDE_EFFECT_FREE), List.<JCExpression>nil()) : null;
|
||||
if (sefAnnotation != null) annotations = annotations.prepend(sefAnnotation);
|
||||
if (rrAnnotation != null) annotations = annotations.prepend(rrAnnotation);
|
||||
if (overrideAnnotation != null) annotations = annotations.prepend(overrideAnnotation);
|
||||
JCModifiers modifiers = maker.Modifiers(Flags.PROTECTED | Flags.ABSTRACT, annotations);
|
||||
Name name = type.toName(SELF_METHOD);
|
||||
JCExpression returnType = maker.Ident(type.toName(builderGenericName));
|
||||
|
||||
|
||||
return maker.MethodDef(modifiers, name, returnType, List.<JCTypeParameter>nil(), List.<JCVariableDecl>nil(), List.<JCExpression>nil(), null, null);
|
||||
}
|
||||
|
||||
private JCMethodDecl generateSelfMethod(JavacNode builderImplType, List<JCTypeParameter> typeParams) {
|
||||
private JCMethodDecl generateSelfMethod(CheckerFrameworkVersion cfv, JavacNode builderImplType, List<JCTypeParameter> typeParams) {
|
||||
JavacTreeMaker maker = builderImplType.getTreeMaker();
|
||||
|
||||
JCAnnotation overrideAnnotation = maker.Annotation(genJavaLangTypeRef(builderImplType, "Override"), List.<JCExpression>nil());
|
||||
JCModifiers modifiers = maker.Modifiers(Flags.PROTECTED, List.of(overrideAnnotation));
|
||||
JCAnnotation rrAnnotation = cfv.generateReturnsReceiver() ? maker.Annotation(genTypeRef(builderImplType, CheckerFrameworkVersion.NAME__RETURNS_RECEIVER), List.<JCExpression>nil()) : null;
|
||||
JCAnnotation sefAnnotation = cfv.generateSideEffectFree() ? maker.Annotation(genTypeRef(builderImplType, CheckerFrameworkVersion.NAME__SIDE_EFFECT_FREE), List.<JCExpression>nil()) : null;
|
||||
List<JCAnnotation> annsOnMethod = List.nil();
|
||||
if (sefAnnotation != null) annsOnMethod = annsOnMethod.prepend(sefAnnotation);
|
||||
if (rrAnnotation != null) annsOnMethod = annsOnMethod.prepend(rrAnnotation);
|
||||
annsOnMethod = annsOnMethod.prepend(overrideAnnotation);
|
||||
|
||||
JCModifiers modifiers = maker.Modifiers(Flags.PROTECTED, annsOnMethod);
|
||||
Name name = builderImplType.toName(SELF_METHOD);
|
||||
|
||||
JCExpression returnType = namePlusTypeParamsToTypeReference(maker, builderImplType.toName(builderImplType.getName()), typeParams);
|
||||
@@ -765,21 +778,23 @@ public class HandleSuperBuilder extends JavacAnnotationHandler<SuperBuilder> {
|
||||
return maker.MethodDef(modifiers, name, returnType, List.<JCTypeParameter>nil(), List.<JCVariableDecl>nil(), List.<JCExpression>nil(), body, null);
|
||||
}
|
||||
|
||||
private JCMethodDecl generateAbstractBuildMethod(JavacNode type, String methodName, boolean override, String classGenericName) {
|
||||
private JCMethodDecl generateAbstractBuildMethod(CheckerFrameworkVersion cfv, JavacNode type, String methodName, java.util.List<BuilderFieldData> builderFields, boolean override, String classGenericName) {
|
||||
JavacTreeMaker maker = type.getTreeMaker();
|
||||
List<JCAnnotation> annotations = List.nil();
|
||||
if (override) {
|
||||
JCAnnotation overrideAnnotation = maker.Annotation(genJavaLangTypeRef(type, "Override"), List.<JCExpression>nil());
|
||||
annotations = List.of(overrideAnnotation);
|
||||
}
|
||||
if (cfv.generateSideEffectFree()) annotations = annotations.prepend(maker.Annotation(genTypeRef(type, CheckerFrameworkVersion.NAME__SIDE_EFFECT_FREE), List.<JCExpression>nil()));
|
||||
JCModifiers modifiers = maker.Modifiers(Flags.PUBLIC | Flags.ABSTRACT, annotations);
|
||||
Name name = type.toName(methodName);
|
||||
JCExpression returnType = maker.Ident(type.toName(classGenericName));
|
||||
|
||||
return maker.MethodDef(modifiers, name, returnType, List.<JCTypeParameter>nil(), List.<JCVariableDecl>nil(), List.<JCExpression>nil(), null, null);
|
||||
List<JCVariableDecl> params = HandleBuilder.generateBuildArgs(cfv, type, builderFields);
|
||||
return maker.MethodDef(modifiers, name, returnType, List.<JCTypeParameter>nil(), params, List.<JCExpression>nil(), null, null);
|
||||
}
|
||||
|
||||
private JCMethodDecl generateBuildMethod(String buildName, JavacNode returnType, JavacNode type, List<JCExpression> thrownExceptions) {
|
||||
private JCMethodDecl generateBuildMethod(CheckerFrameworkVersion cfv, String buildName, JavacNode returnType, JavacNode type, java.util.List<BuilderFieldData> builderFields, List<JCExpression> thrownExceptions) {
|
||||
JavacTreeMaker maker = type.getTreeMaker();
|
||||
|
||||
JCExpression call;
|
||||
@@ -793,9 +808,12 @@ public class HandleSuperBuilder extends JavacAnnotationHandler<SuperBuilder> {
|
||||
JCBlock body = maker.Block(0, statements.toList());
|
||||
|
||||
JCAnnotation overrideAnnotation = maker.Annotation(genJavaLangTypeRef(type, "Override"), List.<JCExpression>nil());
|
||||
JCModifiers modifiers = maker.Modifiers(Flags.PUBLIC, List.of(overrideAnnotation));
|
||||
List<JCAnnotation> annsOnMethod = List.of(overrideAnnotation);
|
||||
if (cfv.generateSideEffectFree()) annsOnMethod = annsOnMethod.prepend(maker.Annotation(genTypeRef(type, CheckerFrameworkVersion.NAME__SIDE_EFFECT_FREE), List.<JCExpression>nil()));
|
||||
JCModifiers modifiers = maker.Modifiers(Flags.PUBLIC, annsOnMethod);
|
||||
|
||||
return maker.MethodDef(modifiers, type.toName(buildName), cloneSelfType(returnType), List.<JCTypeParameter>nil(), List.<JCVariableDecl>nil(), thrownExceptions, body, null);
|
||||
List<JCVariableDecl> params = HandleBuilder.generateBuildArgs(cfv, type, builderFields);
|
||||
return maker.MethodDef(modifiers, type.toName(buildName), cloneSelfType(returnType), List.<JCTypeParameter>nil(), params, thrownExceptions, body, null);
|
||||
}
|
||||
|
||||
private JCMethodDecl generateCleanMethod(java.util.List<BuilderFieldData> builderFields, JavacNode type, JCTree source) {
|
||||
@@ -852,7 +870,7 @@ public class HandleSuperBuilder extends JavacAnnotationHandler<SuperBuilder> {
|
||||
for (JCVariableDecl gen : generated) recursiveSetGeneratedBy(gen, source, builderType.getContext());
|
||||
}
|
||||
|
||||
private void generateSetterMethodsForBuilder(final JavacNode builderType, BuilderFieldData fieldNode, JavacNode source, final String builderGenericName) {
|
||||
private void generateSetterMethodsForBuilder(CheckerFrameworkVersion cfv, final JavacNode builderType, BuilderFieldData fieldNode, JavacNode source, final String builderGenericName) {
|
||||
boolean deprecate = isFieldDeprecated(fieldNode.originalFieldNode);
|
||||
final JavacTreeMaker maker = builderType.getTreeMaker();
|
||||
ExpressionMaker returnTypeMaker = new ExpressionMaker() { @Override public JCExpression make() {
|
||||
@@ -864,13 +882,13 @@ public class HandleSuperBuilder extends JavacAnnotationHandler<SuperBuilder> {
|
||||
}};
|
||||
|
||||
if (fieldNode.singularData == null || fieldNode.singularData.getSingularizer() == null) {
|
||||
generateSimpleSetterMethodForBuilder(builderType, deprecate, fieldNode.createdFields.get(0), fieldNode.name, fieldNode.nameOfSetFlag, source, true, returnTypeMaker.make(), returnStatementMaker.make(), fieldNode.annotations, fieldNode.originalFieldNode);
|
||||
generateSimpleSetterMethodForBuilder(cfv, builderType, deprecate, fieldNode.createdFields.get(0), fieldNode.name, fieldNode.nameOfSetFlag, source, true, returnTypeMaker.make(), returnStatementMaker.make(), fieldNode.annotations, fieldNode.originalFieldNode);
|
||||
} else {
|
||||
fieldNode.singularData.getSingularizer().generateMethods(fieldNode.singularData, deprecate, builderType, source.get(), true, returnTypeMaker, returnStatementMaker, AccessLevel.PUBLIC);
|
||||
fieldNode.singularData.getSingularizer().generateMethods(cfv, fieldNode.singularData, deprecate, builderType, source.get(), true, returnTypeMaker, returnStatementMaker, AccessLevel.PUBLIC);
|
||||
}
|
||||
}
|
||||
|
||||
private void generateSimpleSetterMethodForBuilder(JavacNode builderType, boolean deprecate, JavacNode fieldNode, Name paramName, Name nameOfSetFlag, JavacNode source, boolean fluent, JCExpression returnType, JCStatement returnStatement, List<JCAnnotation> annosOnParam, JavacNode originalFieldNode) {
|
||||
private void generateSimpleSetterMethodForBuilder(CheckerFrameworkVersion cfv, JavacNode builderType, boolean deprecate, JavacNode fieldNode, Name paramName, Name nameOfSetFlag, JavacNode source, boolean fluent, JCExpression returnType, JCStatement returnStatement, List<JCAnnotation> annosOnParam, JavacNode originalFieldNode) {
|
||||
Name fieldName = ((JCVariableDecl) fieldNode.get()).name;
|
||||
|
||||
for (JavacNode child : builderType.down()) {
|
||||
@@ -886,6 +904,19 @@ public class HandleSuperBuilder extends JavacAnnotationHandler<SuperBuilder> {
|
||||
|
||||
List<JCAnnotation> methodAnns = JavacHandlerUtil.findCopyableToSetterAnnotations(originalFieldNode);
|
||||
JCMethodDecl newMethod = HandleSetter.createSetter(Flags.PUBLIC, deprecate, fieldNode, maker, setterName, paramName, nameOfSetFlag, returnType, returnStatement, source, methodAnns, annosOnParam);
|
||||
if (cfv.generateCalledMethods()) {
|
||||
JCAnnotation ncAnno = maker.Annotation(genTypeRef(source, CheckerFrameworkVersion.NAME__NOT_CALLED), List.<JCExpression>of(maker.Literal(newMethod.getName().toString())));
|
||||
JCClassDecl builderTypeNode = (JCClassDecl) builderType.get();
|
||||
JCVariableDecl recv = maker.VarDef(maker.Modifiers(0L, List.<JCAnnotation>of(ncAnno)), builderType.toName("this"), maker.Ident(builderTypeNode.name), null);
|
||||
newMethod.params = List.of(recv, newMethod.params.get(0));
|
||||
}
|
||||
if (cfv.generateReturnsReceiver()) {
|
||||
List<JCAnnotation> annotations = newMethod.mods.annotations;
|
||||
if (annotations == null) annotations = List.nil();
|
||||
JCAnnotation anno = maker.Annotation(genTypeRef(source, CheckerFrameworkVersion.NAME__RETURNS_RECEIVER), List.<JCExpression>nil());
|
||||
recursiveSetGeneratedBy(anno, source.get(), builderType.getContext());
|
||||
newMethod.mods.annotations = annotations.prepend(anno);
|
||||
}
|
||||
|
||||
injectMethod(builderType, newMethod);
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2009-2018 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
|
||||
@@ -31,6 +31,7 @@ import lombok.ConfigurationKeys;
|
||||
import lombok.ToString;
|
||||
import lombok.core.AnnotationValues;
|
||||
import lombok.core.configuration.CallSuperType;
|
||||
import lombok.core.configuration.CheckerFrameworkVersion;
|
||||
import lombok.core.AST.Kind;
|
||||
import lombok.core.handlers.InclusionExclusionUtils;
|
||||
import lombok.core.handlers.InclusionExclusionUtils.Included;
|
||||
@@ -93,7 +94,7 @@ public class HandleToString extends JavacAnnotationHandler<ToString> {
|
||||
boolean includeFieldNames = true;
|
||||
try {
|
||||
Boolean configuration = typeNode.getAst().readConfiguration(ConfigurationKeys.TO_STRING_INCLUDE_FIELD_NAMES);
|
||||
includeFieldNames = configuration != null ? configuration : ((Boolean)ToString.class.getMethod("includeFieldNames").getDefaultValue()).booleanValue();
|
||||
includeFieldNames = configuration != null ? configuration : ((Boolean) ToString.class.getMethod("includeFieldNames").getDefaultValue()).booleanValue();
|
||||
} catch (Exception ignore) {}
|
||||
|
||||
Boolean doNotUseGettersConfiguration = typeNode.getAst().readConfiguration(ConfigurationKeys.TO_STRING_DO_NOT_USE_GETTERS);
|
||||
@@ -160,7 +161,9 @@ public class HandleToString extends JavacAnnotationHandler<ToString> {
|
||||
JavacTreeMaker maker = typeNode.getTreeMaker();
|
||||
|
||||
JCAnnotation overrideAnnotation = maker.Annotation(genJavaLangTypeRef(typeNode, "Override"), List.<JCExpression>nil());
|
||||
JCModifiers mods = maker.Modifiers(Flags.PUBLIC, List.of(overrideAnnotation));
|
||||
List<JCAnnotation> annsOnMethod = List.of(overrideAnnotation);
|
||||
if (getCheckerFrameworkVersion(typeNode).generateSideEffectFree()) annsOnMethod = annsOnMethod.prepend(maker.Annotation(genTypeRef(typeNode, CheckerFrameworkVersion.NAME__SIDE_EFFECT_FREE), List.<JCExpression>nil()));
|
||||
JCModifiers mods = maker.Modifiers(Flags.PUBLIC, annsOnMethod);
|
||||
JCExpression returnType = genJavaLangTypeRef(typeNode, "String");
|
||||
|
||||
boolean first = true;
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2012-2014 The Project Lombok Authors.
|
||||
* Copyright (C) 2012-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
|
||||
@@ -31,6 +31,7 @@ import lombok.AccessLevel;
|
||||
import lombok.ConfigurationKeys;
|
||||
import lombok.core.AST.Kind;
|
||||
import lombok.core.AnnotationValues;
|
||||
import lombok.core.configuration.CheckerFrameworkVersion;
|
||||
import lombok.experimental.Wither;
|
||||
import lombok.javac.JavacAnnotationHandler;
|
||||
import lombok.javac.JavacNode;
|
||||
@@ -279,10 +280,11 @@ public class HandleWither extends JavacAnnotationHandler<Wither> {
|
||||
JCExpression annotationMethodDefaultValue = null;
|
||||
|
||||
List<JCAnnotation> annsOnMethod = copyAnnotations(onMethod);
|
||||
CheckerFrameworkVersion checkerFramework = getCheckerFrameworkVersion(source);
|
||||
if (checkerFramework.generateSideEffectFree()) annsOnMethod = annsOnMethod.prepend(maker.Annotation(genTypeRef(source, CheckerFrameworkVersion.NAME__SIDE_EFFECT_FREE), List.<JCExpression>nil()));
|
||||
|
||||
if (isFieldDeprecated(field)) annsOnMethod = annsOnMethod.prepend(maker.Annotation(genJavaLangTypeRef(field, "Deprecated"), List.<JCExpression>nil()));
|
||||
|
||||
if (isFieldDeprecated(field)) {
|
||||
annsOnMethod = annsOnMethod.prepend(maker.Annotation(genJavaLangTypeRef(field, "Deprecated"), List.<JCExpression>nil()));
|
||||
}
|
||||
if (makeAbstract) access = access | Flags.ABSTRACT;
|
||||
JCMethodDecl decl = recursiveSetGeneratedBy(maker.MethodDef(maker.Modifiers(access, annsOnMethod), methodName, returnType,
|
||||
methodGenericParams, parameters, throwsClauses, methodBody, annotationMethodDefaultValue), source.get(), field.getContext());
|
||||
|
||||
@@ -93,6 +93,7 @@ import lombok.core.AnnotationValues.AnnotationValue;
|
||||
import lombok.core.CleanupTask;
|
||||
import lombok.core.LombokImmutableList;
|
||||
import lombok.core.TypeResolver;
|
||||
import lombok.core.configuration.CheckerFrameworkVersion;
|
||||
import lombok.core.configuration.NullCheckExceptionType;
|
||||
import lombok.core.configuration.TypeName;
|
||||
import lombok.core.handlers.HandlerUtil;
|
||||
@@ -330,6 +331,11 @@ public class JavacHandlerUtil {
|
||||
return false;
|
||||
}
|
||||
|
||||
public static CheckerFrameworkVersion getCheckerFrameworkVersion(JavacNode node) {
|
||||
CheckerFrameworkVersion cfv = node.getAst().readConfiguration(ConfigurationKeys.CHECKER_FRAMEWORK);
|
||||
return cfv == null ? CheckerFrameworkVersion.NONE : cfv;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns if a node is marked deprecated (as picked up on by the parser).
|
||||
* @param node the node to check (type, method, or field decl).
|
||||
@@ -1266,7 +1272,7 @@ public class JavacHandlerUtil {
|
||||
}
|
||||
}
|
||||
|
||||
private static void addAnnotation(JCModifiers mods, JavacNode node, int pos, JCTree source, Context context, String annotationTypeFqn, JCExpression arg) {
|
||||
public static void addAnnotation(JCModifiers mods, JavacNode node, int pos, JCTree source, Context context, String annotationTypeFqn, JCExpression arg) {
|
||||
boolean isJavaLangBased;
|
||||
String simpleName; {
|
||||
int idx = annotationTypeFqn.lastIndexOf('.');
|
||||
|
||||
@@ -37,6 +37,7 @@ import lombok.ConfigurationKeys;
|
||||
import lombok.core.LombokImmutableList;
|
||||
import lombok.core.SpiLoadUtil;
|
||||
import lombok.core.TypeLibrary;
|
||||
import lombok.core.configuration.CheckerFrameworkVersion;
|
||||
import lombok.core.handlers.HandlerUtil;
|
||||
import lombok.javac.JavacNode;
|
||||
import lombok.javac.JavacTreeMaker;
|
||||
@@ -163,9 +164,12 @@ public class JavacSingularsRecipes {
|
||||
return this;
|
||||
}
|
||||
|
||||
protected JCModifiers makeMods(JavacTreeMaker maker, JavacNode node, boolean deprecate, AccessLevel access) {
|
||||
if (deprecate) return maker.Modifiers(toJavacModifier(access), List.<JCAnnotation>of(maker.Annotation(genJavaLangTypeRef(node, "Deprecated"), List.<JCExpression>nil())));
|
||||
return maker.Modifiers(toJavacModifier(access));
|
||||
protected JCModifiers makeMods(JavacTreeMaker maker, CheckerFrameworkVersion cfv, JavacNode node, boolean deprecate, AccessLevel access) {
|
||||
JCAnnotation deprecateAnn = deprecate ? maker.Annotation(genJavaLangTypeRef(node, "Deprecated"), List.<JCExpression>nil()) : null;
|
||||
JCAnnotation rrAnn = cfv.generateReturnsReceiver() ? maker.Annotation(genTypeRef(node, CheckerFrameworkVersion.NAME__RETURNS_RECEIVER), List.<JCExpression>nil()) : null;
|
||||
|
||||
List<JCAnnotation> annsOnMethod = (deprecateAnn != null && rrAnn != null) ? List.of(deprecateAnn, rrAnn) : deprecateAnn != null ? List.of(deprecateAnn) : rrAnn != null ? List.of(rrAnn) : List.<JCAnnotation>nil();
|
||||
return maker.Modifiers(toJavacModifier(access), annsOnMethod);
|
||||
}
|
||||
|
||||
/** Checks if any of the to-be-generated nodes (fields, methods) already exist. If so, errors on these (singulars don't support manually writing some of it, and returns true). */
|
||||
@@ -220,7 +224,7 @@ public class JavacSingularsRecipes {
|
||||
* If you need more control over the return type and value, use
|
||||
* {@link #generateMethods(SingularData, boolean, JavacNode, JCTree, boolean, ExpressionMaker, StatementMaker)}.
|
||||
*/
|
||||
public void generateMethods(SingularData data, boolean deprecate, final JavacNode builderType, JCTree source, boolean fluent, final boolean chain, AccessLevel access) {
|
||||
public void generateMethods(CheckerFrameworkVersion cfv, SingularData data, boolean deprecate, final JavacNode builderType, JCTree source, boolean fluent, final boolean chain, AccessLevel access) {
|
||||
final JavacTreeMaker maker = builderType.getTreeMaker();
|
||||
|
||||
ExpressionMaker returnTypeMaker = new ExpressionMaker() { @Override public JCExpression make() {
|
||||
@@ -233,26 +237,26 @@ public class JavacSingularsRecipes {
|
||||
return chain ? maker.Return(maker.Ident(builderType.toName("this"))) : null;
|
||||
}};
|
||||
|
||||
generateMethods(data, deprecate, builderType, source, fluent, returnTypeMaker, returnStatementMaker, access);
|
||||
generateMethods(cfv, data, deprecate, builderType, source, fluent, returnTypeMaker, returnStatementMaker, access);
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates the singular, plural, and clear methods for the given {@link SingularData}.
|
||||
* Uses the given {@code returnTypeMaker} and {@code returnStatementMaker} for the generated methods.
|
||||
*/
|
||||
public abstract void generateMethods(SingularData data, boolean deprecate, JavacNode builderType, JCTree source, boolean fluent, ExpressionMaker returnTypeMaker, StatementMaker returnStatementMaker, AccessLevel access);
|
||||
public abstract void generateMethods(CheckerFrameworkVersion cfv, SingularData data, boolean deprecate, JavacNode builderType, JCTree source, boolean fluent, ExpressionMaker returnTypeMaker, StatementMaker returnStatementMaker, AccessLevel access);
|
||||
|
||||
protected void doGenerateMethods(SingularData data, boolean deprecate, JavacNode builderType, JCTree source, boolean fluent, ExpressionMaker returnTypeMaker, StatementMaker returnStatementMaker, AccessLevel access) {
|
||||
protected void doGenerateMethods(CheckerFrameworkVersion cfv, SingularData data, boolean deprecate, JavacNode builderType, JCTree source, boolean fluent, ExpressionMaker returnTypeMaker, StatementMaker returnStatementMaker, AccessLevel access) {
|
||||
JavacTreeMaker maker = builderType.getTreeMaker();
|
||||
generateSingularMethod(deprecate, maker, returnTypeMaker.make(), returnStatementMaker.make(), data, builderType, source, fluent, access);
|
||||
generatePluralMethod(deprecate, maker, returnTypeMaker.make(), returnStatementMaker.make(), data, builderType, source, fluent, access);
|
||||
generateClearMethod(deprecate, maker, returnTypeMaker.make(), returnStatementMaker.make(), data, builderType, source, access);
|
||||
generateSingularMethod(cfv, deprecate, maker, returnTypeMaker.make(), returnStatementMaker.make(), data, builderType, source, fluent, access);
|
||||
generatePluralMethod(cfv, deprecate, maker, returnTypeMaker.make(), returnStatementMaker.make(), data, builderType, source, fluent, access);
|
||||
generateClearMethod(cfv, deprecate, maker, returnTypeMaker.make(), returnStatementMaker.make(), data, builderType, source, access);
|
||||
}
|
||||
|
||||
private void finishAndInjectMethod(JavacTreeMaker maker, JCExpression returnType, JCStatement returnStatement, SingularData data, JavacNode builderType, JCTree source, boolean deprecate, ListBuffer<JCStatement> statements, Name methodName, List<JCVariableDecl> jcVariableDecls, AccessLevel access) {
|
||||
private void finishAndInjectMethod(CheckerFrameworkVersion cfv, JavacTreeMaker maker, JCExpression returnType, JCStatement returnStatement, SingularData data, JavacNode builderType, JCTree source, boolean deprecate, ListBuffer<JCStatement> statements, Name methodName, List<JCVariableDecl> jcVariableDecls, AccessLevel access) {
|
||||
if (returnStatement != null) statements.append(returnStatement);
|
||||
JCBlock body = maker.Block(0, statements.toList());
|
||||
JCModifiers mods = makeMods(maker, builderType, deprecate, access);
|
||||
JCModifiers mods = makeMods(maker, cfv, builderType, deprecate, access);
|
||||
List<JCTypeParameter> typeParams = List.nil();
|
||||
List<JCExpression> thrown = List.nil();
|
||||
JCMethodDecl method = maker.MethodDef(mods, methodName, returnType, typeParams, jcVariableDecls, thrown, body, null);
|
||||
@@ -260,25 +264,25 @@ public class JavacSingularsRecipes {
|
||||
injectMethod(builderType, method);
|
||||
}
|
||||
|
||||
private void generateClearMethod(boolean deprecate, JavacTreeMaker maker, JCExpression returnType, JCStatement returnStatement, SingularData data, JavacNode builderType, JCTree source, AccessLevel access) {
|
||||
private void generateClearMethod(CheckerFrameworkVersion cfv, boolean deprecate, JavacTreeMaker maker, JCExpression returnType, JCStatement returnStatement, SingularData data, JavacNode builderType, JCTree source, AccessLevel access) {
|
||||
JCStatement clearStatement = generateClearStatements(maker, data, builderType);
|
||||
ListBuffer<JCStatement> statements = new ListBuffer<JCStatement>();
|
||||
statements.add(clearStatement);
|
||||
|
||||
Name methodName = builderType.toName(HandlerUtil.buildAccessorName("clear", data.getPluralName().toString()));
|
||||
finishAndInjectMethod(maker, returnType, returnStatement, data, builderType, source, deprecate, statements, methodName, List.<JCVariableDecl>nil(), access);
|
||||
finishAndInjectMethod(cfv, maker, returnType, returnStatement, data, builderType, source, deprecate, statements, methodName, List.<JCVariableDecl>nil(), access);
|
||||
}
|
||||
|
||||
protected abstract JCStatement generateClearStatements(JavacTreeMaker maker, SingularData data, JavacNode builderType);
|
||||
|
||||
private void generateSingularMethod(boolean deprecate, JavacTreeMaker maker, JCExpression returnType, JCStatement returnStatement, SingularData data, JavacNode builderType, JCTree source, boolean fluent, AccessLevel access) {
|
||||
private void generateSingularMethod(CheckerFrameworkVersion cfv, boolean deprecate, JavacTreeMaker maker, JCExpression returnType, JCStatement returnStatement, SingularData data, JavacNode builderType, JCTree source, boolean fluent, AccessLevel access) {
|
||||
ListBuffer<JCStatement> statements = generateSingularMethodStatements(maker, data, builderType, source);
|
||||
List<JCVariableDecl> params = generateSingularMethodParameters(maker, data, builderType, source);
|
||||
Name name = data.getSingularName();
|
||||
if (!fluent) name = builderType.toName(HandlerUtil.buildAccessorName(getAddMethodName(), name.toString()));
|
||||
|
||||
statements.prepend(createConstructBuilderVarIfNeeded(maker, data, builderType, source));
|
||||
finishAndInjectMethod(maker, returnType, returnStatement, data, builderType, source, deprecate, statements, name, params, access);
|
||||
finishAndInjectMethod(cfv, maker, returnType, returnStatement, data, builderType, source, deprecate, statements, name, params, access);
|
||||
}
|
||||
|
||||
protected JCVariableDecl generateSingularMethodParameter(int typeIndex, JavacTreeMaker maker, SingularData data, JavacNode builderType, JCTree source, Name name) {
|
||||
@@ -300,7 +304,7 @@ public class JavacSingularsRecipes {
|
||||
|
||||
protected abstract List<JCVariableDecl> generateSingularMethodParameters(JavacTreeMaker maker, SingularData data, JavacNode builderType, JCTree source);
|
||||
|
||||
private void generatePluralMethod(boolean deprecate, JavacTreeMaker maker, JCExpression returnType, JCStatement returnStatement, SingularData data, JavacNode builderType, JCTree source, boolean fluent, AccessLevel access) {
|
||||
private void generatePluralMethod(CheckerFrameworkVersion cfv, boolean deprecate, JavacTreeMaker maker, JCExpression returnType, JCStatement returnStatement, SingularData data, JavacNode builderType, JCTree source, boolean fluent, AccessLevel access) {
|
||||
ListBuffer<JCStatement> statements = generatePluralMethodStatements(maker, data, builderType, source);
|
||||
Name name = data.getPluralName();
|
||||
if (!fluent) name = builderType.toName(HandlerUtil.buildAccessorName(getAddMethodName() + "All", name.toString()));
|
||||
@@ -309,7 +313,7 @@ public class JavacSingularsRecipes {
|
||||
long paramFlags = JavacHandlerUtil.addFinalIfNeeded(Flags.PARAMETER, builderType.getContext());
|
||||
JCVariableDecl param = maker.VarDef(maker.Modifiers(paramFlags), data.getPluralName(), paramType, null);
|
||||
statements.prepend(createConstructBuilderVarIfNeeded(maker, data, builderType, source));
|
||||
finishAndInjectMethod(maker, returnType, returnStatement, data, builderType, source, deprecate, statements, name, List.of(param), access);
|
||||
finishAndInjectMethod(cfv, maker, returnType, returnStatement, data, builderType, source, deprecate, statements, name, List.of(param), access);
|
||||
}
|
||||
|
||||
protected ListBuffer<JCStatement> generatePluralMethodStatements(JavacTreeMaker maker, SingularData data, JavacNode builderType, JCTree source) {
|
||||
|
||||
@@ -29,6 +29,7 @@ import java.util.Collections;
|
||||
import lombok.AccessLevel;
|
||||
import lombok.core.GuavaTypeMap;
|
||||
import lombok.core.LombokImmutableList;
|
||||
import lombok.core.configuration.CheckerFrameworkVersion;
|
||||
import lombok.javac.JavacNode;
|
||||
import lombok.javac.JavacTreeMaker;
|
||||
import lombok.javac.handlers.JavacHandlerUtil;
|
||||
@@ -71,8 +72,8 @@ abstract class JavacGuavaSingularizer extends JavacSingularizer {
|
||||
return Collections.singletonList(injectFieldAndMarkGenerated(builderType, buildField));
|
||||
}
|
||||
|
||||
@Override public void generateMethods(SingularData data, boolean deprecate, JavacNode builderType, JCTree source, boolean fluent, ExpressionMaker returnTypeMaker, StatementMaker returnStatementMaker, AccessLevel access) {
|
||||
doGenerateMethods(data, deprecate, builderType, source, fluent, returnTypeMaker, returnStatementMaker, access);
|
||||
@Override public void generateMethods(CheckerFrameworkVersion cfv, SingularData data, boolean deprecate, JavacNode builderType, JCTree source, boolean fluent, ExpressionMaker returnTypeMaker, StatementMaker returnStatementMaker, AccessLevel access) {
|
||||
doGenerateMethods(cfv, data, deprecate, builderType, source, fluent, returnTypeMaker, returnStatementMaker, access);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -27,6 +27,7 @@ import static lombok.javac.handlers.JavacHandlerUtil.*;
|
||||
import java.util.Collections;
|
||||
|
||||
import lombok.AccessLevel;
|
||||
import lombok.core.configuration.CheckerFrameworkVersion;
|
||||
import lombok.javac.JavacNode;
|
||||
import lombok.javac.JavacTreeMaker;
|
||||
import lombok.javac.handlers.JavacHandlerUtil;
|
||||
@@ -66,8 +67,8 @@ abstract class JavacJavaUtilListSetSingularizer extends JavacJavaUtilSingularize
|
||||
return Collections.singletonList(injectFieldAndMarkGenerated(builderType, buildField));
|
||||
}
|
||||
|
||||
@Override public void generateMethods(SingularData data, boolean deprecate, JavacNode builderType, JCTree source, boolean fluent, ExpressionMaker returnTypeMaker, StatementMaker returnStatementMaker, AccessLevel access) {
|
||||
doGenerateMethods(data, deprecate, builderType, source, fluent, returnTypeMaker, returnStatementMaker, access);
|
||||
@Override public void generateMethods(CheckerFrameworkVersion cfv, SingularData data, boolean deprecate, JavacNode builderType, JCTree source, boolean fluent, ExpressionMaker returnTypeMaker, StatementMaker returnStatementMaker, AccessLevel access) {
|
||||
doGenerateMethods(cfv, data, deprecate, builderType, source, fluent, returnTypeMaker, returnStatementMaker, access);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -28,6 +28,7 @@ import java.util.Arrays;
|
||||
|
||||
import lombok.AccessLevel;
|
||||
import lombok.core.LombokImmutableList;
|
||||
import lombok.core.configuration.CheckerFrameworkVersion;
|
||||
import lombok.javac.JavacNode;
|
||||
import lombok.javac.JavacTreeMaker;
|
||||
import lombok.javac.handlers.JavacHandlerUtil;
|
||||
@@ -97,8 +98,8 @@ public class JavacJavaUtilMapSingularizer extends JavacJavaUtilSingularizer {
|
||||
return Arrays.asList(keyFieldNode, valueFieldNode);
|
||||
}
|
||||
|
||||
@Override public void generateMethods(SingularData data, boolean deprecate, JavacNode builderType, JCTree source, boolean fluent, ExpressionMaker returnTypeMaker, StatementMaker returnStatementMaker, AccessLevel access) {
|
||||
doGenerateMethods(data, deprecate, builderType, source, fluent, returnTypeMaker, returnStatementMaker, access);
|
||||
@Override public void generateMethods(CheckerFrameworkVersion cfv, SingularData data, boolean deprecate, JavacNode builderType, JCTree source, boolean fluent, ExpressionMaker returnTypeMaker, StatementMaker returnStatementMaker, AccessLevel access) {
|
||||
doGenerateMethods(cfv, data, deprecate, builderType, source, fluent, returnTypeMaker, returnStatementMaker, access);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -436,14 +436,14 @@ class ShadowClassLoader extends ClassLoader {
|
||||
Enumeration<URL> sec = super.getResources(name);
|
||||
while (sec.hasMoreElements()) {
|
||||
URL item = sec.nextElement();
|
||||
if (!partOfShadow(item.toString(), name)) vector.add(item);
|
||||
if (isPartOfShadowSuffix(item.toString(), name, sclSuffix)) vector.add(item);
|
||||
}
|
||||
|
||||
if (altName != null) {
|
||||
Enumeration<URL> tern = super.getResources(altName);
|
||||
while (tern.hasMoreElements()) {
|
||||
URL item = tern.nextElement();
|
||||
if (!partOfShadow(item.toString(), altName)) vector.add(item);
|
||||
if (isPartOfShadowSuffix(item.toString(), altName, sclSuffix)) vector.add(item);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -47,6 +47,7 @@ import lombok.core.configuration.ConfigurationKeysLoader;
|
||||
import lombok.core.configuration.ConfigurationResolver;
|
||||
import lombok.core.configuration.ConfigurationResolverFactory;
|
||||
import lombok.javac.CapturingDiagnosticListener.CompilerMessage;
|
||||
import lombok.transform.TestLombokFilesIdempotent;
|
||||
|
||||
public abstract class AbstractRunTests {
|
||||
private final File dumpActualFilesHere;
|
||||
@@ -74,6 +75,7 @@ public abstract class AbstractRunTests {
|
||||
if (expected.isIgnore()) return null;
|
||||
if (!expected.versionWithinLimit(params.getVersion())) return null;
|
||||
if (!expected.versionWithinLimit(version)) return null;
|
||||
if (expected.isSkipIdempotent() && params instanceof TestLombokFilesIdempotent) return null;
|
||||
|
||||
final LombokTestSource sourceDirectives_ = sourceDirectives;
|
||||
final AssertionError directiveFailure_ = directiveFailure;
|
||||
|
||||
@@ -88,7 +88,7 @@ public class CompilerMessageMatcher {
|
||||
return out;
|
||||
}
|
||||
|
||||
private static final Pattern PATTERN = Pattern.compile("^(\\d+) (.*)$");
|
||||
private static final Pattern PATTERN = Pattern.compile("^(-?\\d+) (.*)$");
|
||||
|
||||
private static CompilerMessageMatcher read(String line) {
|
||||
line = line.trim();
|
||||
|
||||
@@ -36,7 +36,8 @@ import org.junit.runner.notification.Failure;
|
||||
import org.junit.runner.notification.RunNotifier;
|
||||
|
||||
public class DirectoryRunner extends Runner {
|
||||
private static final String DEBUG_FOCUS_ON_FILE = null;
|
||||
/** Fill in a file name (or multiple, space separated) to reduce the testset to just the named file(s). */
|
||||
private static final String DEBUG_FOCUS_ON_FILE = "";
|
||||
|
||||
public enum Compiler {
|
||||
DELOMBOK {
|
||||
@@ -79,7 +80,7 @@ public class DirectoryRunner extends Runner {
|
||||
private static final FileFilter JAVA_FILE_FILTER = new FileFilter() {
|
||||
@Override public boolean accept(File file) {
|
||||
return file.isFile() && file.getName().endsWith(".java") &&
|
||||
(DEBUG_FOCUS_ON_FILE == null || file.getName().equals(DEBUG_FOCUS_ON_FILE));
|
||||
(DEBUG_FOCUS_ON_FILE.isEmpty() || (" " + DEBUG_FOCUS_ON_FILE + " ").contains(" " + file.getName() + " "));
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2014-2015 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
|
||||
@@ -52,6 +52,7 @@ public class LombokTestSource {
|
||||
private final Map<String, String> formatPreferences;
|
||||
private final boolean ignore;
|
||||
private final boolean skipCompareContent;
|
||||
private final boolean skipIdempotent;
|
||||
private final boolean unchanged;
|
||||
private final int versionLowerLimit, versionUpperLimit;
|
||||
private final ConfigurationResolver configuration;
|
||||
@@ -92,6 +93,10 @@ public class LombokTestSource {
|
||||
return skipCompareContent;
|
||||
}
|
||||
|
||||
public boolean isSkipIdempotent() {
|
||||
return skipIdempotent;
|
||||
}
|
||||
|
||||
public String getSpecifiedEncoding() {
|
||||
return specifiedEncoding;
|
||||
}
|
||||
@@ -139,6 +144,7 @@ public class LombokTestSource {
|
||||
private static final Pattern IGNORE_PATTERN = Pattern.compile("^\\s*ignore\\s*(?:[-:].*)?$", Pattern.CASE_INSENSITIVE);
|
||||
private static final Pattern UNCHANGED_PATTERN = Pattern.compile("^\\s*unchanged\\s*(?:[-:].*)?$", Pattern.CASE_INSENSITIVE);
|
||||
private static final Pattern SKIP_COMPARE_CONTENT_PATTERN = Pattern.compile("^\\s*skip[- ]?compare[- ]?contents?\\s*(?:[-:].*)?$", Pattern.CASE_INSENSITIVE);
|
||||
private static final Pattern SKIP_IDEMPOTENT_PATTERN = Pattern.compile("^\\s*skip[- ]?idempotent\\s*(?:[-:].*)?$", Pattern.CASE_INSENSITIVE);
|
||||
|
||||
private LombokTestSource(File file, String content, List<CompilerMessageMatcher> messages, List<String> directives) {
|
||||
this.file = file;
|
||||
@@ -150,6 +156,7 @@ public class LombokTestSource {
|
||||
int versionUpper = Integer.MAX_VALUE;
|
||||
boolean ignore = false;
|
||||
boolean skipCompareContent = false;
|
||||
boolean skipIdempotent = false;
|
||||
boolean unchanged = false;
|
||||
String encoding = null;
|
||||
Map<String, String> formats = new HashMap<String, String>();
|
||||
@@ -173,6 +180,11 @@ public class LombokTestSource {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (SKIP_IDEMPOTENT_PATTERN.matcher(directive).matches()) {
|
||||
skipIdempotent = true;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (lc.startsWith("platform ")) {
|
||||
String platformDesc = lc.substring("platform ".length());
|
||||
int idx = platformDesc.indexOf(':');
|
||||
@@ -223,6 +235,7 @@ public class LombokTestSource {
|
||||
this.versionUpperLimit = versionUpper;
|
||||
this.ignore = ignore;
|
||||
this.skipCompareContent = skipCompareContent;
|
||||
this.skipIdempotent = skipIdempotent;
|
||||
this.unchanged = unchanged;
|
||||
this.platforms = platformLimit == null ? null : Arrays.asList(platformLimit);
|
||||
ConfigurationProblemReporter reporter = new ConfigurationProblemReporter() {
|
||||
|
||||
@@ -0,0 +1,72 @@
|
||||
class CheckerFrameworkBasic {
|
||||
private final int x;
|
||||
private final int y;
|
||||
private int z;
|
||||
@org.checkerframework.common.aliasing.qual.Unique
|
||||
@java.lang.SuppressWarnings("all")
|
||||
public CheckerFrameworkBasic(final int x, final int y) {
|
||||
this.x = x;
|
||||
this.y = y;
|
||||
}
|
||||
@org.checkerframework.dataflow.qual.SideEffectFree
|
||||
@java.lang.SuppressWarnings("all")
|
||||
public int getX() {
|
||||
return this.x;
|
||||
}
|
||||
@org.checkerframework.dataflow.qual.SideEffectFree
|
||||
@java.lang.SuppressWarnings("all")
|
||||
public int getY() {
|
||||
return this.y;
|
||||
}
|
||||
@org.checkerframework.dataflow.qual.SideEffectFree
|
||||
@java.lang.SuppressWarnings("all")
|
||||
public int getZ() {
|
||||
return this.z;
|
||||
}
|
||||
@org.checkerframework.checker.builder.qual.ReturnsReceiver
|
||||
@java.lang.SuppressWarnings("all")
|
||||
public CheckerFrameworkBasic setZ(final int z) {
|
||||
this.z = z;
|
||||
return this;
|
||||
}
|
||||
@org.checkerframework.dataflow.qual.SideEffectFree
|
||||
@java.lang.Override
|
||||
@java.lang.SuppressWarnings("all")
|
||||
public boolean equals(final java.lang.Object o) {
|
||||
if (o == this) return true;
|
||||
if (!(o instanceof CheckerFrameworkBasic)) return false;
|
||||
final CheckerFrameworkBasic other = (CheckerFrameworkBasic) o;
|
||||
if (!other.canEqual((java.lang.Object) this)) return false;
|
||||
if (this.getX() != other.getX()) return false;
|
||||
if (this.getY() != other.getY()) return false;
|
||||
if (this.getZ() != other.getZ()) return false;
|
||||
return true;
|
||||
}
|
||||
@org.checkerframework.dataflow.qual.SideEffectFree
|
||||
@java.lang.SuppressWarnings("all")
|
||||
protected boolean canEqual(final java.lang.Object other) {
|
||||
return other instanceof CheckerFrameworkBasic;
|
||||
}
|
||||
@org.checkerframework.dataflow.qual.SideEffectFree
|
||||
@java.lang.Override
|
||||
@java.lang.SuppressWarnings("all")
|
||||
public int hashCode() {
|
||||
final int PRIME = 59;
|
||||
int result = 1;
|
||||
result = result * PRIME + this.getX();
|
||||
result = result * PRIME + this.getY();
|
||||
result = result * PRIME + this.getZ();
|
||||
return result;
|
||||
}
|
||||
@org.checkerframework.dataflow.qual.SideEffectFree
|
||||
@java.lang.Override
|
||||
@java.lang.SuppressWarnings("all")
|
||||
public java.lang.String toString() {
|
||||
return "CheckerFrameworkBasic(x=" + this.getX() + ", y=" + this.getY() + ", z=" + this.getZ() + ")";
|
||||
}
|
||||
@org.checkerframework.dataflow.qual.SideEffectFree
|
||||
@java.lang.SuppressWarnings("all")
|
||||
public CheckerFrameworkBasic withX(final int x) {
|
||||
return this.x == x ? this : new CheckerFrameworkBasic(x, this.y, this.z);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,106 @@
|
||||
// skip-idempotent
|
||||
import java.util.List;
|
||||
class CheckerFrameworkBuilder {
|
||||
int x;
|
||||
int y;
|
||||
int z;
|
||||
List<String> names;
|
||||
@java.lang.SuppressWarnings("all")
|
||||
private static int $default$x() {
|
||||
return 5;
|
||||
}
|
||||
@org.checkerframework.common.aliasing.qual.Unique
|
||||
@java.lang.SuppressWarnings("all")
|
||||
CheckerFrameworkBuilder(final int x, final int y, final int z, final List<String> names) {
|
||||
this.x = x;
|
||||
this.y = y;
|
||||
this.z = z;
|
||||
this.names = names;
|
||||
}
|
||||
@java.lang.SuppressWarnings("all")
|
||||
public static class CheckerFrameworkBuilderBuilder {
|
||||
@java.lang.SuppressWarnings("all")
|
||||
private boolean x$set;
|
||||
@java.lang.SuppressWarnings("all")
|
||||
private int x$value;
|
||||
@java.lang.SuppressWarnings("all")
|
||||
private int y;
|
||||
@java.lang.SuppressWarnings("all")
|
||||
private int z;
|
||||
@java.lang.SuppressWarnings("all")
|
||||
private java.util.ArrayList<String> names;
|
||||
@org.checkerframework.common.aliasing.qual.Unique
|
||||
@java.lang.SuppressWarnings("all")
|
||||
CheckerFrameworkBuilderBuilder() {
|
||||
}
|
||||
@org.checkerframework.checker.builder.qual.ReturnsReceiver
|
||||
@java.lang.SuppressWarnings("all")
|
||||
public CheckerFrameworkBuilderBuilder x(@org.checkerframework.checker.builder.qual.NotCalledMethods("x") CheckerFrameworkBuilderBuilder this, final int x) {
|
||||
this.x$value = x;
|
||||
x$set = true;
|
||||
return this;
|
||||
}
|
||||
@org.checkerframework.checker.builder.qual.ReturnsReceiver
|
||||
@java.lang.SuppressWarnings("all")
|
||||
public CheckerFrameworkBuilderBuilder y(@org.checkerframework.checker.builder.qual.NotCalledMethods("y") CheckerFrameworkBuilderBuilder this, final int y) {
|
||||
this.y = y;
|
||||
return this;
|
||||
}
|
||||
@org.checkerframework.checker.builder.qual.ReturnsReceiver
|
||||
@java.lang.SuppressWarnings("all")
|
||||
public CheckerFrameworkBuilderBuilder z(@org.checkerframework.checker.builder.qual.NotCalledMethods("z") CheckerFrameworkBuilderBuilder this, final int z) {
|
||||
this.z = z;
|
||||
return this;
|
||||
}
|
||||
@org.checkerframework.checker.builder.qual.ReturnsReceiver
|
||||
@java.lang.SuppressWarnings("all")
|
||||
public CheckerFrameworkBuilderBuilder name(final String name) {
|
||||
if (this.names == null) this.names = new java.util.ArrayList<String>();
|
||||
this.names.add(name);
|
||||
return this;
|
||||
}
|
||||
@org.checkerframework.checker.builder.qual.ReturnsReceiver
|
||||
@java.lang.SuppressWarnings("all")
|
||||
public CheckerFrameworkBuilderBuilder names(final java.util.Collection<? extends String> names) {
|
||||
if (this.names == null) this.names = new java.util.ArrayList<String>();
|
||||
this.names.addAll(names);
|
||||
return this;
|
||||
}
|
||||
@org.checkerframework.checker.builder.qual.ReturnsReceiver
|
||||
@java.lang.SuppressWarnings("all")
|
||||
public CheckerFrameworkBuilderBuilder clearNames() {
|
||||
if (this.names != null) this.names.clear();
|
||||
return this;
|
||||
}
|
||||
@org.checkerframework.dataflow.qual.SideEffectFree
|
||||
@java.lang.SuppressWarnings("all")
|
||||
public CheckerFrameworkBuilder build(@org.checkerframework.checker.builder.qual.CalledMethods({"y", "z"}) CheckerFrameworkBuilderBuilder this) {
|
||||
java.util.List<String> names;
|
||||
switch (this.names == null ? 0 : this.names.size()) {
|
||||
case 0:
|
||||
names = java.util.Collections.emptyList();
|
||||
break;
|
||||
case 1:
|
||||
names = java.util.Collections.singletonList(this.names.get(0));
|
||||
break;
|
||||
default:
|
||||
names = java.util.Collections.unmodifiableList(new java.util.ArrayList<String>(this.names));
|
||||
}
|
||||
int x$value = this.x$value;
|
||||
if (!x$set) x$value = CheckerFrameworkBuilder.$default$x();
|
||||
return new CheckerFrameworkBuilder(x$value, y, z, names);
|
||||
}
|
||||
@org.checkerframework.dataflow.qual.SideEffectFree
|
||||
@java.lang.Override
|
||||
@java.lang.SuppressWarnings("all")
|
||||
public java.lang.String toString() {
|
||||
return "CheckerFrameworkBuilder.CheckerFrameworkBuilderBuilder(x$value=" + this.x$value + ", y=" + this.y + ", z=" + this.z + ", names=" + this.names + ")";
|
||||
}
|
||||
}
|
||||
@org.checkerframework.common.aliasing.qual.Unique
|
||||
@org.checkerframework.dataflow.qual.SideEffectFree
|
||||
@java.lang.SuppressWarnings("all")
|
||||
public static CheckerFrameworkBuilderBuilder builder() {
|
||||
return new CheckerFrameworkBuilderBuilder();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,202 @@
|
||||
// skip-idempotent
|
||||
import java.util.List;
|
||||
class CheckerFrameworkSuperBuilder {
|
||||
public static class Parent {
|
||||
int x;
|
||||
int y;
|
||||
int z;
|
||||
List<String> names;
|
||||
@java.lang.SuppressWarnings("all")
|
||||
private static int $default$x() {
|
||||
return 5;
|
||||
}
|
||||
@java.lang.SuppressWarnings("all")
|
||||
public static abstract class ParentBuilder<C extends Parent, B extends ParentBuilder<C, B>> {
|
||||
@java.lang.SuppressWarnings("all")
|
||||
private boolean x$set;
|
||||
@java.lang.SuppressWarnings("all")
|
||||
private int x$value;
|
||||
@java.lang.SuppressWarnings("all")
|
||||
private int y;
|
||||
@java.lang.SuppressWarnings("all")
|
||||
private int z;
|
||||
@java.lang.SuppressWarnings("all")
|
||||
private java.util.ArrayList<String> names;
|
||||
@org.checkerframework.checker.builder.qual.ReturnsReceiver
|
||||
@org.checkerframework.dataflow.qual.SideEffectFree
|
||||
@java.lang.SuppressWarnings("all")
|
||||
protected abstract B self();
|
||||
@org.checkerframework.dataflow.qual.SideEffectFree
|
||||
@java.lang.SuppressWarnings("all")
|
||||
public abstract C build(@org.checkerframework.checker.builder.qual.CalledMethods({"y", "z"}) Parent this);
|
||||
@org.checkerframework.checker.builder.qual.ReturnsReceiver
|
||||
@java.lang.SuppressWarnings("all")
|
||||
public B x(@org.checkerframework.checker.builder.qual.NotCalledMethods("x") ParentBuilder this, final int x) {
|
||||
this.x$value = x;
|
||||
x$set = true;
|
||||
return self();
|
||||
}
|
||||
@org.checkerframework.checker.builder.qual.ReturnsReceiver
|
||||
@java.lang.SuppressWarnings("all")
|
||||
public B y(@org.checkerframework.checker.builder.qual.NotCalledMethods("y") ParentBuilder this, final int y) {
|
||||
this.y = y;
|
||||
return self();
|
||||
}
|
||||
@org.checkerframework.checker.builder.qual.ReturnsReceiver
|
||||
@java.lang.SuppressWarnings("all")
|
||||
public B z(@org.checkerframework.checker.builder.qual.NotCalledMethods("z") ParentBuilder this, final int z) {
|
||||
this.z = z;
|
||||
return self();
|
||||
}
|
||||
@org.checkerframework.checker.builder.qual.ReturnsReceiver
|
||||
@java.lang.SuppressWarnings("all")
|
||||
public B name(final String name) {
|
||||
if (this.names == null) this.names = new java.util.ArrayList<String>();
|
||||
this.names.add(name);
|
||||
return self();
|
||||
}
|
||||
@org.checkerframework.checker.builder.qual.ReturnsReceiver
|
||||
@java.lang.SuppressWarnings("all")
|
||||
public B names(final java.util.Collection<? extends String> names) {
|
||||
if (this.names == null) this.names = new java.util.ArrayList<String>();
|
||||
this.names.addAll(names);
|
||||
return self();
|
||||
}
|
||||
@org.checkerframework.checker.builder.qual.ReturnsReceiver
|
||||
@java.lang.SuppressWarnings("all")
|
||||
public B clearNames() {
|
||||
if (this.names != null) this.names.clear();
|
||||
return self();
|
||||
}
|
||||
@org.checkerframework.dataflow.qual.SideEffectFree
|
||||
@java.lang.Override
|
||||
@java.lang.SuppressWarnings("all")
|
||||
public java.lang.String toString() {
|
||||
return "CheckerFrameworkSuperBuilder.Parent.ParentBuilder(x$value=" + this.x$value + ", y=" + this.y + ", z=" + this.z + ", names=" + this.names + ")";
|
||||
}
|
||||
}
|
||||
@java.lang.SuppressWarnings("all")
|
||||
private static final class ParentBuilderImpl extends ParentBuilder<Parent, ParentBuilderImpl> {
|
||||
@org.checkerframework.common.aliasing.qual.Unique
|
||||
@java.lang.SuppressWarnings("all")
|
||||
private ParentBuilderImpl() {
|
||||
}
|
||||
@java.lang.Override
|
||||
@org.checkerframework.checker.builder.qual.ReturnsReceiver
|
||||
@org.checkerframework.dataflow.qual.SideEffectFree
|
||||
@java.lang.SuppressWarnings("all")
|
||||
protected ParentBuilderImpl self() {
|
||||
return this;
|
||||
}
|
||||
@org.checkerframework.dataflow.qual.SideEffectFree
|
||||
@java.lang.Override
|
||||
@java.lang.SuppressWarnings("all")
|
||||
public Parent build(@org.checkerframework.checker.builder.qual.CalledMethods({"y", "z"}) ParentBuilderImpl this) {
|
||||
return new Parent(this);
|
||||
}
|
||||
}
|
||||
@org.checkerframework.dataflow.qual.SideEffectFree
|
||||
@java.lang.SuppressWarnings("all")
|
||||
protected Parent(final ParentBuilder<?, ?> b) {
|
||||
if (b.x$set) this.x = b.x$value;
|
||||
else this.x = Parent.$default$x();
|
||||
this.y = b.y;
|
||||
this.z = b.z;
|
||||
java.util.List<String> names;
|
||||
switch (b.names == null ? 0 : b.names.size()) {
|
||||
case 0:
|
||||
names = java.util.Collections.emptyList();
|
||||
break;
|
||||
case 1:
|
||||
names = java.util.Collections.singletonList(b.names.get(0));
|
||||
break;
|
||||
default:
|
||||
names = java.util.Collections.unmodifiableList(new java.util.ArrayList<String>(b.names));
|
||||
}
|
||||
this.names = names;
|
||||
}
|
||||
@org.checkerframework.dataflow.qual.SideEffectFree
|
||||
@java.lang.SuppressWarnings("all")
|
||||
public static ParentBuilder<?, ?> builder() {
|
||||
return new ParentBuilderImpl();
|
||||
}
|
||||
}
|
||||
public static class Child extends Parent {
|
||||
int a;
|
||||
int b;
|
||||
@java.lang.SuppressWarnings("all")
|
||||
private static int $default$a() {
|
||||
return 1;
|
||||
}
|
||||
@java.lang.SuppressWarnings("all")
|
||||
public static abstract class ChildBuilder<C extends Child, B extends ChildBuilder<C, B>> extends Parent.ParentBuilder<C, B> {
|
||||
@java.lang.SuppressWarnings("all")
|
||||
private boolean a$set;
|
||||
@java.lang.SuppressWarnings("all")
|
||||
private int a$value;
|
||||
@java.lang.SuppressWarnings("all")
|
||||
private int b;
|
||||
@java.lang.Override
|
||||
@org.checkerframework.checker.builder.qual.ReturnsReceiver
|
||||
@org.checkerframework.dataflow.qual.SideEffectFree
|
||||
@java.lang.SuppressWarnings("all")
|
||||
protected abstract B self();
|
||||
@org.checkerframework.dataflow.qual.SideEffectFree
|
||||
@java.lang.Override
|
||||
@java.lang.SuppressWarnings("all")
|
||||
public abstract C build(@org.checkerframework.checker.builder.qual.CalledMethods("b") Child this);
|
||||
@org.checkerframework.checker.builder.qual.ReturnsReceiver
|
||||
@java.lang.SuppressWarnings("all")
|
||||
public B a(@org.checkerframework.checker.builder.qual.NotCalledMethods("a") ChildBuilder this, final int a) {
|
||||
this.a$value = a;
|
||||
a$set = true;
|
||||
return self();
|
||||
}
|
||||
@org.checkerframework.checker.builder.qual.ReturnsReceiver
|
||||
@java.lang.SuppressWarnings("all")
|
||||
public B b(@org.checkerframework.checker.builder.qual.NotCalledMethods("b") ChildBuilder this, final int b) {
|
||||
this.b = b;
|
||||
return self();
|
||||
}
|
||||
@org.checkerframework.dataflow.qual.SideEffectFree
|
||||
@java.lang.Override
|
||||
@java.lang.SuppressWarnings("all")
|
||||
public java.lang.String toString() {
|
||||
return "CheckerFrameworkSuperBuilder.Child.ChildBuilder(super=" + super.toString() + ", a$value=" + this.a$value + ", b=" + this.b + ")";
|
||||
}
|
||||
}
|
||||
@java.lang.SuppressWarnings("all")
|
||||
private static final class ChildBuilderImpl extends ChildBuilder<Child, ChildBuilderImpl> {
|
||||
@org.checkerframework.common.aliasing.qual.Unique
|
||||
@java.lang.SuppressWarnings("all")
|
||||
private ChildBuilderImpl() {
|
||||
}
|
||||
@java.lang.Override
|
||||
@org.checkerframework.checker.builder.qual.ReturnsReceiver
|
||||
@org.checkerframework.dataflow.qual.SideEffectFree
|
||||
@java.lang.SuppressWarnings("all")
|
||||
protected ChildBuilderImpl self() {
|
||||
return this;
|
||||
}
|
||||
@org.checkerframework.dataflow.qual.SideEffectFree
|
||||
@java.lang.Override
|
||||
@java.lang.SuppressWarnings("all")
|
||||
public Child build(@org.checkerframework.checker.builder.qual.CalledMethods("b") ChildBuilderImpl this) {
|
||||
return new Child(this);
|
||||
}
|
||||
}
|
||||
@org.checkerframework.dataflow.qual.SideEffectFree
|
||||
@java.lang.SuppressWarnings("all")
|
||||
protected Child(final ChildBuilder<?, ?> b) {
|
||||
super(b);
|
||||
if (b.a$set) this.a = b.a$value;
|
||||
else this.a = Child.$default$a();
|
||||
this.b = b.b;
|
||||
}
|
||||
@org.checkerframework.dataflow.qual.SideEffectFree
|
||||
@java.lang.SuppressWarnings("all")
|
||||
public static ChildBuilder<?, ?> builder() {
|
||||
return new ChildBuilderImpl();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,59 @@
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
import lombok.experimental.Wither;
|
||||
@Data @Accessors(chain = true) class CheckerFrameworkBasic {
|
||||
private final @Wither int x;
|
||||
private final int y;
|
||||
private int z;
|
||||
public @org.checkerframework.dataflow.qual.SideEffectFree @java.lang.SuppressWarnings("all") CheckerFrameworkBasic withX(final int x) {
|
||||
return ((this.x == x) ? this : new CheckerFrameworkBasic(x, this.y, this.z));
|
||||
}
|
||||
public @org.checkerframework.dataflow.qual.SideEffectFree @java.lang.SuppressWarnings("all") int getX() {
|
||||
return this.x;
|
||||
}
|
||||
public @org.checkerframework.dataflow.qual.SideEffectFree @java.lang.SuppressWarnings("all") int getY() {
|
||||
return this.y;
|
||||
}
|
||||
public @org.checkerframework.dataflow.qual.SideEffectFree @java.lang.SuppressWarnings("all") int getZ() {
|
||||
return this.z;
|
||||
}
|
||||
public @org.checkerframework.checker.builder.qual.ReturnsReceiver @java.lang.SuppressWarnings("all") CheckerFrameworkBasic setZ(final int z) {
|
||||
this.z = z;
|
||||
return this;
|
||||
}
|
||||
public @java.lang.Override @org.checkerframework.dataflow.qual.SideEffectFree @java.lang.SuppressWarnings("all") boolean equals(final java.lang.Object o) {
|
||||
if ((o == this))
|
||||
return true;
|
||||
if ((! (o instanceof CheckerFrameworkBasic)))
|
||||
return false;
|
||||
final CheckerFrameworkBasic other = (CheckerFrameworkBasic) o;
|
||||
if ((! other.canEqual((java.lang.Object) this)))
|
||||
return false;
|
||||
if ((this.getX() != other.getX()))
|
||||
return false;
|
||||
if ((this.getY() != other.getY()))
|
||||
return false;
|
||||
if ((this.getZ() != other.getZ()))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
protected @org.checkerframework.dataflow.qual.SideEffectFree @java.lang.SuppressWarnings("all") boolean canEqual(final java.lang.Object other) {
|
||||
return (other instanceof CheckerFrameworkBasic);
|
||||
}
|
||||
public @java.lang.Override @org.checkerframework.dataflow.qual.SideEffectFree @java.lang.SuppressWarnings("all") int hashCode() {
|
||||
final int PRIME = 59;
|
||||
int result = 1;
|
||||
result = ((result * PRIME) + this.getX());
|
||||
result = ((result * PRIME) + this.getY());
|
||||
result = ((result * PRIME) + this.getZ());
|
||||
return result;
|
||||
}
|
||||
public @java.lang.Override @org.checkerframework.dataflow.qual.SideEffectFree @java.lang.SuppressWarnings("all") java.lang.String toString() {
|
||||
return (((((("CheckerFrameworkBasic(x=" + this.getX()) + ", y=") + this.getY()) + ", z=") + this.getZ()) + ")");
|
||||
}
|
||||
public @org.checkerframework.common.aliasing.qual.Unique @java.lang.SuppressWarnings("all") CheckerFrameworkBasic(final int x, final int y) {
|
||||
super();
|
||||
this.x = x;
|
||||
this.y = y;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,79 @@
|
||||
import java.util.List;
|
||||
import lombok.Builder;
|
||||
import lombok.Singular;
|
||||
@Builder class CheckerFrameworkBuilder {
|
||||
public static @java.lang.SuppressWarnings("all") class CheckerFrameworkBuilderBuilder {
|
||||
private @java.lang.SuppressWarnings("all") int x$value;
|
||||
private @java.lang.SuppressWarnings("all") boolean x$set;
|
||||
private @java.lang.SuppressWarnings("all") int y;
|
||||
private @java.lang.SuppressWarnings("all") int z;
|
||||
private @java.lang.SuppressWarnings("all") java.util.ArrayList<String> names;
|
||||
@org.checkerframework.common.aliasing.qual.Unique @java.lang.SuppressWarnings("all") CheckerFrameworkBuilderBuilder() {
|
||||
super();
|
||||
}
|
||||
public @org.checkerframework.checker.builder.qual.ReturnsReceiver @java.lang.SuppressWarnings("all") CheckerFrameworkBuilderBuilder x(final @org.checkerframework.checker.builder.qual.NotCalledMethods("x") CheckerFrameworkBuilderBuilder this, final int x) {
|
||||
this.x$value = x;
|
||||
x$set = true;
|
||||
return this;
|
||||
}
|
||||
public @org.checkerframework.checker.builder.qual.ReturnsReceiver @java.lang.SuppressWarnings("all") CheckerFrameworkBuilderBuilder y(final @org.checkerframework.checker.builder.qual.NotCalledMethods("y") CheckerFrameworkBuilderBuilder this, final int y) {
|
||||
this.y = y;
|
||||
return this;
|
||||
}
|
||||
public @org.checkerframework.checker.builder.qual.ReturnsReceiver @java.lang.SuppressWarnings("all") CheckerFrameworkBuilderBuilder z(final @org.checkerframework.checker.builder.qual.NotCalledMethods("z") CheckerFrameworkBuilderBuilder this, final int z) {
|
||||
this.z = z;
|
||||
return this;
|
||||
}
|
||||
public @org.checkerframework.checker.builder.qual.ReturnsReceiver @java.lang.SuppressWarnings("all") CheckerFrameworkBuilderBuilder name(final String name) {
|
||||
if ((this.names == null))
|
||||
this.names = new java.util.ArrayList<String>();
|
||||
this.names.add(name);
|
||||
return this;
|
||||
}
|
||||
public @org.checkerframework.checker.builder.qual.ReturnsReceiver @java.lang.SuppressWarnings("all") CheckerFrameworkBuilderBuilder names(final java.util.Collection<? extends String> names) {
|
||||
if ((this.names == null))
|
||||
this.names = new java.util.ArrayList<String>();
|
||||
this.names.addAll(names);
|
||||
return this;
|
||||
}
|
||||
public @org.checkerframework.checker.builder.qual.ReturnsReceiver @java.lang.SuppressWarnings("all") CheckerFrameworkBuilderBuilder clearNames() {
|
||||
if ((this.names != null))
|
||||
this.names.clear();
|
||||
return this;
|
||||
}
|
||||
public @org.checkerframework.dataflow.qual.SideEffectFree @java.lang.SuppressWarnings("all") CheckerFrameworkBuilder build(final @org.checkerframework.checker.builder.qual.CalledMethods({"y", "z"}) CheckerFrameworkBuilderBuilder this) {
|
||||
java.util.List<String> names;
|
||||
switch (((this.names == null) ? 0 : this.names.size())) {
|
||||
case 0 :
|
||||
names = java.util.Collections.emptyList();
|
||||
break;
|
||||
case 1 :
|
||||
names = java.util.Collections.singletonList(this.names.get(0));
|
||||
break;
|
||||
default :
|
||||
names = java.util.Collections.unmodifiableList(new java.util.ArrayList<String>(this.names));
|
||||
}
|
||||
return new CheckerFrameworkBuilder((x$set ? x$value : CheckerFrameworkBuilder.$default$x()), y, z, names);
|
||||
}
|
||||
public @java.lang.Override @org.checkerframework.dataflow.qual.SideEffectFree @java.lang.SuppressWarnings("all") java.lang.String toString() {
|
||||
return (((((((("CheckerFrameworkBuilder.CheckerFrameworkBuilderBuilder(x$value=" + this.x$value) + ", y=") + this.y) + ", z=") + this.z) + ", names=") + this.names) + ")");
|
||||
}
|
||||
}
|
||||
@Builder.Default int x;
|
||||
int y;
|
||||
int z;
|
||||
@Singular List<String> names;
|
||||
private static @java.lang.SuppressWarnings("all") int $default$x() {
|
||||
return 5;
|
||||
}
|
||||
@org.checkerframework.common.aliasing.qual.Unique @java.lang.SuppressWarnings("all") CheckerFrameworkBuilder(final int x, final int y, final int z, final List<String> names) {
|
||||
super();
|
||||
this.x = x;
|
||||
this.y = y;
|
||||
this.z = z;
|
||||
this.names = names;
|
||||
}
|
||||
public static @org.checkerframework.common.aliasing.qual.Unique @org.checkerframework.dataflow.qual.SideEffectFree @java.lang.SuppressWarnings("all") CheckerFrameworkBuilderBuilder builder() {
|
||||
return new CheckerFrameworkBuilderBuilder();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,142 @@
|
||||
import java.util.List;
|
||||
import lombok.Singular;
|
||||
class CheckerFrameworkSuperBuilder {
|
||||
public static @lombok.experimental.SuperBuilder class Parent {
|
||||
public static abstract @java.lang.SuppressWarnings("all") class ParentBuilder<C extends Parent, B extends ParentBuilder<C, B>> {
|
||||
private @java.lang.SuppressWarnings("all") int x$value;
|
||||
private @java.lang.SuppressWarnings("all") boolean x$set;
|
||||
private @java.lang.SuppressWarnings("all") int y;
|
||||
private @java.lang.SuppressWarnings("all") int z;
|
||||
private @java.lang.SuppressWarnings("all") java.util.ArrayList<String> names;
|
||||
public ParentBuilder() {
|
||||
}
|
||||
protected abstract @org.checkerframework.checker.builder.qual.ReturnsReceiver @org.checkerframework.dataflow.qual.SideEffectFree @java.lang.SuppressWarnings("all") B self();
|
||||
public abstract @org.checkerframework.dataflow.qual.SideEffectFree @java.lang.SuppressWarnings("all") C build(final @org.checkerframework.checker.builder.qual.CalledMethods({"y", "z"}) ParentBuilder this);
|
||||
public @org.checkerframework.checker.builder.qual.ReturnsReceiver @java.lang.SuppressWarnings("all") B x(final @org.checkerframework.checker.builder.qual.NotCalledMethods("x") ParentBuilder this, final int x) {
|
||||
this.x$value = x;
|
||||
x$set = true;
|
||||
return self();
|
||||
}
|
||||
public @org.checkerframework.checker.builder.qual.ReturnsReceiver @java.lang.SuppressWarnings("all") B y(final @org.checkerframework.checker.builder.qual.NotCalledMethods("y") ParentBuilder this, final int y) {
|
||||
this.y = y;
|
||||
return self();
|
||||
}
|
||||
public @org.checkerframework.checker.builder.qual.ReturnsReceiver @java.lang.SuppressWarnings("all") B z(final @org.checkerframework.checker.builder.qual.NotCalledMethods("z") ParentBuilder this, final int z) {
|
||||
this.z = z;
|
||||
return self();
|
||||
}
|
||||
public @org.checkerframework.checker.builder.qual.ReturnsReceiver @java.lang.SuppressWarnings("all") B name(final String name) {
|
||||
if ((this.names == null))
|
||||
this.names = new java.util.ArrayList<String>();
|
||||
this.names.add(name);
|
||||
return self();
|
||||
}
|
||||
public @org.checkerframework.checker.builder.qual.ReturnsReceiver @java.lang.SuppressWarnings("all") B names(final java.util.Collection<? extends String> names) {
|
||||
if ((this.names == null))
|
||||
this.names = new java.util.ArrayList<String>();
|
||||
this.names.addAll(names);
|
||||
return self();
|
||||
}
|
||||
public @org.checkerframework.checker.builder.qual.ReturnsReceiver @java.lang.SuppressWarnings("all") B clearNames() {
|
||||
if ((this.names != null))
|
||||
this.names.clear();
|
||||
return self();
|
||||
}
|
||||
public @java.lang.Override @org.checkerframework.dataflow.qual.SideEffectFree @java.lang.SuppressWarnings("all") java.lang.String toString() {
|
||||
return (((((((("CheckerFrameworkSuperBuilder.Parent.ParentBuilder(x$value=" + this.x$value) + ", y=") + this.y) + ", z=") + this.z) + ", names=") + this.names) + ")");
|
||||
}
|
||||
}
|
||||
private static final @java.lang.SuppressWarnings("all") class ParentBuilderImpl extends ParentBuilder<Parent, ParentBuilderImpl> {
|
||||
private ParentBuilderImpl() {
|
||||
}
|
||||
protected @java.lang.Override @org.checkerframework.checker.builder.qual.ReturnsReceiver @org.checkerframework.dataflow.qual.SideEffectFree @java.lang.SuppressWarnings("all") ParentBuilderImpl self() {
|
||||
return this;
|
||||
}
|
||||
public @java.lang.Override @org.checkerframework.dataflow.qual.SideEffectFree @java.lang.SuppressWarnings("all") Parent build(final @org.checkerframework.checker.builder.qual.CalledMethods({"y", "z"}) ParentBuilderImpl this) {
|
||||
return new Parent(this);
|
||||
}
|
||||
}
|
||||
@lombok.Builder.Default int x;
|
||||
int y;
|
||||
int z;
|
||||
@Singular List<String> names;
|
||||
private static @java.lang.SuppressWarnings("all") int $default$x() {
|
||||
return 5;
|
||||
}
|
||||
protected @org.checkerframework.common.aliasing.qual.Unique @java.lang.SuppressWarnings("all") Parent(final ParentBuilder<?, ?> b) {
|
||||
super();
|
||||
if (b.x$set)
|
||||
this.x = b.x$value;
|
||||
else
|
||||
this.x = Parent.$default$x();
|
||||
this.y = b.y;
|
||||
this.z = b.z;
|
||||
java.util.List<String> names;
|
||||
switch (((b.names == null) ? 0 : b.names.size())) {
|
||||
case 0 :
|
||||
names = java.util.Collections.emptyList();
|
||||
break;
|
||||
case 1 :
|
||||
names = java.util.Collections.singletonList(b.names.get(0));
|
||||
break;
|
||||
default :
|
||||
names = java.util.Collections.unmodifiableList(new java.util.ArrayList<String>(b.names));
|
||||
}
|
||||
this.names = names;
|
||||
}
|
||||
public static @org.checkerframework.common.aliasing.qual.Unique @java.lang.SuppressWarnings("all") ParentBuilder<?, ?> builder() {
|
||||
return new ParentBuilderImpl();
|
||||
}
|
||||
}
|
||||
public static @lombok.experimental.SuperBuilder class Child extends Parent {
|
||||
public static abstract @java.lang.SuppressWarnings("all") class ChildBuilder<C extends Child, B extends ChildBuilder<C, B>> extends Parent.ParentBuilder<C, B> {
|
||||
private @java.lang.SuppressWarnings("all") int a$value;
|
||||
private @java.lang.SuppressWarnings("all") boolean a$set;
|
||||
private @java.lang.SuppressWarnings("all") int b;
|
||||
public ChildBuilder() {
|
||||
}
|
||||
protected abstract @java.lang.Override @org.checkerframework.checker.builder.qual.ReturnsReceiver @org.checkerframework.dataflow.qual.SideEffectFree @java.lang.SuppressWarnings("all") B self();
|
||||
protected abstract @java.lang.Override @org.checkerframework.dataflow.qual.SideEffectFree @java.lang.SuppressWarnings("all") C build(final @org.checkerframework.checker.builder.qual.CalledMethods("b") ChildBuilder this);
|
||||
public @org.checkerframework.checker.builder.qual.ReturnsReceiver @java.lang.SuppressWarnings("all") B a(final @org.checkerframework.checker.builder.qual.NotCalledMethods("a") ChildBuilder this, final int a) {
|
||||
this.a$value = a;
|
||||
a$set = true;
|
||||
return self();
|
||||
}
|
||||
public @org.checkerframework.checker.builder.qual.ReturnsReceiver @java.lang.SuppressWarnings("all") B b(final @org.checkerframework.checker.builder.qual.NotCalledMethods("b") ChildBuilder this, final int b) {
|
||||
this.b = b;
|
||||
return self();
|
||||
}
|
||||
public @java.lang.Override @org.checkerframework.dataflow.qual.SideEffectFree @java.lang.SuppressWarnings("all") java.lang.String toString() {
|
||||
return (((((("CheckerFrameworkSuperBuilder.Child.ChildBuilder(super=" + super.toString()) + ", a$value=") + this.a$value) + ", b=") + this.b) + ")");
|
||||
}
|
||||
}
|
||||
private static final @java.lang.SuppressWarnings("all") class ChildBuilderImpl extends ChildBuilder<Child, ChildBuilderImpl> {
|
||||
private ChildBuilderImpl() {
|
||||
}
|
||||
protected @java.lang.Override @org.checkerframework.checker.builder.qual.ReturnsReceiver @org.checkerframework.dataflow.qual.SideEffectFree @java.lang.SuppressWarnings("all") ChildBuilderImpl self() {
|
||||
return this;
|
||||
}
|
||||
public @java.lang.Override @org.checkerframework.dataflow.qual.SideEffectFree @java.lang.SuppressWarnings("all") Child build(final @org.checkerframework.checker.builder.qual.CalledMethods("b") ChildBuilderImpl this) {
|
||||
return new Child(this);
|
||||
}
|
||||
}
|
||||
@lombok.Builder.Default int a;
|
||||
int b;
|
||||
private static @java.lang.SuppressWarnings("all") int $default$a() {
|
||||
return 1;
|
||||
}
|
||||
protected @org.checkerframework.common.aliasing.qual.Unique @java.lang.SuppressWarnings("all") Child(final ChildBuilder<?, ?> b) {
|
||||
super(b);
|
||||
if (b.a$set)
|
||||
this.a = b.a$value;
|
||||
else
|
||||
this.a = Child.$default$a();
|
||||
this.b = b.b;
|
||||
}
|
||||
public static @org.checkerframework.common.aliasing.qual.Unique @java.lang.SuppressWarnings("all") ChildBuilder<?, ?> builder() {
|
||||
return new ChildBuilderImpl();
|
||||
}
|
||||
}
|
||||
CheckerFrameworkSuperBuilder() {
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
//CONF: checkerframework = 3.0
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
import lombok.experimental.Wither;
|
||||
|
||||
@Data @Accessors(chain = true)
|
||||
class CheckerFrameworkBasic {
|
||||
@Wither private final int x;
|
||||
private final int y;
|
||||
private int z;
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
//CONF: checkerframework = true
|
||||
import java.util.List;
|
||||
import lombok.Builder;
|
||||
import lombok.Singular;
|
||||
|
||||
@Builder
|
||||
class CheckerFrameworkBuilder {
|
||||
@Builder.Default int x = 5;
|
||||
int y;
|
||||
int z;
|
||||
@Singular List<String> names;
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
//CONF: checkerframework = true
|
||||
import java.util.List;
|
||||
import lombok.Singular;
|
||||
|
||||
class CheckerFrameworkSuperBuilder {
|
||||
@lombok.experimental.SuperBuilder
|
||||
public static class Parent {
|
||||
@lombok.Builder.Default int x = 5;
|
||||
int y;
|
||||
int z;
|
||||
@Singular List<String> names;
|
||||
}
|
||||
|
||||
@lombok.experimental.SuperBuilder
|
||||
public static class Child extends Parent {
|
||||
@lombok.Builder.Default int a = 1;
|
||||
int b;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
6 package org.checkerframework.common.aliasing.qual does not exist
|
||||
8 package org.checkerframework.dataflow.qual does not exist
|
||||
9 package org.checkerframework.dataflow.qual does not exist
|
||||
10 package org.checkerframework.dataflow.qual does not exist
|
||||
@@ -0,0 +1 @@
|
||||
6 package org.checkerframework.common.aliasing.qual does not exist
|
||||
@@ -0,0 +1,3 @@
|
||||
6 package org.checkerframework.dataflow.qual does not exist
|
||||
-1 package org.checkerframework.checker.builder.qual does not exist
|
||||
14 package org.checkerframework.dataflow.qual does not exist
|
||||
@@ -0,0 +1 @@
|
||||
8 org.checkerframework cannot be resolved to a type
|
||||
@@ -0,0 +1 @@
|
||||
6 org.checkerframework cannot be resolved to a type
|
||||
@@ -0,0 +1 @@
|
||||
6 org.checkerframework cannot be resolved to a type
|
||||
@@ -0,0 +1,10 @@
|
||||
5 package org.checkerframework.common.aliasing.qual does not exist
|
||||
11 package org.checkerframework.dataflow.qual does not exist
|
||||
16 package org.checkerframework.dataflow.qual does not exist
|
||||
21 package org.checkerframework.dataflow.qual does not exist
|
||||
26 package org.checkerframework.checker.builder.qual does not exist
|
||||
32 package org.checkerframework.dataflow.qual does not exist
|
||||
45 package org.checkerframework.dataflow.qual does not exist
|
||||
50 package org.checkerframework.dataflow.qual does not exist
|
||||
61 package org.checkerframework.dataflow.qual does not exist
|
||||
67 package org.checkerframework.dataflow.qual does not exist
|
||||
@@ -4,6 +4,7 @@ RewriteRule ^$ /main.html [L,END]
|
||||
RewriteRule ^(index|home)(\.html)?$ / [NC,R=301]
|
||||
|
||||
RewriteRule ^setup/overview$ /setup/main.html [L,END]
|
||||
RewriteRule ^setup/overview(\.html)?/?$ /setup/overview [NC,R=301]
|
||||
RewriteRule ^setup/main(\.html)?/?$ /setup/overview [NC,R=301]
|
||||
RewriteRule ^setup/index(\.html)?/?$ /setup/overview [NC,R=301]
|
||||
RewriteRule ^setup(/(overview/?)?)?$ /setup/overview [NC,R=301]
|
||||
|
||||
Reference in new issue
Block a user