Skip to content

Commit

Permalink
Work in progress for #134 "Add suppot for toBuilder = true"
Browse files Browse the repository at this point in the history
- added toBuilder generation for Builder on Method/Constructor
  • Loading branch information
Michail Plushnikov committed Jan 13, 2016
1 parent 3af496b commit ec26c8b
Show file tree
Hide file tree
Showing 6 changed files with 66 additions and 19 deletions.
Expand Up @@ -31,7 +31,6 @@
*/
public class BuilderProcessor extends AbstractClassProcessor {

public static final String TO_BUILDER_ANNOTATION_KEY = "toBuilder";
private final BuilderHandler builderHandler = new BuilderHandler();
private final AllArgsConstructorProcessor allArgsConstructorProcessor = new AllArgsConstructorProcessor();

Expand Down Expand Up @@ -67,9 +66,7 @@ protected void generatePsiElements(@NotNull PsiClass psiClass, @NotNull PsiAnnot

builderHandler.createBuilderMethodIfNecessary(target, psiClass, null, builderClass, psiAnnotation);

if (PsiAnnotationUtil.getBooleanAnnotationValue(psiAnnotation, TO_BUILDER_ANNOTATION_KEY, false)) {
target.add(builderHandler.createToBuilderMethod(psiClass, null, builderClass, psiAnnotation));
}
builderHandler.createToBuilderMethodIfNecessary(target, psiClass, null, builderClass, psiAnnotation);
}

@Override
Expand Down
Expand Up @@ -71,7 +71,8 @@ public class BuilderHandler {
private final static String BUILDER_CLASS_NAME = "Builder";
private final static String BUILD_METHOD_NAME = "build";
private final static String BUILDER_METHOD_NAME = "builder";
public static final String TO_BUILDER_METHOD_NAME = "toBuilder";
private static final String TO_BUILDER_METHOD_NAME = "toBuilder";
private static final String TO_BUILDER_ANNOTATION_KEY = "toBuilder";

@SuppressWarnings("deprecation")
private static final Collection<String> INVALID_ON_BUILDERS = Collections.unmodifiableSet(new HashSet<String>(Arrays.asList(
Expand Down Expand Up @@ -243,11 +244,13 @@ public void createBuilderMethodIfNecessary(@NotNull Collection<? super PsiElemen
}
}

@NotNull
public PsiMethod createToBuilderMethod(@NotNull PsiClass containingClass, @Nullable PsiMethod psiMethod, @NotNull PsiClass builderPsiClass, @NotNull PsiAnnotation psiAnnotation) {
LombokLightMethodBuilder method = createBuilderMethod(containingClass, psiMethod, builderPsiClass, psiAnnotation, TO_BUILDER_METHOD_NAME);
method.withModifier(PsiModifier.PUBLIC);
return method;
public void createToBuilderMethodIfNecessary(@NotNull Collection<? super PsiElement> target, @NotNull PsiClass containingClass, @Nullable PsiMethod psiMethod, @NotNull PsiClass builderPsiClass, @NotNull PsiAnnotation psiAnnotation) {
if (PsiAnnotationUtil.getBooleanAnnotationValue(psiAnnotation, TO_BUILDER_ANNOTATION_KEY, false)) {
LombokLightMethodBuilder method = createBuilderMethod(containingClass, psiMethod, builderPsiClass, psiAnnotation, TO_BUILDER_METHOD_NAME);
method.withModifier(PsiModifier.PUBLIC);

target.add(method);
}
}

@NotNull
Expand Down
Expand Up @@ -51,6 +51,8 @@ protected void processIntern(@NotNull PsiMethod psiMethod, @NotNull PsiAnnotatio
}

builderHandler.createBuilderMethodIfNecessary(target, psiClass, psiMethod, builderClass, psiAnnotation);

builderHandler.createToBuilderMethodIfNecessary(target, psiClass, psiMethod, builderClass, psiAnnotation);
}
}
}
@@ -1,5 +1,7 @@
package de.plushnikov.builder.tobuilder;

import java.util.Arrays;

@lombok.Builder(toBuilder = true)
@lombok.experimental.Accessors(prefix = "m")
public class BuilderWithToBuilderOnClass<T> {
Expand All @@ -14,4 +16,18 @@ public class BuilderWithToBuilderOnClass<T> {
public static <K> K rrr(BuilderWithToBuilderOnClass<K> x) {
return x.foo;
}

public static void main(String[] args) {
BuilderWithToBuilderOnClass<String> bean = new BuilderWithToBuilderOnClass<String>("mOneParam", "mTwoParam", "fooParam", Arrays.asList("barsParam1"));
bean.mOne = "mOne";
bean.mTwo = "mTwo";
bean.foo = "foo";

BuilderWithToBuilderOnClass.BuilderWithToBuilderOnClassBuilder x = bean.toBuilder();
System.out.println(x);

x.one("builderOne");
x.bar("builderBar");
System.out.println(x);
}
}
Expand Up @@ -12,4 +12,18 @@ class BuilderWithToBuilderOnConstructor<T> {
@lombok.Builder(toBuilder = true)
public BuilderWithToBuilderOnConstructor(String mOne, @lombok.Builder.ObtainVia(field = "foo") T bar) {
}

public static void main(String[] args) {
BuilderWithToBuilderOnConstructor<String> bean = new BuilderWithToBuilderOnConstructor<String>("mOneParam", "barParam");
bean.mOne = "mOne";
bean.mTwo = "mTwo";
bean.foo = "foo";

BuilderWithToBuilderOnConstructor.BuilderWithToBuilderOnConstructorBuilder x = bean.toBuilder();
System.out.println(x);

x.mOne("builderOne");
x.bar("builderBar");
System.out.println(x);
}
}
Expand Up @@ -2,15 +2,30 @@

@lombok.experimental.Accessors(prefix = "m")
class BuilderWithToBuilderOnMethod<T, K> {
private String mOne, mTwo;
private T foo;
private K bar;
private String mOne, mTwo;
private T foo;
private K bar;

@lombok.Singular
private java.util.List<T> bars;
@lombok.Singular
private java.util.List<T> bars;

@lombok.Builder(toBuilder = true)
public static <Z> BuilderWithToBuilderOnMethod<Z, String> test(String mOne, @lombok.Builder.ObtainVia(field = "foo") Z bar) {
return new BuilderWithToBuilderOnMethod<Z, String>();
}
@lombok.Builder(toBuilder = true)
public static <Z> BuilderWithToBuilderOnMethod<Z, String> test(String mOne, @lombok.Builder.ObtainVia(field = "foo") Z bar) {
return new BuilderWithToBuilderOnMethod<Z, String>();
}

public static void main(String[] args) {
BuilderWithToBuilderOnMethod<String, String> bean = new BuilderWithToBuilderOnMethod<String, String>();
bean.mOne = "mOne";
bean.mTwo = "mTwo";
bean.bar = "bar";
bean.foo = "foo";

BuilderWithToBuilderOnMethod.BuilderWithToBuilderOnMethodBuilder x = bean.toBuilder();
System.out.println(x);

x.mOne("builderOne");
x.bar("builderBar");
System.out.println(x);
}
}

0 comments on commit ec26c8b

Please sign in to comment.