forked from json-iterator/java
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCodegenImplObject.java
More file actions
59 lines (54 loc) · 2.27 KB
/
CodegenImplObject.java
File metadata and controls
59 lines (54 loc) · 2.27 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
package com.jsoniter.output;
import com.jsoniter.spi.Binding;
import com.jsoniter.spi.ClassDescriptor;
import com.jsoniter.spi.Encoder;
import com.jsoniter.spi.JsoniterSpi;
class CodegenImplObject {
public static String genObject(Class clazz) {
ClassDescriptor desc = JsoniterSpi.getClassDescriptor(clazz, false);
StringBuilder lines = new StringBuilder();
append(lines, String.format("public static void encode_(%s obj, com.jsoniter.output.JsonStream stream) throws java.io.IOException {", clazz.getCanonicalName()));
append(lines, "if (obj == null) { stream.writeNull(); return; }");
if (hasFieldOutput(desc)) {
boolean notFirst = false;
append(lines, "stream.writeObjectStart();");
for (Binding field : desc.allEncoderBindings()) {
for (String toName : field.toNames) {
if (notFirst) {
append(lines, "stream.writeMore();");
} else {
notFirst = true;
}
append(lines, String.format("stream.writeObjectField(\"%s\");", toName));
append(lines, genField(field));
}
}
append(lines, "stream.writeObjectEnd();");
} else {
append(lines, "stream.writeEmptyObject();");
}
append(lines, "}");
return lines.toString().replace("{{clazz}}", clazz.getCanonicalName());
}
private static boolean hasFieldOutput(ClassDescriptor desc) {
for (Binding binding : desc.allEncoderBindings()) {
if (binding.toNames.length > 0) {
return true;
}
}
return false;
}
private static String genField(Binding field) {
String fieldCacheKey = field.encoderCacheKey();
Encoder encoder = JsoniterSpi.getEncoder(fieldCacheKey);
if (encoder == null) {
return CodegenImplNative.genWriteOp("obj." + field.name, field.valueType);
}
return String.format("com.jsoniter.output.CodegenAccess.writeVal(\"%s\", obj.%s, stream);",
fieldCacheKey, field.name);
}
private static void append(StringBuilder lines, String str) {
lines.append(str);
lines.append("\n");
}
}