mirror of
https://github.com/tiennm99/lombok.git
synced 2026-10-15 02:17:12 +00:00
singularizer's build code for any variable name (not only "this")
This commit is contained in:
1 parent
e79022226b
commit
e61561b5a5
9 files changed
+98
-64
No files matched your search
@@ -45,6 +45,8 @@ import org.eclipse.jdt.internal.compiler.ast.OperatorIds;
|
||||
import org.eclipse.jdt.internal.compiler.ast.ParameterizedQualifiedTypeReference;
|
||||
import org.eclipse.jdt.internal.compiler.ast.ParameterizedSingleTypeReference;
|
||||
import org.eclipse.jdt.internal.compiler.ast.QualifiedTypeReference;
|
||||
import org.eclipse.jdt.internal.compiler.ast.Reference;
|
||||
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.ThisReference;
|
||||
@@ -212,7 +214,7 @@ public class EclipseSingularsRecipes {
|
||||
|
||||
public abstract List<EclipseNode> generateFields(SingularData data, EclipseNode builderType);
|
||||
public abstract void generateMethods(SingularData data, EclipseNode builderType, boolean fluent, boolean chain);
|
||||
public abstract void appendBuildCode(SingularData data, EclipseNode builderType, List<Statement> statements, char[] targetVariableName);
|
||||
public abstract void appendBuildCode(SingularData data, EclipseNode builderType, List<Statement> statements, char[] targetVariableName, String builderVariable);
|
||||
|
||||
public boolean requiresCleaning() {
|
||||
try {
|
||||
@@ -302,17 +304,18 @@ public class EclipseSingularsRecipes {
|
||||
|
||||
private static final char[] SIZE_TEXT = new char[] {'s', 'i', 'z', 'e'};
|
||||
|
||||
/** Generates 'this.<em>name</em>.size()' as an expression; if nullGuard is true, it's this.name == null ? 0 : this.name.size(). */
|
||||
protected Expression getSize(EclipseNode builderType, char[] name, boolean nullGuard) {
|
||||
/** Generates 'this.<em>name</em>.size()' as an expression; if nullGuard is true, it's this.name == null ? 0 : this.name.size().
|
||||
* @param builderVariable */
|
||||
protected Expression getSize(EclipseNode builderType, char[] name, boolean nullGuard, String builderVariable) {
|
||||
MessageSend invoke = new MessageSend();
|
||||
ThisReference thisRef = new ThisReference(0, 0);
|
||||
Reference thisRef = getBuilderReference(builderVariable);
|
||||
FieldReference thisDotName = new FieldReference(name, 0L);
|
||||
thisDotName.receiver = thisRef;
|
||||
invoke.receiver = thisDotName;
|
||||
invoke.selector = SIZE_TEXT;
|
||||
if (!nullGuard) return invoke;
|
||||
|
||||
ThisReference cdnThisRef = new ThisReference(0, 0);
|
||||
Reference cdnThisRef = getBuilderReference(builderVariable);
|
||||
FieldReference cdnThisDotName = new FieldReference(name, 0L);
|
||||
cdnThisDotName.receiver = cdnThisRef;
|
||||
NullLiteral nullLiteral = new NullLiteral(0, 0);
|
||||
@@ -341,5 +344,16 @@ public class EclipseSingularsRecipes {
|
||||
|
||||
return new QualifiedTypeReference(TypeConstants.JAVA_LANG_OBJECT, NULL_POSS);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return a {@link SingleNameReference} to the builder in the variable <code>builderVariable</code>. If <code>builderVariable == "this"</code>, a {@link ThisReference} is returned.
|
||||
*/
|
||||
protected static Reference getBuilderReference(String builderVariable) {
|
||||
if ("this".equals(builderVariable)) {
|
||||
return new ThisReference(0, 0);
|
||||
} else {
|
||||
return new SingleNameReference(builderVariable.toCharArray(), 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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.ConstructorDeclaration;
|
||||
@@ -55,9 +56,11 @@ import org.eclipse.jdt.internal.compiler.ast.QualifiedNameReference;
|
||||
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;
|
||||
@@ -212,7 +215,7 @@ public class HandleBuilder extends EclipseAnnotationHandler<Builder> {
|
||||
|
||||
boolean callBuilderBasedSuperConstructor = inherit && td.superclass != null;
|
||||
if (extendable) {
|
||||
generateConstructor(tdParent, builderFields, annotationNode,
|
||||
generateBuilderBasedConstructor(tdParent, builderFields, annotationNode,
|
||||
builderClassName, callBuilderBasedSuperConstructor);
|
||||
} else {
|
||||
new HandleConstructor().generateConstructor(tdParent, AccessLevel.PACKAGE, allFields, false, null, SkipIfConstructorExists.I_AM_BUILDER,
|
||||
@@ -546,11 +549,12 @@ public class HandleBuilder extends EclipseAnnotationHandler<Builder> {
|
||||
* constructor with the builder as argument. Requires
|
||||
* {@code builderClassAsParameter != null}.
|
||||
*/
|
||||
private void generateConstructor(EclipseNode typeNode, List<BuilderFieldData> builderFields, EclipseNode sourceNode,
|
||||
private void generateBuilderBasedConstructor(EclipseNode typeNode, List<BuilderFieldData> builderFields, EclipseNode sourceNode,
|
||||
String builderClassnameAsParameter, boolean callBuilderBasedSuperConstructor) {
|
||||
|
||||
if (builderClassnameAsParameter == null || builderClassnameAsParameter.isEmpty()) {
|
||||
typeNode.addError("A builder-based constructor requires a non-empty 'builderClassnameAsParameter' value.");
|
||||
return;
|
||||
}
|
||||
|
||||
AccessLevel level = AccessLevel.PROTECTED;
|
||||
@@ -564,8 +568,6 @@ public class HandleBuilder extends EclipseAnnotationHandler<Builder> {
|
||||
level = AccessLevel.PRIVATE;
|
||||
}
|
||||
|
||||
// boolean suppressConstructorProperties = Boolean.TRUE.equals(typeNode.getAst().readConfiguration(ConfigurationKeys.ANY_CONSTRUCTOR_SUPPRESS_CONSTRUCTOR_PROPERTIES));
|
||||
|
||||
ConstructorDeclaration constructor = new ConstructorDeclaration(((CompilationUnitDeclaration) typeNode.top().get()).compilationResult);
|
||||
|
||||
constructor.modifiers = toEclipseModifier(level);
|
||||
@@ -585,7 +587,7 @@ public class HandleBuilder extends EclipseAnnotationHandler<Builder> {
|
||||
constructor.bodyEnd = constructor.declarationSourceEnd = constructor.sourceEnd = source.sourceEnd;
|
||||
constructor.arguments = null;
|
||||
|
||||
List<Statement> assigns = new ArrayList<Statement>();
|
||||
List<Statement> statements = new ArrayList<Statement>();
|
||||
List<Statement> nullChecks = new ArrayList<Statement>();
|
||||
|
||||
for (BuilderFieldData fieldNode : builderFields) {
|
||||
@@ -595,21 +597,18 @@ public class HandleBuilder extends EclipseAnnotationHandler<Builder> {
|
||||
int e = (int) p;
|
||||
thisX.receiver = new ThisReference(s, e);
|
||||
|
||||
if (fieldNode.singularData != null && fieldNode.singularData.getSingularizer() != null) {
|
||||
fieldNode.singularData.getSingularizer().appendBuildCode(fieldNode.singularData, typeNode, assigns, fieldNode.name);
|
||||
}
|
||||
|
||||
Expression assignmentExpr;
|
||||
if (builderClassnameAsParameter != null) {
|
||||
if (fieldNode.singularData != null && fieldNode.singularData.getSingularizer() != null) {
|
||||
fieldNode.singularData.getSingularizer().appendBuildCode(fieldNode.singularData, typeNode, statements, fieldNode.name, "b");
|
||||
assignmentExpr = new SingleNameReference(fieldNode.name, p);
|
||||
} else {
|
||||
char[][] variableInBuilder = new char[][] {"b".toCharArray(), fieldName};
|
||||
long[] positions = new long[] {p, p};
|
||||
assignmentExpr = new QualifiedNameReference(variableInBuilder, positions, s, e);
|
||||
} else {
|
||||
assignmentExpr = new SingleNameReference(fieldName, p);
|
||||
}
|
||||
|
||||
Assignment assignment = new Assignment(thisX, assignmentExpr, (int) p);
|
||||
assigns.add(assignment);
|
||||
statements.add(assignment);
|
||||
Annotation[] nonNulls = findAnnotations((FieldDeclaration)fieldNode.fieldNode.get(), NON_NULL_PATTERN);
|
||||
if (nonNulls.length != 0) {
|
||||
Statement nullCheck = generateNullCheck((FieldDeclaration)fieldNode.fieldNode.get(), sourceNode);
|
||||
@@ -619,15 +618,34 @@ public class HandleBuilder extends EclipseAnnotationHandler<Builder> {
|
||||
}
|
||||
}
|
||||
|
||||
nullChecks.addAll(assigns);
|
||||
nullChecks.addAll(statements);
|
||||
constructor.statements = nullChecks.isEmpty() ? null : nullChecks.toArray(new Statement[nullChecks.size()]);
|
||||
constructor.arguments = new Argument[] {new Argument("b".toCharArray(), p, new SingleTypeReference(builderClassnameAsParameter.toCharArray(), p), Modifier.FINAL)};
|
||||
|
||||
// Generate annotations that must be put on the generated method, and attach them.
|
||||
// Annotation[] constructorProperties = null;
|
||||
// if (!suppressConstructorProperties && level != AccessLevel.PRIVATE && level != AccessLevel.PACKAGE && !HandleConstructor.isLocalType(typeNode)) {
|
||||
// constructorProperties = HandleConstructor.createConstructorProperties(source, builderFields);
|
||||
// }
|
||||
boolean suppressConstructorProperties = Boolean.TRUE.equals(typeNode.getAst().readConfiguration(ConfigurationKeys.ANY_CONSTRUCTOR_SUPPRESS_CONSTRUCTOR_PROPERTIES));
|
||||
if (!suppressConstructorProperties) {
|
||||
// Add ConstructorProperties
|
||||
long[] poss = new long[3];
|
||||
Arrays.fill(poss, p);
|
||||
QualifiedTypeReference constructorPropertiesType = new QualifiedTypeReference(HandleConstructor.JAVA_BEANS_CONSTRUCTORPROPERTIES, poss);
|
||||
setGeneratedBy(constructorPropertiesType, source);
|
||||
SingleMemberAnnotation ann = new SingleMemberAnnotation(constructorPropertiesType, source.sourceStart);
|
||||
ann.declarationSourceEnd = source.sourceEnd;
|
||||
|
||||
ArrayInitializer fieldNames = new ArrayInitializer();
|
||||
fieldNames.sourceStart = source.sourceStart;
|
||||
fieldNames.sourceEnd = source.sourceEnd;
|
||||
fieldNames.expressions = new Expression[1];
|
||||
|
||||
fieldNames.expressions[0] = new StringLiteral("b".toCharArray(), source.sourceStart, source.sourceEnd, 0);
|
||||
setGeneratedBy(fieldNames.expressions[0], source);
|
||||
|
||||
ann.memberValue = fieldNames;
|
||||
setGeneratedBy(ann, source);
|
||||
setGeneratedBy(ann.memberValue, source);
|
||||
Annotation[] constructorProperties = new Annotation[] { ann };
|
||||
constructor.annotations = copyAnnotations(source, constructorProperties);
|
||||
}
|
||||
|
||||
constructor.traverse(new SetGeneratedByVisitor(source), typeDeclaration.scope);
|
||||
|
||||
@@ -681,7 +699,7 @@ public class HandleBuilder extends EclipseAnnotationHandler<Builder> {
|
||||
|
||||
for (BuilderFieldData bfd : builderFields) {
|
||||
if (bfd.singularData != null && bfd.singularData.getSingularizer() != null) {
|
||||
bfd.singularData.getSingularizer().appendBuildCode(bfd.singularData, type, statements, bfd.name);
|
||||
bfd.singularData.getSingularizer().appendBuildCode(bfd.singularData, type, statements, bfd.name, "this");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -258,7 +258,7 @@ public class HandleConstructor {
|
||||
}
|
||||
}
|
||||
|
||||
private static final char[][] JAVA_BEANS_CONSTRUCTORPROPERTIES = new char[][] { "java".toCharArray(), "beans".toCharArray(), "ConstructorProperties".toCharArray() };
|
||||
public static final char[][] JAVA_BEANS_CONSTRUCTORPROPERTIES = new char[][] { "java".toCharArray(), "beans".toCharArray(), "ConstructorProperties".toCharArray() };
|
||||
public static Annotation[] createConstructorProperties(ASTNode source, Collection<EclipseNode> fields) {
|
||||
if (fields.isEmpty()) return null;
|
||||
|
||||
|
||||
@@ -195,7 +195,7 @@ abstract class EclipseGuavaSingularizer extends EclipseSingularizer {
|
||||
injectMethod(builderType, md);
|
||||
}
|
||||
|
||||
@Override public void appendBuildCode(SingularData data, EclipseNode builderType, List<Statement> statements, char[] targetVariableName) {
|
||||
@Override public void appendBuildCode(SingularData data, EclipseNode builderType, List<Statement> statements, char[] targetVariableName, String builderVariable) {
|
||||
TypeReference varType = new QualifiedTypeReference(fromQualifiedName(data.getTargetFqn()), NULL_POSS);
|
||||
String simpleTypeName = getSimpleTargetTypeName(data);
|
||||
int agrumentsCount = getTypeArgumentsCount();
|
||||
@@ -214,14 +214,14 @@ abstract class EclipseGuavaSingularizer extends EclipseSingularizer {
|
||||
invokeBuild = new MessageSend();
|
||||
invokeBuild.selector = new char[] {'b', 'u', 'i', 'l', 'd'};
|
||||
FieldReference thisDotField = new FieldReference(data.getPluralName(), 0L);
|
||||
thisDotField.receiver = new ThisReference(0, 0);
|
||||
thisDotField.receiver = getBuilderReference(builderVariable);
|
||||
invokeBuild.receiver = thisDotField;
|
||||
}
|
||||
|
||||
Expression isNull; {
|
||||
//this.pluralName == null
|
||||
FieldReference thisDotField = new FieldReference(data.getPluralName(), 0L);
|
||||
thisDotField.receiver = new ThisReference(0, 0);
|
||||
thisDotField.receiver = getBuilderReference(builderVariable);
|
||||
isNull = new EqualExpression(thisDotField, new NullLiteral(0, 0), OperatorIds.EQUAL_EQUAL);
|
||||
}
|
||||
|
||||
|
||||
@@ -45,7 +45,6 @@ import org.eclipse.jdt.internal.compiler.ast.QualifiedTypeReference;
|
||||
import org.eclipse.jdt.internal.compiler.ast.SingleNameReference;
|
||||
import org.eclipse.jdt.internal.compiler.ast.Statement;
|
||||
import org.eclipse.jdt.internal.compiler.ast.SwitchStatement;
|
||||
import org.eclipse.jdt.internal.compiler.ast.ThisReference;
|
||||
import org.eclipse.jdt.internal.compiler.ast.TypeReference;
|
||||
import org.mangosdk.spi.ProviderFor;
|
||||
|
||||
@@ -56,9 +55,9 @@ public class EclipseJavaUtilListSingularizer extends EclipseJavaUtilListSetSingu
|
||||
return LombokImmutableList.of("java.util.List", "java.util.Collection", "java.lang.Iterable");
|
||||
}
|
||||
|
||||
@Override public void appendBuildCode(SingularData data, EclipseNode builderType, List<Statement> statements, char[] targetVariableName) {
|
||||
@Override public void appendBuildCode(SingularData data, EclipseNode builderType, List<Statement> statements, char[] targetVariableName, String builderVariable) {
|
||||
if (useGuavaInstead(builderType)) {
|
||||
guavaListSetSingularizer.appendBuildCode(data, builderType, statements, targetVariableName);
|
||||
guavaListSetSingularizer.appendBuildCode(data, builderType, statements, targetVariableName, builderVariable);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -76,7 +75,7 @@ public class EclipseJavaUtilListSingularizer extends EclipseJavaUtilListSetSingu
|
||||
/* case 1: (singleton) break; */ {
|
||||
switchContents.add(new CaseStatement(makeIntLiteral(new char[] {'1'}, null), 0, 0));
|
||||
FieldReference thisDotField = new FieldReference(data.getPluralName(), 0L);
|
||||
thisDotField.receiver = new ThisReference(0, 0);
|
||||
thisDotField.receiver = getBuilderReference(builderVariable);
|
||||
MessageSend thisDotFieldGet0 = new MessageSend();
|
||||
thisDotFieldGet0.receiver = thisDotField;
|
||||
thisDotFieldGet0.selector = new char[] {'g', 'e', 't'};
|
||||
@@ -97,7 +96,7 @@ public class EclipseJavaUtilListSingularizer extends EclipseJavaUtilListSetSingu
|
||||
Expression argToUnmodifiable;
|
||||
/* new j.u.ArrayList<Generics>(this.pluralName); */ {
|
||||
FieldReference thisDotPluralName = new FieldReference(data.getPluralName(), 0L);
|
||||
thisDotPluralName.receiver = new ThisReference(0, 0);
|
||||
thisDotPluralName.receiver = getBuilderReference(builderVariable);
|
||||
TypeReference targetTypeExpr = new QualifiedTypeReference(JAVA_UTIL_ARRAYLIST, NULL_POSS);
|
||||
targetTypeExpr = addTypeArgs(1, false, builderType, targetTypeExpr, data.getTypeArgs());
|
||||
AllocationExpression constructorCall = new AllocationExpression();
|
||||
@@ -117,7 +116,7 @@ public class EclipseJavaUtilListSingularizer extends EclipseJavaUtilListSetSingu
|
||||
|
||||
SwitchStatement switchStat = new SwitchStatement();
|
||||
switchStat.statements = switchContents.toArray(new Statement[switchContents.size()]);
|
||||
switchStat.expression = getSize(builderType, data.getPluralName(), true);
|
||||
switchStat.expression = getSize(builderType, data.getPluralName(), true, builderVariable);
|
||||
|
||||
TypeReference localShadowerType = new QualifiedTypeReference(Eclipse.fromQualifiedName(data.getTargetFqn()), NULL_POSS);
|
||||
localShadowerType = addTypeArgs(1, false, builderType, localShadowerType, data.getTypeArgs());
|
||||
|
||||
@@ -293,16 +293,16 @@ public class EclipseJavaUtilMapSingularizer extends EclipseJavaUtilSingularizer
|
||||
injectMethod(builderType, md);
|
||||
}
|
||||
|
||||
@Override public void appendBuildCode(SingularData data, EclipseNode builderType, List<Statement> statements, char[] targetVariableName) {
|
||||
@Override public void appendBuildCode(SingularData data, EclipseNode builderType, List<Statement> statements, char[] targetVariableName, String builderVariable) {
|
||||
if (useGuavaInstead(builderType)) {
|
||||
guavaMapSingularizer.appendBuildCode(data, builderType, statements, targetVariableName);
|
||||
guavaMapSingularizer.appendBuildCode(data, builderType, statements, targetVariableName, builderVariable);
|
||||
return;
|
||||
}
|
||||
|
||||
if (data.getTargetFqn().equals("java.util.Map")) {
|
||||
statements.addAll(createJavaUtilSetMapInitialCapacitySwitchStatements(data, builderType, true, "emptyMap", "singletonMap", "LinkedHashMap"));
|
||||
statements.addAll(createJavaUtilSetMapInitialCapacitySwitchStatements(data, builderType, true, "emptyMap", "singletonMap", "LinkedHashMap", builderVariable));
|
||||
} else {
|
||||
statements.addAll(createJavaUtilSimpleCreationAndFillStatements(data, builderType, true, true, false, true, "TreeMap"));
|
||||
statements.addAll(createJavaUtilSimpleCreationAndFillStatements(data, builderType, true, true, false, true, "TreeMap", builderVariable));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -37,16 +37,16 @@ public class EclipseJavaUtilSetSingularizer extends EclipseJavaUtilListSetSingul
|
||||
return LombokImmutableList.of("java.util.Set", "java.util.SortedSet", "java.util.NavigableSet");
|
||||
}
|
||||
|
||||
@Override public void appendBuildCode(SingularData data, EclipseNode builderType, List<Statement> statements, char[] targetVariableName) {
|
||||
@Override public void appendBuildCode(SingularData data, EclipseNode builderType, List<Statement> statements, char[] targetVariableName, String builderVariable) {
|
||||
if (useGuavaInstead(builderType)) {
|
||||
guavaListSetSingularizer.appendBuildCode(data, builderType, statements, targetVariableName);
|
||||
guavaListSetSingularizer.appendBuildCode(data, builderType, statements, targetVariableName, builderVariable);
|
||||
return;
|
||||
}
|
||||
|
||||
if (data.getTargetFqn().equals("java.util.Set")) {
|
||||
statements.addAll(createJavaUtilSetMapInitialCapacitySwitchStatements(data, builderType, false, "emptySet", "singleton", "LinkedHashSet"));
|
||||
statements.addAll(createJavaUtilSetMapInitialCapacitySwitchStatements(data, builderType, false, "emptySet", "singleton", "LinkedHashSet", builderVariable));
|
||||
} else {
|
||||
statements.addAll(createJavaUtilSimpleCreationAndFillStatements(data, builderType, false, true, false, true, "TreeSet"));
|
||||
statements.addAll(createJavaUtilSimpleCreationAndFillStatements(data, builderType, false, true, false, true, "TreeSet", builderVariable));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -90,7 +90,7 @@ abstract class EclipseJavaUtilSingularizer extends EclipseSingularizer {
|
||||
return Boolean.TRUE.equals(node.getAst().readConfiguration(ConfigurationKeys.SINGULAR_USE_GUAVA));
|
||||
}
|
||||
|
||||
protected List<Statement> createJavaUtilSetMapInitialCapacitySwitchStatements(SingularData data, EclipseNode builderType, boolean mapMode, String emptyCollectionMethod, String singletonCollectionMethod, String targetType) {
|
||||
protected List<Statement> createJavaUtilSetMapInitialCapacitySwitchStatements(SingularData data, EclipseNode builderType, boolean mapMode, String emptyCollectionMethod, String singletonCollectionMethod, String targetType, String builderVariable) {
|
||||
List<Statement> switchContents = new ArrayList<Statement>();
|
||||
char[] keyName = mapMode ? (new String(data.getPluralName()) + "$key").toCharArray() : data.getPluralName();
|
||||
|
||||
@@ -112,7 +112,7 @@ abstract class EclipseJavaUtilSingularizer extends EclipseSingularizer {
|
||||
/* !mapMode: pluralName = java.util.Collections.singletonCollectionMethod(this.pluralName.get(0));
|
||||
mapMode: pluralName = java.util.Collections.singletonCollectionMethod(this.pluralName$key.get(0), this.pluralName$value.get(0)); */ {
|
||||
FieldReference thisDotKey = new FieldReference(keyName, 0L);
|
||||
thisDotKey.receiver = new ThisReference(0, 0);
|
||||
thisDotKey.receiver = getBuilderReference(builderVariable);
|
||||
MessageSend thisDotKeyGet0 = new MessageSend();
|
||||
thisDotKeyGet0.receiver = thisDotKey;
|
||||
thisDotKeyGet0.selector = new char[] {'g', 'e', 't'};
|
||||
@@ -122,7 +122,7 @@ abstract class EclipseJavaUtilSingularizer extends EclipseSingularizer {
|
||||
if (mapMode) {
|
||||
char[] valueName = (new String(data.getPluralName()) + "$value").toCharArray();
|
||||
FieldReference thisDotValue = new FieldReference(valueName, 0L);
|
||||
thisDotValue.receiver = new ThisReference(0, 0);
|
||||
thisDotValue.receiver = getBuilderReference(builderVariable);
|
||||
MessageSend thisDotValueGet0 = new MessageSend();
|
||||
thisDotValueGet0.receiver = thisDotValue;
|
||||
thisDotValueGet0.selector = new char[] {'g', 'e', 't'};
|
||||
@@ -143,12 +143,12 @@ abstract class EclipseJavaUtilSingularizer extends EclipseSingularizer {
|
||||
|
||||
{ // default:
|
||||
switchContents.add(new CaseStatement(null, 0, 0));
|
||||
switchContents.addAll(createJavaUtilSimpleCreationAndFillStatements(data, builderType, mapMode, false, true, emptyCollectionMethod == null, targetType));
|
||||
switchContents.addAll(createJavaUtilSimpleCreationAndFillStatements(data, builderType, mapMode, false, true, emptyCollectionMethod == null, targetType, builderVariable));
|
||||
}
|
||||
|
||||
SwitchStatement switchStat = new SwitchStatement();
|
||||
switchStat.statements = switchContents.toArray(new Statement[switchContents.size()]);
|
||||
switchStat.expression = getSize(builderType, keyName, true);
|
||||
switchStat.expression = getSize(builderType, keyName, true, builderVariable);
|
||||
|
||||
TypeReference localShadowerType = new QualifiedTypeReference(fromQualifiedName(data.getTargetFqn()), NULL_POSS);
|
||||
localShadowerType = addTypeArgs(mapMode ? 2 : 1, false, builderType, localShadowerType, data.getTypeArgs());
|
||||
@@ -157,7 +157,7 @@ abstract class EclipseJavaUtilSingularizer extends EclipseSingularizer {
|
||||
return Arrays.asList(varDefStat, switchStat);
|
||||
}
|
||||
|
||||
protected List<Statement> createJavaUtilSimpleCreationAndFillStatements(SingularData data, EclipseNode builderType, boolean mapMode, boolean defineVar, boolean addInitialCapacityArg, boolean nullGuard, String targetType) {
|
||||
protected List<Statement> createJavaUtilSimpleCreationAndFillStatements(SingularData data, EclipseNode builderType, boolean mapMode, boolean defineVar, boolean addInitialCapacityArg, boolean nullGuard, String targetType, String builderVariable) {
|
||||
char[] varName = mapMode ? (new String(data.getPluralName()) + "$key").toCharArray() : data.getPluralName();
|
||||
|
||||
Statement createStat; {
|
||||
@@ -166,11 +166,11 @@ abstract class EclipseJavaUtilSingularizer extends EclipseSingularizer {
|
||||
if (addInitialCapacityArg) {
|
||||
// this.varName.size() < MAX_POWER_OF_2 ? 1 + this.varName.size() + (this.varName.size() - 3) / 3 : Integer.MAX_VALUE;
|
||||
// lessThanCutOff = this.varName.size() < MAX_POWER_OF_2
|
||||
Expression lessThanCutoff = new BinaryExpression(getSize(builderType, varName, nullGuard), makeIntLiteral("0x40000000".toCharArray(), null), OperatorIds.LESS);
|
||||
Expression lessThanCutoff = new BinaryExpression(getSize(builderType, varName, nullGuard, builderVariable), makeIntLiteral("0x40000000".toCharArray(), null), OperatorIds.LESS);
|
||||
FieldReference integerMaxValue = new FieldReference("MAX_VALUE".toCharArray(), 0L);
|
||||
integerMaxValue.receiver = new QualifiedNameReference(TypeConstants.JAVA_LANG_INTEGER, NULL_POSS, 0, 0);
|
||||
Expression sizeFormulaLeft = new BinaryExpression(makeIntLiteral(new char[] {'1'}, null), getSize(builderType, varName, nullGuard), OperatorIds.PLUS);
|
||||
Expression sizeFormulaRightLeft = new BinaryExpression(getSize(builderType, varName, nullGuard), makeIntLiteral(new char[] {'3'}, null), OperatorIds.MINUS);
|
||||
Expression sizeFormulaLeft = new BinaryExpression(makeIntLiteral(new char[] {'1'}, null), getSize(builderType, varName, nullGuard, builderVariable), OperatorIds.PLUS);
|
||||
Expression sizeFormulaRightLeft = new BinaryExpression(getSize(builderType, varName, nullGuard, builderVariable), makeIntLiteral(new char[] {'3'}, null), OperatorIds.MINUS);
|
||||
Expression sizeFormulaRight = new BinaryExpression(sizeFormulaRightLeft, makeIntLiteral(new char[] {'3'}, null), OperatorIds.DIVIDE);
|
||||
Expression sizeFormula = new BinaryExpression(sizeFormulaLeft, sizeFormulaRight, OperatorIds.PLUS);
|
||||
Expression cond = new ConditionalExpression(lessThanCutoff, sizeFormula, integerMaxValue);
|
||||
@@ -203,9 +203,9 @@ abstract class EclipseJavaUtilSingularizer extends EclipseSingularizer {
|
||||
pluralnameDotPut.selector = new char[] {'p', 'u', 't'};
|
||||
pluralnameDotPut.receiver = new SingleNameReference(data.getPluralName(), 0L);
|
||||
FieldReference thisDotKey = new FieldReference(varName, 0L);
|
||||
thisDotKey.receiver = new ThisReference(0, 0);
|
||||
thisDotKey.receiver = getBuilderReference(builderVariable);
|
||||
FieldReference thisDotValue = new FieldReference((new String(data.getPluralName()) + "$value").toCharArray(), 0L);
|
||||
thisDotValue.receiver = new ThisReference(0, 0);
|
||||
thisDotValue.receiver = getBuilderReference(builderVariable);
|
||||
MessageSend keyArg = new MessageSend();
|
||||
keyArg.receiver = thisDotKey;
|
||||
keyArg.arguments = new Expression[] {new SingleNameReference(iVar, 0L)};
|
||||
@@ -219,7 +219,7 @@ abstract class EclipseJavaUtilSingularizer extends EclipseSingularizer {
|
||||
LocalDeclaration forInit = new LocalDeclaration(iVar, 0, 0);
|
||||
forInit.type = TypeReference.baseTypeReference(TypeIds.T_int, 0);
|
||||
forInit.initialization = makeIntLiteral(new char[] {'0'}, null);
|
||||
Expression checkExpr = new BinaryExpression(new SingleNameReference(iVar, 0L), getSize(builderType, varName, nullGuard), OperatorIds.LESS);
|
||||
Expression checkExpr = new BinaryExpression(new SingleNameReference(iVar, 0L), getSize(builderType, varName, nullGuard, builderVariable), OperatorIds.LESS);
|
||||
Expression incrementExpr = new PostfixExpression(new SingleNameReference(iVar, 0L), IntLiteral.One, OperatorIds.PLUS, 0);
|
||||
fillStat = new ForStatement(new Statement[] {forInit}, checkExpr, new Statement[] {incrementExpr}, pluralnameDotPut, true, 0, 0);
|
||||
} else {
|
||||
@@ -228,14 +228,14 @@ abstract class EclipseJavaUtilSingularizer extends EclipseSingularizer {
|
||||
pluralnameDotAddAll.selector = new char[] {'a', 'd', 'd', 'A', 'l', 'l'};
|
||||
pluralnameDotAddAll.receiver = new SingleNameReference(data.getPluralName(), 0L);
|
||||
FieldReference thisDotPluralname = new FieldReference(varName, 0L);
|
||||
thisDotPluralname.receiver = new ThisReference(0, 0);
|
||||
thisDotPluralname.receiver = getBuilderReference(builderVariable);
|
||||
pluralnameDotAddAll.arguments = new Expression[] {thisDotPluralname};
|
||||
fillStat = pluralnameDotAddAll;
|
||||
}
|
||||
|
||||
if (nullGuard) {
|
||||
FieldReference thisDotField = new FieldReference(varName, 0L);
|
||||
thisDotField.receiver = new ThisReference(0, 0);
|
||||
thisDotField.receiver = getBuilderReference(builderVariable);
|
||||
Expression cond = new EqualExpression(thisDotField, new NullLiteral(0, 0), OperatorIds.NOT_EQUAL);
|
||||
fillStat = new IfStatement(cond, fillStat, 0, 0);
|
||||
}
|
||||
|
||||
@@ -562,13 +562,16 @@ public class HandleBuilder extends JavacAnnotationHandler<Builder> {
|
||||
|
||||
JCModifiers mods = maker.Modifiers(toJavacModifier(level), List.<JCAnnotation>nil());
|
||||
|
||||
// Add ConstructorProperties
|
||||
JCExpression constructorPropertiesType = chainDots(typeNode, "java", "beans", "ConstructorProperties");
|
||||
ListBuffer<JCExpression> fieldNames = new ListBuffer<JCExpression>();
|
||||
fieldNames.append(maker.Literal(builderVariableName.toString()));
|
||||
JCExpression fieldNamesArray = maker.NewArray(null, List.<JCExpression>nil(), fieldNames.toList());
|
||||
JCAnnotation annotation = maker.Annotation(constructorPropertiesType, List.of(fieldNamesArray));
|
||||
mods.annotations = mods.annotations.append(annotation);
|
||||
boolean suppressConstructorProperties = Boolean.TRUE.equals(typeNode.getAst().readConfiguration(ConfigurationKeys.ANY_CONSTRUCTOR_SUPPRESS_CONSTRUCTOR_PROPERTIES));
|
||||
if (!suppressConstructorProperties) {
|
||||
// Add ConstructorProperties
|
||||
JCExpression constructorPropertiesType = chainDots(typeNode, "java", "beans", "ConstructorProperties");
|
||||
ListBuffer<JCExpression> fieldNames = new ListBuffer<JCExpression>();
|
||||
fieldNames.append(maker.Literal(builderVariableName.toString()));
|
||||
JCExpression fieldNamesArray = maker.NewArray(null, List.<JCExpression>nil(), fieldNames.toList());
|
||||
JCAnnotation annotation = maker.Annotation(constructorPropertiesType, List.of(fieldNamesArray));
|
||||
mods.annotations = mods.annotations.append(annotation);
|
||||
}
|
||||
|
||||
// Create a constructor that has just the builder as parameter.
|
||||
ListBuffer<JCVariableDecl> params = new ListBuffer<JCVariableDecl>();
|
||||
|
||||
Reference in new issue
Block a user