aboutsummaryrefslogtreecommitdiff
path: root/src/core/lombok/javac/handlers/singulars
diff options
context:
space:
mode:
authorReinier Zwitserloot <reinier@zwitserloot.com>2015-11-17 00:01:29 +0100
committerReinier Zwitserloot <reinier@zwitserloot.com>2015-11-17 00:01:29 +0100
commit6a003350f61bbebc3a20d8b17b59df6d065ca648 (patch)
tree8edcdb4fe1fd2b537e725048f8621d0569238ebd /src/core/lombok/javac/handlers/singulars
parent329202a37f1c4325117fe83eaf22368088254b60 (diff)
parent22e1fb91d4699a0bacafcd9f74fdca6acd8b275b (diff)
downloadlombok-6a003350f61bbebc3a20d8b17b59df6d065ca648.tar.gz
lombok-6a003350f61bbebc3a20d8b17b59df6d065ca648.tar.bz2
lombok-6a003350f61bbebc3a20d8b17b59df6d065ca648.zip
Merge branch 'master' of https://github.com/spacanowski/lombok into spacanowski-master
Conflicts: test/transform/resource/after-delombok/BuilderSingularGuavaListsSets.java test/transform/resource/after-ecj/BuilderSingularGuavaListsSets.java
Diffstat (limited to 'src/core/lombok/javac/handlers/singulars')
-rw-r--r--src/core/lombok/javac/handlers/singulars/JavacGuavaSetListSingularizer.java22
-rw-r--r--src/core/lombok/javac/handlers/singulars/JavacGuavaSingularizer.java103
2 files changed, 78 insertions, 47 deletions
diff --git a/src/core/lombok/javac/handlers/singulars/JavacGuavaSetListSingularizer.java b/src/core/lombok/javac/handlers/singulars/JavacGuavaSetListSingularizer.java
index 2e404ca8..fe8e8dc0 100644
--- a/src/core/lombok/javac/handlers/singulars/JavacGuavaSetListSingularizer.java
+++ b/src/core/lombok/javac/handlers/singulars/JavacGuavaSetListSingularizer.java
@@ -1,16 +1,16 @@
/*
* Copyright (C) 2015 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
@@ -21,24 +21,24 @@
*/
package lombok.javac.handlers.singulars;
+import org.mangosdk.spi.ProviderFor;
+
import lombok.core.LombokImmutableList;
import lombok.javac.handlers.JavacSingularsRecipes.JavacSingularizer;
-import org.mangosdk.spi.ProviderFor;
-
@ProviderFor(JavacSingularizer.class)
public class JavacGuavaSetListSingularizer extends JavacGuavaSingularizer {
- // TODO com.google.common.collect.ImmutableTable
// TODO com.google.common.collect.ImmutableRangeSet
// TODO com.google.common.collect.ImmutableMultiset and com.google.common.collect.ImmutableSortedMultiset
@Override public LombokImmutableList<String> getSupportedTypes() {
return LombokImmutableList.of(
- "com.google.common.collect.ImmutableCollection",
- "com.google.common.collect.ImmutableList",
- "com.google.common.collect.ImmutableSet",
- "com.google.common.collect.ImmutableSortedSet");
+ "com.google.common.collect.ImmutableCollection",
+ "com.google.common.collect.ImmutableList",
+ "com.google.common.collect.ImmutableSet",
+ "com.google.common.collect.ImmutableSortedSet",
+ "com.google.common.collect.ImmutableTable");
}
-
+
@Override protected boolean isMap() {
return false;
}
diff --git a/src/core/lombok/javac/handlers/singulars/JavacGuavaSingularizer.java b/src/core/lombok/javac/handlers/singulars/JavacGuavaSingularizer.java
index 97e5f9be..ba661eff 100644
--- a/src/core/lombok/javac/handlers/singulars/JavacGuavaSingularizer.java
+++ b/src/core/lombok/javac/handlers/singulars/JavacGuavaSingularizer.java
@@ -1,16 +1,16 @@
/*
* Copyright (C) 2015 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
@@ -51,30 +51,31 @@ abstract class JavacGuavaSingularizer extends JavacSingularizer {
protected String getSimpleTargetTypeName(SingularData data) {
return GuavaTypeMap.getGuavaTypeName(data.getTargetFqn());
}
-
+
protected String getBuilderMethodName(SingularData data) {
String simpleTypeName = getSimpleTargetTypeName(data);
if ("ImmutableSortedSet".equals(simpleTypeName) || "ImmutableSortedMap".equals(simpleTypeName)) return "naturalOrder";
return "builder";
}
-
+
protected abstract boolean isMap();
-
+
@Override public java.util.List<JavacNode> generateFields(SingularData data, JavacNode builderType, JCTree source) {
JavacTreeMaker maker = builderType.getTreeMaker();
- JCExpression type = JavacHandlerUtil.chainDots(builderType, "com", "google", "common", "collect", getSimpleTargetTypeName(data), "Builder");
- type = addTypeArgs(isMap() ? 2 : 1, false, builderType, type, data.getTypeArgs(), source);
-
+ String simpleTypeName = getSimpleTargetTypeName(data);
+ JCExpression type = JavacHandlerUtil.chainDots(builderType, "com", "google", "common", "collect", simpleTypeName, "Builder");
+ type = addTypeArgs(getTypeArgumentsCount(isMap(), simpleTypeName), false, builderType, type, data.getTypeArgs(), source);
+
JCVariableDecl buildField = maker.VarDef(maker.Modifiers(Flags.PRIVATE), data.getPluralName(), type, null);
return Collections.singletonList(injectFieldAndMarkGenerated(builderType, buildField));
}
-
+
@Override public void generateMethods(SingularData data, JavacNode builderType, JCTree source, boolean fluent, boolean chain) {
JavacTreeMaker maker = builderType.getTreeMaker();
JCExpression returnType = chain ? cloneSelfType(builderType) : maker.Type(createVoidType(maker, CTC_VOID));
JCStatement returnStatement = chain ? maker.Return(maker.Ident(builderType.toName("this"))) : null;
generateSingularMethod(maker, returnType, returnStatement, data, builderType, source, fluent);
-
+
returnType = chain ? cloneSelfType(builderType) : maker.Type(createVoidType(maker, CTC_VOID));
returnStatement = chain ? maker.Return(maker.Ident(builderType.toName("this"))) : null;
generatePluralMethod(maker, returnType, returnStatement, data, builderType, source, fluent);
@@ -99,19 +100,19 @@ abstract class JavacGuavaSingularizer extends JavacSingularizer {
JCMethodDecl method = maker.MethodDef(mods, methodName, returnType, typeParams, params, thrown, body, null);
injectMethod(builderType, method);
}
-
+
void generateSingularMethod(JavacTreeMaker maker, JCExpression returnType, JCStatement returnStatement, SingularData data, JavacNode builderType, JCTree source, boolean fluent) {
List<JCTypeParameter> typeParams = List.nil();
List<JCExpression> thrown = List.nil();
boolean mapMode = isMap();
-
+
Name keyName = !mapMode ? data.getSingularName() : builderType.toName(data.getSingularName() + "$key");
Name valueName = !mapMode ? null : builderType.toName(data.getSingularName() + "$value");
-
+
JCModifiers mods = maker.Modifiers(Flags.PUBLIC);
ListBuffer<JCStatement> statements = new ListBuffer<JCStatement>();
statements.append(createConstructBuilderVarIfNeeded(maker, data, builderType, mapMode, source));
- JCExpression thisDotFieldDotAdd = chainDots(builderType, "this", data.getPluralName().toString(), mapMode ? "put" : "add");
+ JCExpression thisDotFieldDotAdd = chainDots(builderType, "this", data.getPluralName().toString(), shouldUsePut(data, mapMode) ? "put" : "add");
List<JCExpression> invokeAddExpr;
if (mapMode) {
invokeAddExpr = List.<JCExpression>of(maker.Ident(keyName), maker.Ident(valueName));
@@ -124,7 +125,7 @@ abstract class JavacGuavaSingularizer extends JavacSingularizer {
JCBlock body = maker.Block(0, statements.toList());
Name methodName = data.getSingularName();
long paramFlags = JavacHandlerUtil.addFinalIfNeeded(Flags.PARAMETER, builderType.getContext());
- if (!fluent) methodName = builderType.toName(HandlerUtil.buildAccessorName(mapMode ? "put" : "add", methodName.toString()));
+ if (!fluent) methodName = builderType.toName(HandlerUtil.buildAccessorName(shouldUsePut(data, mapMode) ? "put" : "add", methodName.toString()));
List<JCVariableDecl> params;
if (mapMode) {
JCExpression keyType = cloneParamType(0, maker, data.getTypeArgs(), builderType, source);
@@ -133,82 +134,112 @@ abstract class JavacGuavaSingularizer extends JavacSingularizer {
JCVariableDecl paramValue = maker.VarDef(maker.Modifiers(paramFlags), valueName, valueType, null);
params = List.of(paramKey, paramValue);
} else {
- JCExpression paramType = cloneParamType(0, maker, data.getTypeArgs(), builderType, source);
+ final JCExpression paramType;
+
+ if (isSpecialTypeOfListSet(data)) {
+ JCExpression cellType = JavacHandlerUtil.chainDots(builderType, "com", "google", "common", "collect", "Table", "Cell");
+ paramType = addTypeArgs(3, false, builderType, cellType, data.getTypeArgs(), source);
+ } else {
+ paramType = cloneParamType(0, maker, data.getTypeArgs(), builderType, source);
+ }
params = List.of(maker.VarDef(maker.Modifiers(paramFlags), data.getSingularName(), paramType, null));
}
JCMethodDecl method = maker.MethodDef(mods, methodName, returnType, typeParams, params, thrown, body, null);
injectMethod(builderType, method);
}
-
+
protected void generatePluralMethod(JavacTreeMaker maker, JCExpression returnType, JCStatement returnStatement, SingularData data, JavacNode builderType, JCTree source, boolean fluent) {
List<JCTypeParameter> typeParams = List.nil();
List<JCExpression> thrown = List.nil();
boolean mapMode = isMap();
-
+
JCModifiers mods = maker.Modifiers(Flags.PUBLIC);
ListBuffer<JCStatement> statements = new ListBuffer<JCStatement>();
statements.append(createConstructBuilderVarIfNeeded(maker, data, builderType, mapMode, source));
- JCExpression thisDotFieldDotAddAll = chainDots(builderType, "this", data.getPluralName().toString(), mapMode ? "putAll" : "addAll");
+ JCExpression thisDotFieldDotAddAll = chainDots(builderType, "this", data.getPluralName().toString(), shouldUsePut(data, mapMode) ? "putAll" : "addAll");
JCExpression invokeAddAll = maker.Apply(List.<JCExpression>nil(), thisDotFieldDotAddAll, List.<JCExpression>of(maker.Ident(data.getPluralName())));
statements.append(maker.Exec(invokeAddAll));
if (returnStatement != null) statements.append(returnStatement);
JCBlock body = maker.Block(0, statements.toList());
Name methodName = data.getPluralName();
long paramFlags = JavacHandlerUtil.addFinalIfNeeded(Flags.PARAMETER, builderType.getContext());
- if (!fluent) methodName = builderType.toName(HandlerUtil.buildAccessorName(mapMode ? "putAll" : "addAll", methodName.toString()));
+ if (!fluent) methodName = builderType.toName(HandlerUtil.buildAccessorName(shouldUsePut(data, mapMode) ? "putAll" : "addAll", methodName.toString()));
JCExpression paramType;
if (mapMode) {
paramType = chainDots(builderType, "java", "util", "Map");
} else {
- paramType = genJavaLangTypeRef(builderType, "Iterable");
+ if (isSpecialTypeOfListSet(data)) {
+ paramType = chainDots(builderType, "com", "google", "common", "collect", "Table");
+ } else {
+ paramType = genJavaLangTypeRef(builderType, "Iterable");
+ }
}
- paramType = addTypeArgs(mapMode ? 2 : 1, true, builderType, paramType, data.getTypeArgs(), source);
+ String simpleTypeName = getSimpleTargetTypeName(data);
+ paramType = addTypeArgs(getTypeArgumentsCount(mapMode, simpleTypeName), true, builderType, paramType, data.getTypeArgs(), source);
JCVariableDecl param = maker.VarDef(maker.Modifiers(paramFlags), data.getPluralName(), paramType, null);
JCMethodDecl method = maker.MethodDef(mods, methodName, returnType, typeParams, List.of(param), thrown, body, null);
injectMethod(builderType, method);
}
-
+
@Override public void appendBuildCode(SingularData data, JavacNode builderType, JCTree source, ListBuffer<JCStatement> statements, Name targetVariableName) {
JavacTreeMaker maker = builderType.getTreeMaker();
List<JCExpression> jceBlank = List.nil();
boolean mapMode = isMap();
-
+
+ String simpleTypeName = getSimpleTargetTypeName(data);
JCExpression varType = chainDotsString(builderType, data.getTargetFqn());
- varType = addTypeArgs(mapMode ? 2 : 1, false, builderType, varType, data.getTypeArgs(), source);
-
+ int agrumentsCount = getTypeArgumentsCount(mapMode, simpleTypeName);
+ varType = addTypeArgs(agrumentsCount, false, builderType, varType, data.getTypeArgs(), source);
+
JCExpression empty; {
//ImmutableX.of()
JCExpression emptyMethod = chainDots(builderType, "com", "google", "common", "collect", getSimpleTargetTypeName(data), "of");
- List<JCExpression> invokeTypeArgs = createTypeArgs(mapMode ? 2 : 1, false, builderType, data.getTypeArgs(), source);
+ List<JCExpression> invokeTypeArgs = createTypeArgs(agrumentsCount, false, builderType, data.getTypeArgs(), source);
empty = maker.Apply(invokeTypeArgs, emptyMethod, jceBlank);
}
-
+
JCExpression invokeBuild; {
//this.pluralName.build();
invokeBuild = maker.Apply(jceBlank, chainDots(builderType, "this", data.getPluralName().toString(), "build"), jceBlank);
}
-
+
JCExpression isNull; {
//this.pluralName == null
isNull = maker.Binary(CTC_EQUAL, maker.Select(maker.Ident(builderType.toName("this")), data.getPluralName()), maker.Literal(CTC_BOT, null));
}
-
+
JCExpression init = maker.Conditional(isNull, empty, invokeBuild); // this.pluralName == null ? ImmutableX.of() : this.pluralName.build()
-
+
JCStatement jcs = maker.VarDef(maker.Modifiers(0), data.getPluralName(), varType, init);
statements.append(jcs);
}
-
+
protected JCStatement createConstructBuilderVarIfNeeded(JavacTreeMaker maker, SingularData data, JavacNode builderType, boolean mapMode, JCTree source) {
List<JCExpression> jceBlank = List.nil();
-
+
JCExpression thisDotField = maker.Select(maker.Ident(builderType.toName("this")), data.getPluralName());
JCExpression thisDotField2 = maker.Select(maker.Ident(builderType.toName("this")), data.getPluralName());
JCExpression cond = maker.Binary(CTC_EQUAL, thisDotField, maker.Literal(CTC_BOT, null));
-
+
JCExpression create = maker.Apply(jceBlank, chainDots(builderType, "com", "google", "common", "collect", getSimpleTargetTypeName(data), getBuilderMethodName(data)), jceBlank);
JCStatement thenPart = maker.Exec(maker.Assign(thisDotField2, create));
-
+
return maker.If(cond, thenPart, null);
}
+
+ private int getTypeArgumentsCount(boolean isMap, String simpleTypeName) {
+ return isMap ? 2 : getListSetTypeArgumentsCount(simpleTypeName);
+ }
+
+ private int getListSetTypeArgumentsCount(String simpleTypeName) {
+ return "ImmutableTable".equals(simpleTypeName) ? 3 : 1;
+ }
+
+ private boolean shouldUsePut(SingularData data, boolean mapMode) {
+ return mapMode || isSpecialTypeOfListSet(data);
+ }
+
+ private boolean isSpecialTypeOfListSet(SingularData data) {
+ return "ImmutableTable".equals(getSimpleTargetTypeName(data));
+ }
}