aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Rieke <it@janrieke.de>2018-05-06 22:07:28 +0200
committerJan Rieke <it@janrieke.de>2018-05-06 22:07:28 +0200
commite12a956c2579ae6d38ef9850fb29f3f720ddac47 (patch)
tree8d8639dd3d1ca745ad491ec9740d0dbdf67dafc9
parenteec57b87509c0a2841878aecb0e8f8f0839fa30c (diff)
downloadlombok-e12a956c2579ae6d38ef9850fb29f3f720ddac47.tar.gz
lombok-e12a956c2579ae6d38ef9850fb29f3f720ddac47.tar.bz2
lombok-e12a956c2579ae6d38ef9850fb29f3f720ddac47.zip
ecj: builder generics [WIP]
-rw-r--r--src/core/lombok/eclipse/handlers/HandleSuperBuilder.java24
1 files changed, 20 insertions, 4 deletions
diff --git a/src/core/lombok/eclipse/handlers/HandleSuperBuilder.java b/src/core/lombok/eclipse/handlers/HandleSuperBuilder.java
index 7e6daa17..486e8f91 100644
--- a/src/core/lombok/eclipse/handlers/HandleSuperBuilder.java
+++ b/src/core/lombok/eclipse/handlers/HandleSuperBuilder.java
@@ -194,7 +194,7 @@ public class HandleSuperBuilder extends EclipseAnnotationHandler<SuperBuilder> {
}
// Set the names of the builder classes.
- String builderClassName = td.name.toString() + "Builder";
+ String builderClassName = String.valueOf(td.name) + "Builder";
String builderImplClassName = builderClassName + "Impl";
TypeReference extendsClause = td.superclass;
@@ -224,8 +224,8 @@ public class HandleSuperBuilder extends EclipseAnnotationHandler<SuperBuilder> {
// If there is no superclass, superclassBuilderClassExpression is still == null at this point.
// You can use it to check whether to inherit or not.
- returnType = namePlusTypeParamsToTypeReference(td.name, td.typeParameters, p);
typeParams = td.typeParameters != null ? td.typeParameters : new TypeParameter[0];
+ returnType = namePlusTypeParamsToTypeReference(td.name, typeParams, p);
// <C, B> are the generics for our builder.
String classGenericName = "C";
@@ -607,7 +607,7 @@ public class HandleSuperBuilder extends EclipseAnnotationHandler<SuperBuilder> {
out.modifiers = ClassFileConstants.AccPublic | ClassFileConstants.AccStatic;
out.bits |= ECLIPSE_DO_NOT_TOUCH_FLAG;
out.returnType = namePlusTypeParamsToTypeReference(builderClassName.toCharArray(), typeParams, p);
- out.typeParameters = copyTypeParams(typeParams, source);
+ //out.typeParameters = copyTypeParams(typeParams, source);
AllocationExpression invoke = new AllocationExpression();
invoke.type = namePlusTypeParamsToTypeReference(builderClassName.toCharArray(), typeParams, p);
out.statements = new Statement[] {new ReturnStatement(invoke, pS, pE)};
@@ -770,6 +770,22 @@ public class HandleSuperBuilder extends EclipseAnnotationHandler<SuperBuilder> {
return null;
}
+ private TypeParameter[] copyTypeParamsAndAddBuilderParams(TypeParameter[] typeParams, ASTNode source, String classGenericName, String builderGenericName) {
+ TypeParameter[] result = Arrays.copyOf(copyTypeParams(typeParams, source), typeParams.length + 2);
+
+ TypeParameter o = new TypeParameter();
+ setGeneratedBy(o, source);
+ o.name = classGenericName.toCharArray();
+ result[result.length - 2] = o;
+
+ o = new TypeParameter();
+ setGeneratedBy(o, source);
+ o.name = builderGenericName.toCharArray();
+ result[result.length - 1] = o;
+
+ return result;
+ }
+
public EclipseNode makeBuilderAbstractClass(EclipseNode tdParent, String builderClass,
TypeReference superclassBuilderClass, TypeParameter[] typeParams,
TypeParameter[] superclassTypeParams, ASTNode source, String classGenericName, String builderGenericName) {
@@ -778,8 +794,8 @@ public class HandleSuperBuilder extends EclipseAnnotationHandler<SuperBuilder> {
TypeDeclaration builder = new TypeDeclaration(parent.compilationResult);
builder.bits |= Eclipse.ECLIPSE_DO_NOT_TOUCH_FLAG;
builder.modifiers |= ClassFileConstants.AccPublic | ClassFileConstants.AccStatic | ClassFileConstants.AccAbstract;
- builder.typeParameters = copyTypeParams(typeParams, source);
builder.name = builderClass.toCharArray();
+ builder.typeParameters = copyTypeParamsAndAddBuilderParams(typeParams, source, classGenericName, builderGenericName);
builder.superclass = superclassBuilderClass;
// // Keep any type params of the annotated class.