|
22 | 22 |
|
23 | 23 | import java.util.ArrayList; |
24 | 24 | import java.util.List; |
| 25 | +import java.util.StringJoiner; |
25 | 26 | import java.util.function.Supplier; |
26 | 27 |
|
27 | 28 | import static java.util.stream.Collectors.toList; |
28 | 29 | import static javax.lang.model.element.Modifier.FINAL; |
29 | 30 | import static javax.lang.model.element.Modifier.PRIVATE; |
| 31 | +import static javax.lang.model.element.Modifier.PUBLIC; |
30 | 32 | import static javax.lang.model.element.Modifier.STATIC; |
31 | 33 | import static net.jbock.common.Constants.EITHERS; |
32 | 34 | import static net.jbock.common.Constants.STRING; |
@@ -55,6 +57,7 @@ TypeSpec define() { |
55 | 57 | } |
56 | 58 | return spec.addModifiers(PRIVATE, STATIC, FINAL) |
57 | 59 | .addMethod(constructor()) |
| 60 | + .addMethod(generateToString()) |
58 | 61 | .addFields(allMappings().stream() |
59 | 62 | .map(Mapping::field) |
60 | 63 | .collect(toList())) |
@@ -101,6 +104,24 @@ private MethodSpec constructor() { |
101 | 104 | .build(); |
102 | 105 | } |
103 | 106 |
|
| 107 | + private MethodSpec generateToString() { |
| 108 | + MethodSpec.Builder spec = MethodSpec.methodBuilder("toString").addModifiers(PUBLIC); |
| 109 | + spec.addAnnotation(Override.class); |
| 110 | + ParameterSpec joiner = ParameterSpec.builder(StringJoiner.class, "joiner").build(); |
| 111 | + spec.addStatement("$T $N = new $T($S, $S, $S)", StringJoiner.class, joiner, StringJoiner.class, |
| 112 | + ", ", "{", "}"); |
| 113 | + for (int i = 0; i < namedOptions().size(); i++) { |
| 114 | + Mapping<Option> m = namedOptions().get(i); |
| 115 | + spec.addStatement("$N.add($S + $N)", joiner, m.field().name + ": ", m.field()); |
| 116 | + } |
| 117 | + for (int i = 0; i < positionalParameters().size(); i++) { |
| 118 | + Mapping<Parameter> m = positionalParameters().get(i); |
| 119 | + spec.addStatement("$N.add($S + $N)", joiner, m.field().name + ": ", m.field()); |
| 120 | + } |
| 121 | + spec.addStatement("return $N.toString()", joiner); |
| 122 | + return spec.returns(String.class).build(); |
| 123 | + } |
| 124 | + |
104 | 125 | private CodeBlock convertExpressionOption(Mapping<Option> m, int i) { |
105 | 126 | List<CodeBlock> code = new ArrayList<>(); |
106 | 127 | code.add(CodeBlock.of("$N.option($T.$N)", result(), |
|
0 commit comments