mirror of
https://github.com/tiennm99/lombok.git
synced 2026-10-14 22:17:41 +00:00
Added support for generating toString to javac's HandleData. Now javac's HandleData is COMPLETE! w00t!
This commit is contained in:
1 parent
29c610af18
commit
76135a9fb7
1 file changed
+42
-3
@@ -88,10 +88,49 @@ public class HandleData implements JavacAnnotationHandler<Data> {
|
||||
injectMethod(typeNode, method);
|
||||
}
|
||||
|
||||
//TODO toString.
|
||||
if ( methodExists("toString", typeNode) == MethodExistsResult.NOT_EXISTS ) {
|
||||
JCMethodDecl method = createToString(typeNode, nodesForEquality);
|
||||
injectMethod(typeNode, method);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private JCMethodDecl createToString(Node typeNode, List<Node> fields) {
|
||||
TreeMaker maker = typeNode.getTreeMaker();
|
||||
|
||||
JCAnnotation overrideAnnotation = maker.Annotation(chainDots(maker, typeNode, "java", "lang", "Override"), List.<JCExpression>nil());
|
||||
JCModifiers mods = maker.Modifiers(Flags.PUBLIC, List.of(overrideAnnotation));
|
||||
JCExpression returnType = chainDots(maker, typeNode, "java", "lang", "String");
|
||||
|
||||
JCExpression current = maker.Literal(((JCClassDecl) typeNode.get()).name.toString() + "(");
|
||||
boolean first = true;
|
||||
|
||||
for ( Node fieldNode : fields ) {
|
||||
JCVariableDecl field = (JCVariableDecl) fieldNode.get();
|
||||
if ( !first ) current = maker.Binary(JCTree.PLUS, current, maker.Literal(", "));
|
||||
first = false;
|
||||
if ( field.vartype instanceof JCArrayTypeTree ) {
|
||||
boolean multiDim = ((JCArrayTypeTree)field.vartype).elemtype instanceof JCArrayTypeTree;
|
||||
boolean primitiveArray = ((JCArrayTypeTree)field.vartype).elemtype instanceof JCPrimitiveTypeTree;
|
||||
boolean useDeepTS = multiDim || !primitiveArray;
|
||||
|
||||
JCExpression hcMethod = chainDots(maker, typeNode, "java", "util", "Arrays", useDeepTS ? "deepToString" : "toString");
|
||||
current = maker.Binary(JCTree.PLUS, current, maker.Apply(
|
||||
List.<JCExpression>nil(), hcMethod, List.<JCExpression>of(maker.Ident(field.name))));
|
||||
} else current = maker.Binary(JCTree.PLUS, current, maker.Ident(field.name));
|
||||
}
|
||||
|
||||
current = maker.Binary(JCTree.PLUS, current, maker.Literal(")"));
|
||||
|
||||
JCStatement returnStatement = maker.Return(current);
|
||||
|
||||
JCBlock body = maker.Block(0, List.of(returnStatement));
|
||||
|
||||
return maker.MethodDef(mods, typeNode.toName("toString"), returnType,
|
||||
List.<JCTypeParameter>nil(), List.<JCVariableDecl>nil(), List.<JCExpression>nil(), body, null);
|
||||
}
|
||||
|
||||
private JCMethodDecl createHashCode(Node typeNode, List<Node> fields) {
|
||||
TreeMaker maker = typeNode.getTreeMaker();
|
||||
|
||||
@@ -161,9 +200,9 @@ public class HandleData implements JavacAnnotationHandler<Data> {
|
||||
/* java.util.Arrays.deepHashCode(this.fieldName) //use just hashCode() for primitive arrays. */
|
||||
boolean multiDim = ((JCArrayTypeTree)fType).elemtype instanceof JCArrayTypeTree;
|
||||
boolean primitiveArray = ((JCArrayTypeTree)fType).elemtype instanceof JCPrimitiveTypeTree;
|
||||
boolean useDeepEquals = multiDim || !primitiveArray;
|
||||
boolean useDeepHC = multiDim || !primitiveArray;
|
||||
|
||||
JCExpression hcMethod = chainDots(maker, typeNode, "java", "util", "Arrays", useDeepEquals ? "deepHashCode" : "hashCode");
|
||||
JCExpression hcMethod = chainDots(maker, typeNode, "java", "util", "Arrays", useDeepHC ? "deepHashCode" : "hashCode");
|
||||
intoResult = intoResult.append(
|
||||
maker.Apply(List.<JCExpression>nil(), hcMethod, List.of(thisDotField)));
|
||||
} else /* objects */ {
|
||||
|
||||
Reference in new issue
Block a user