diff options
author | Jan Rieke <rieke@subshell.com> | 2018-05-14 17:59:45 +0200 |
---|---|---|
committer | Jan Rieke <rieke@subshell.com> | 2018-05-14 17:59:45 +0200 |
commit | 5d35fe3bfbd46de7410bca96e29731e8f5236618 (patch) | |
tree | 5a82bc42ac3d0876faa7c5a180e1360b6e8f9f7a | |
parent | fb401d4887895d1ebb8529d6323797f1bc8072a2 (diff) | |
download | lombok-5d35fe3bfbd46de7410bca96e29731e8f5236618.tar.gz lombok-5d35fe3bfbd46de7410bca96e29731e8f5236618.tar.bz2 lombok-5d35fe3bfbd46de7410bca96e29731e8f5236618.zip |
ecj: method body for self(); type args for BuilderImpl extends clause
-rw-r--r-- | src/core/lombok/eclipse/handlers/HandleSuperBuilder.java | 46 | ||||
-rw-r--r-- | test/transform/resource/after-ecj/SuperBuilderBasic.java | 34 |
2 files changed, 30 insertions, 50 deletions
diff --git a/src/core/lombok/eclipse/handlers/HandleSuperBuilder.java b/src/core/lombok/eclipse/handlers/HandleSuperBuilder.java index 473a2b9b..d01e250d 100644 --- a/src/core/lombok/eclipse/handlers/HandleSuperBuilder.java +++ b/src/core/lombok/eclipse/handlers/HandleSuperBuilder.java @@ -478,8 +478,10 @@ public class HandleSuperBuilder extends EclipseAnnotationHandler<SuperBuilder> { MethodDeclaration out = new MethodDeclaration(((CompilationUnitDeclaration) builderImplType.top().get()).compilationResult); out.selector = SELF_METHOD.toCharArray(); out.bits |= ECLIPSE_DO_NOT_TOUCH_FLAG; - out.modifiers = ClassFileConstants.AccAbstract; + out.modifiers = ClassFileConstants.AccProtected; + out.annotations = new Annotation[] {makeMarkerAnnotation(TypeConstants.JAVA_LANG_OVERRIDE, builderImplType.get())}; out.returnType = new SingleTypeReference(builderImplType.getName().toCharArray(), 0); + out.statements = new Statement[] {new ReturnStatement(new ThisReference(0, 0), 0, 0)}; return out; } @@ -536,6 +538,7 @@ 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)}; AllocationExpression allocationStatement = new AllocationExpression(); allocationStatement.type = copyType(out.returnType); @@ -777,6 +780,7 @@ public class HandleSuperBuilder extends EclipseAnnotationHandler<SuperBuilder> { builder.typeParameters[builder.typeParameters.length - 1] = o; builder.superclass = superclassBuilderClass; + // TODO: Extends clause when there is a superclass. // JCExpression extending = null; // if (superclassBuilderClassExpression != null) { // // If the annotated class extends another class, we want this builder to extend the builder of the superclass. @@ -796,45 +800,19 @@ public class HandleSuperBuilder extends EclipseAnnotationHandler<SuperBuilder> { TypeDeclaration parent = (TypeDeclaration) tdParent.get(); TypeDeclaration builder = new TypeDeclaration(parent.compilationResult); builder.bits |= Eclipse.ECLIPSE_DO_NOT_TOUCH_FLAG; - builder.modifiers |= ClassFileConstants.AccPublic; - builder.modifiers |= ClassFileConstants.AccStatic; - builder.typeParameters = copyTypeParams(typeParams, source); + builder.modifiers |= ClassFileConstants.AccPrivate | ClassFileConstants.AccStatic | ClassFileConstants.AccFinal; builder.name = builderImplClass.toCharArray(); if (builderAbstractClass != null) { - builder.superclass = new SingleTypeReference(builderAbstractClass.toCharArray(), 0); + // Extend the abstract builder. + // TODO: 1. Add any type params of the annotated class. + // 2. The return type for the build() method (named "C" in the abstract builder), which is the annotated class. + // 3. The return type for all setter methods (named "B" in the abstract builder), which is this builder class. + TypeReference[] typeArgs = new TypeReference[] {cloneSelfType(tdParent, source), new SingleTypeReference(builderImplClass.toCharArray(), 0)}; + builder.superclass = new ParameterizedSingleTypeReference(builderAbstractClass.toCharArray(), typeArgs, 0, 0); } builder.traverse(new SetGeneratedByVisitor(source), (ClassScope) null); return injectType(tdParent, builder); } -// public EclipseNode makeBuilderImplClass(EclipseNode source, EclipseNode tdParent, String builderImplClass, String builderAbstractClass, List<JCTypeParameter> typeParams, JCAnnotation ast) { -// JavacTreeMaker maker = tdParent.getTreeMaker(); -// JCModifiers mods = maker.Modifiers(Flags.STATIC | Flags.PRIVATE | Flags.FINAL); -// -// // Extend the abstract builder. -// JCExpression extending = maker.Ident(tdParent.toName(builderAbstractClass)); -// // Add any type params of the annotated class. -// ListBuffer<JCTypeParameter> allTypeParams = new ListBuffer<JCTypeParameter>(); -// allTypeParams.addAll(copyTypeParams(source, typeParams)); -// // Add builder-specific type params required for inheritable builders. -// // 1. The return type for the build() method (named "C" in the abstract builder), which is the annotated class. -// JCExpression annotatedClass = maker.Ident(tdParent.toName(tdParent.getName())); -// if (typeParams.nonEmpty()) { -// // Add type params of the annotated class. -// annotatedClass = maker.TypeApply(annotatedClass, getTypeParamExpressions(typeParams, maker).toList()); -// } -// // 2. The return type for all setter methods (named "B" in the abstract builder), which is this builder class. -// JCExpression builderImplClassExpression = maker.Ident(tdParent.toName(builderImplClass)); -// if (typeParams.nonEmpty()) { -// builderImplClassExpression = maker.TypeApply(builderImplClassExpression, getTypeParamExpressions(typeParams, maker).toList()); -// } -// ListBuffer<JCExpression> typeParamsForBuilder = getTypeParamExpressions(typeParams, maker); -// typeParamsForBuilder.add(annotatedClass); -// typeParamsForBuilder.add(builderImplClassExpression); -// extending = maker.TypeApply(extending, typeParamsForBuilder.toList()); -// -// JCClassDecl builder = maker.ClassDef(mods, tdParent.toName(builderImplClass), copyTypeParams(source, typeParams), extending, List.<JCExpression>nil(), List.<JCTree>nil()); -// return injectType(tdParent, builder); -// } private void addObtainVia(BuilderFieldData bfd, EclipseNode node) { for (EclipseNode child : node.down()) { diff --git a/test/transform/resource/after-ecj/SuperBuilderBasic.java b/test/transform/resource/after-ecj/SuperBuilderBasic.java index 7315760c..d293c8f8 100644 --- a/test/transform/resource/after-ecj/SuperBuilderBasic.java +++ b/test/transform/resource/after-ecj/SuperBuilderBasic.java @@ -12,27 +12,28 @@ public class SuperBuilderBasic { }
public @java.lang.SuppressWarnings("all") B item(String item) {
if ((this.items == null))
- this.items = new java.util.ArrayList<String>();
+ this.items = new java.util.ArrayList<String>();
this.items.add(item);
return self();
}
public @java.lang.SuppressWarnings("all") B items(java.util.Collection<? extends String> items) {
if ((this.items == null))
- this.items = new java.util.ArrayList<String>();
+ this.items = new java.util.ArrayList<String>();
this.items.addAll(items);
return self();
}
public @java.lang.SuppressWarnings("all") B clearItems() {
if ((this.items != null))
- this.items.clear();
+ this.items.clear();
return self();
}
public @java.lang.Override @java.lang.SuppressWarnings("all") java.lang.String toString() {
- return "SuperBuilderBasic.Parent.ParentBuilder(field1=" + this.field1 + ", items=" + this.items + ")";
+ return (((("SuperBuilderBasic.Parent.ParentBuilder(field1=" + this.field1) + ", items=") + this.items) + ")");
}
}
private static final @java.lang.SuppressWarnings("all") class ParentBuilderImpl extends ParentBuilder<Parent, ParentBuilderImpl> {
private @java.lang.SuppressWarnings("all") ParentBuilderImpl() {
+ super();
}
protected @java.lang.Override @java.lang.SuppressWarnings("all") ParentBuilderImpl self() {
return this;
@@ -41,26 +42,27 @@ public class SuperBuilderBasic { return new Parent(this);
}
}
- public @java.lang.SuppressWarnings("all") static ParentBuilder<?, ?> builder() {
- return new ParentBuilderImpl();
- }
int field1;
@lombok.Singular List<String> items;
protected @java.lang.SuppressWarnings("all") Parent(final ParentBuilder<?, ?> b) {
+ super();
this.field1 = b.field1;
java.util.List<String> items;
- switch (b.items == null ? 0 : b.items.size()) {
- case 0:
- items = java.util.Collections.emptyList();
- break;
- case 1:
- items = java.util.Collections.singletonList(b.items.get(0));
- break;
- default:
- items = java.util.Collections.unmodifiableList(new java.util.ArrayList<String>(b.items));
+ switch (((b.items == null) ? 0 : b.items.size())) {
+ case 0 :
+ items = java.util.Collections.emptyList();
+ break;
+ case 1 :
+ items = java.util.Collections.singletonList(b.items.get(0));
+ break;
+ default :
+ items = java.util.Collections.unmodifiableList(new java.util.ArrayList<String>(b.items));
}
this.items = items;
}
+ public static @java.lang.SuppressWarnings("all") ParentBuilder<?, ?> builder() {
+ return new ParentBuilderImpl();
+ }
}
public static @lombok.experimental.SuperBuilder class Child extends Parent {
|