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 class BuilderProcessor extends AbstractClassProcessor {


public static final String TO_BUILDER_ANNOTATION_KEY = "toBuilder";
private final BuilderHandler builderHandler = new BuilderHandler(); private final BuilderHandler builderHandler = new BuilderHandler();
private final AllArgsConstructorProcessor allArgsConstructorProcessor = new AllArgsConstructorProcessor(); 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); builderHandler.createBuilderMethodIfNecessary(target, psiClass, null, builderClass, psiAnnotation);


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


@Override @Override
Expand Down
Expand Up @@ -71,7 +71,8 @@ public class BuilderHandler {
private final static String BUILDER_CLASS_NAME = "Builder"; private final static String BUILDER_CLASS_NAME = "Builder";
private final static String BUILD_METHOD_NAME = "build"; private final static String BUILD_METHOD_NAME = "build";
private final static String BUILDER_METHOD_NAME = "builder"; 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") @SuppressWarnings("deprecation")
private static final Collection<String> INVALID_ON_BUILDERS = Collections.unmodifiableSet(new HashSet<String>(Arrays.asList( 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 void createToBuilderMethodIfNecessary(@NotNull Collection<? super PsiElement> target, @NotNull PsiClass containingClass, @Nullable PsiMethod psiMethod, @NotNull PsiClass builderPsiClass, @NotNull PsiAnnotation psiAnnotation) {
public PsiMethod createToBuilderMethod(@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); LombokLightMethodBuilder method = createBuilderMethod(containingClass, psiMethod, builderPsiClass, psiAnnotation, TO_BUILDER_METHOD_NAME);
method.withModifier(PsiModifier.PUBLIC); method.withModifier(PsiModifier.PUBLIC);
return method;
target.add(method);
}
} }


@NotNull @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.createBuilderMethodIfNecessary(target, psiClass, psiMethod, builderClass, psiAnnotation);

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


import java.util.Arrays;

@lombok.Builder(toBuilder = true) @lombok.Builder(toBuilder = true)
@lombok.experimental.Accessors(prefix = "m") @lombok.experimental.Accessors(prefix = "m")
public class BuilderWithToBuilderOnClass<T> { public class BuilderWithToBuilderOnClass<T> {
Expand All @@ -14,4 +16,18 @@ public class BuilderWithToBuilderOnClass<T> {
public static <K> K rrr(BuilderWithToBuilderOnClass<K> x) { public static <K> K rrr(BuilderWithToBuilderOnClass<K> x) {
return x.foo; 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) @lombok.Builder(toBuilder = true)
public BuilderWithToBuilderOnConstructor(String mOne, @lombok.Builder.ObtainVia(field = "foo") T bar) { 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") @lombok.experimental.Accessors(prefix = "m")
class BuilderWithToBuilderOnMethod<T, K> { class BuilderWithToBuilderOnMethod<T, K> {
private String mOne, mTwo; private String mOne, mTwo;
private T foo; private T foo;
private K bar; private K bar;


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


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