Skip to content

Commit 248cd46

Browse files
committed
Refactor generator TypeSubTypeMeta to use SubTypeRequest
Refactoring to reduce method arguments passed around, by introducing SubTypeRequest. Also means we can hide the frequency and common name maps to be internal to SubTypeRequest
1 parent eba8bd1 commit 248cd46

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)