Skip to content

Commit 8168ca3

Browse files
authored
Merge pull request #107 from avaje/feature/refactor-TypeSubTypeMeta
Refactor generator TypeSubTypeMeta to use SubTypeRequest
2 parents eba8bd1 + 248cd46 commit 8168ca3

File tree

3 files changed

+68
-22
lines changed

3 files changed

+68
-22
lines changed

jsonb-generator/src/main/java/io/avaje/jsonb/generator/ClassReader.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -406,10 +406,11 @@ private void writeFromJsonWithSubTypes(Append writer) {
406406
}
407407
// another frequency map to append numbers to the subtype constructor params
408408
final Map<String, Integer> frequencyMap2 = new HashMap<>();
409+
final var req = new SubTypeRequest(typeVar, this, useSwitch, useEnum, frequencyMap2, isCommonFieldMap);
409410

410411
for (final TypeSubTypeMeta subTypeMeta : typeReader.subTypes()) {
411412
final var varName = Util.initLower(Util.shortName(subTypeMeta.type()));
412-
subTypeMeta.writeFromJsonBuild(writer, typeVar, varName, this, useSwitch, useEnum, frequencyMap2, isCommonFieldMap);
413+
subTypeMeta.writeFromJsonBuild(writer, varName, req);
413414
}
414415
if (useSwitch) {
415416
writer.append(" default").appendSwitchCase().eol().append(" ");
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package io.avaje.jsonb.generator;
2+
3+
import java.util.Map;
4+
5+
final class SubTypeRequest {
6+
7+
private final String typeVar;
8+
private final ClassReader beanReader;
9+
private final boolean useSwitch;
10+
private final boolean useEnum;
11+
private final Map<String, Integer> frequencyMap;
12+
private final Map<String, Boolean> commonFieldMap;
13+
14+
SubTypeRequest(String typeVar, ClassReader beanReader, boolean useSwitch, boolean useEnum, Map<String, Integer> frequencyMap, Map<String, Boolean> commonFieldMap) {
15+
this.typeVar = typeVar;
16+
this.beanReader = beanReader;
17+
this.useSwitch = useSwitch;
18+
this.useEnum = useEnum;
19+
this.frequencyMap = frequencyMap;
20+
this.commonFieldMap = commonFieldMap;
21+
}
22+
23+
String typeVar() {
24+
return typeVar;
25+
}
26+
27+
ClassReader beanReader() {
28+
return beanReader;
29+
}
30+
31+
boolean useSwitch() {
32+
return useSwitch;
33+
}
34+
35+
boolean useEnum() {
36+
return useEnum;
37+
}
38+
39+
boolean isCommonField(String paramName) {
40+
return Boolean.TRUE.equals(commonFieldMap.get(paramName));
41+
}
42+
43+
String frequencySuffix(String constructParamName) {
44+
var frequency = frequencyMap.compute(constructParamName, (k, v) -> v == null ? 0 : v + 1);
45+
return frequency == 0 ? "" : frequency.toString();
46+
}
47+
}

jsonb-generator/src/main/java/io/avaje/jsonb/generator/TypeSubTypeMeta.java

Lines changed: 19 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
import java.util.ArrayList;
66
import java.util.LinkedHashSet;
77
import java.util.List;
8-
import java.util.Map;
98
import java.util.Set;
109

1110
import javax.lang.model.element.TypeElement;
@@ -18,6 +17,7 @@ final class TypeSubTypeMeta {
1817
private TypeElement typeElement;
1918
private boolean defaultPublicConstructor;
2019
private final List<MethodReader> publicConstructors = new ArrayList<>();
20+
private final Set<String> constructorFieldNames = new LinkedHashSet<>();
2121

2222
@Override
2323
public String toString() {
@@ -56,39 +56,39 @@ void addConstructor(MethodReader methodReader) {
5656
publicConstructors.add(methodReader);
5757
}
5858

59-
void writeFromJsonBuild(Append writer, String typeVar, String varName, ClassReader beanReader, boolean useSwitch, boolean useEnum, Map<String, Integer> frequencyMap2, Map<String, Boolean> isCommonFieldMap) {
60-
if (useSwitch) {
61-
if (useEnum) {
59+
void writeFromJsonBuild(Append writer, String varName, SubTypeRequest req) {
60+
if (req.useSwitch()) {
61+
if (req.useEnum()) {
6262
writer.append(" case %s", name()).appendSwitchCase().eol();
6363
} else {
6464
writer.append(" case \"%s\"", name()).appendSwitchCase().eol();
6565
}
6666
writer.append(" ");
67-
writeFromJsonConstructor(writer, varName, beanReader, frequencyMap2,isCommonFieldMap);
68-
writeFromJsonSetters(writer, varName, beanReader, useSwitch);
67+
writeFromJsonConstructor(writer, varName, req);
68+
writeFromJsonSetters(writer, varName, req);
6969
if (useEnhancedSwitch()) {
7070
writer.append(" yield _$%s;", varName).eol();
7171
writer.append(" }").eol();
7272
} else {
7373
writer.append(" return _$%s;", varName).eol();
7474
}
7575
} else {
76-
if (useEnum) {
77-
writer.append(" if (%s.equals(%s)) {", name(), typeVar).eol();
76+
if (req.useEnum()) {
77+
writer.append(" if (%s.equals(%s)) {", name(), req.typeVar()).eol();
7878
} else {
79-
writer.append(" if (\"%s\".equals(%s)) {", name(), typeVar).eol();
79+
writer.append(" if (\"%s\".equals(%s)) {", name(), req.typeVar()).eol();
8080
}
81-
writeFromJsonConstructor(writer, varName, beanReader, frequencyMap2, isCommonFieldMap);
82-
writeFromJsonSetters(writer, varName, beanReader, useSwitch);
81+
writeFromJsonConstructor(writer, varName, req);
82+
writeFromJsonSetters(writer, varName, req);
8383
writer.append(" return _$%s;", varName).eol();
8484
writer.append(" }").eol();
8585
}
8686
}
8787

88-
private void writeFromJsonSetters(Append writer, String varName, ClassReader beanReader, boolean useSwitch) {
89-
for (final FieldReader field : beanReader.allFields()) {
88+
private void writeFromJsonSetters(Append writer, String varName, SubTypeRequest req) {
89+
for (final FieldReader field : req.beanReader().allFields()) {
9090
if (isIncludeSetter(field)) {
91-
if (useSwitch) {
91+
if (req.useSwitch()) {
9292
writer.append(" ");
9393
}
9494
field.writeFromJsonSetter(writer, varName, " ");
@@ -100,9 +100,8 @@ private boolean isIncludeSetter(FieldReader field) {
100100
return field.includeFromJson() && !constructorFieldNames.contains(field.fieldName()) && field.includeForType(this);
101101
}
102102

103-
private final Set<String> constructorFieldNames = new LinkedHashSet<>();
104103

105-
private void writeFromJsonConstructor(Append writer, String varName, ClassReader beanReader, Map<String, Integer> frequencyMap2, Map<String, Boolean> isCommonFieldMap) {
104+
private void writeFromJsonConstructor(Append writer, String varName, SubTypeRequest req) {
106105
writer.append(" %s _$%s = new %s(", shortType, varName, shortType);
107106
final MethodReader constructor = findConstructor();
108107
if (constructor != null) {
@@ -114,11 +113,10 @@ private void writeFromJsonConstructor(Append writer, String varName, ClassReader
114113
final var param = params.get(i);
115114
final String paramName = param.name();
116115
constructorFieldNames.add(paramName);
117-
var constructParamName = beanReader.constructorParamName(paramName);
118-
final var writeWithNum = isCommonFieldMap.get(paramName);
119-
if (constructParamName.startsWith("_val$") && writeWithNum != null && writeWithNum) {
120-
final var frequency = frequencyMap2.compute(constructParamName, (k, v) -> v == null ? 0 : v + 1);
121-
constructParamName = constructParamName + (frequency == 0 ? "" : frequency.toString());
116+
var constructParamName = req.beanReader().constructorParamName(paramName);
117+
if (constructParamName.startsWith("_val$") && req.isCommonField(paramName)) {
118+
final var frequencySuffix = req.frequencySuffix(constructParamName);
119+
constructParamName = constructParamName + frequencySuffix;
122120
}
123121

124122
writer.append(constructParamName); // assuming name matches field here?

0 commit comments

Comments
 (0)