11package com .jsoniter .output ;
22
3+ import com .jsoniter .spi .JsonException ;
4+ import com .jsoniter .spi .JsoniterSpi ;
5+
36class CodegenResult {
47
8+ private final boolean supportBuffer ;
59 String prelude = null ; // first
610 String epilogue = null ; // last
711 private StringBuilder lines = new StringBuilder ();
812 private StringBuilder buffered = new StringBuilder ();
913
10- public static String bufferToWriteOp (String buffered ) {
11- if (buffered == null ) {
12- return "" ;
13- }
14- if (buffered .length () == 1 ) {
15- return String .format ("stream.write((byte)'%s');" , escape (buffered .charAt (0 )));
16- } else if (buffered .length () == 2 ) {
17- return String .format ("stream.write((byte)'%s', (byte)'%s');" ,
18- escape (buffered .charAt (0 )), escape (buffered .charAt (1 )));
19- } else if (buffered .length () == 3 ) {
20- return String .format ("stream.write((byte)'%s', (byte)'%s', (byte)'%s');" ,
21- escape (buffered .charAt (0 )), escape (buffered .charAt (1 )), escape (buffered .charAt (2 )));
22- } else if (buffered .length () == 4 ) {
23- return String .format ("stream.write((byte)'%s', (byte)'%s', (byte)'%s', (byte)'%s');" ,
24- escape (buffered .charAt (0 )), escape (buffered .charAt (1 )), escape (buffered .charAt (2 )), escape (buffered .charAt (3 )));
25- } else {
26- StringBuilder escaped = new StringBuilder ();
27- for (int i = 0 ; i < buffered .length (); i ++) {
28- char c = buffered .charAt (i );
29- if (c == '"' ) {
30- escaped .append ('\\' );
31- }
32- escaped .append (c );
33- }
34- return String .format ("stream.writeRaw(\" %s\" , %s);" , escaped .toString (), buffered .length ());
35- }
36- }
37-
38- private static String escape (char c ) {
39- if (c == '"' ) {
40- return "\\ \" " ;
41- }
42- if (c == '\\' ) {
43- return "\\ \\ " ;
44- }
45- return String .valueOf (c );
14+ public CodegenResult () {
15+ supportBuffer = JsoniterSpi .getCurrentConfig ().indentionStep () == 0 ;
4616 }
4717
4818 public void append (String str ) {
@@ -56,14 +26,23 @@ public void append(String str) {
5626 }
5727
5828 public void buffer (char c ) {
59- buffered .append (c );
29+ if (supportBuffer ) {
30+ buffered .append (c );
31+ } else {
32+ throw new UnsupportedOperationException ("internal error: should not call buffer when indention step > 0" );
33+ }
6034 }
6135
6236 public void buffer (String s ) {
6337 if (s == null ) {
6438 return ;
6539 }
66- buffered .append (s );
40+ if (supportBuffer ) {
41+ buffered .append (s );
42+ } else {
43+ throw new UnsupportedOperationException ("internal error: should not call buffer when indention step > 0" );
44+
45+ }
6746 }
6847
6948 public void flushBuffer () {
@@ -111,4 +90,42 @@ private static void append(StringBuilder lines, String line) {
11190 lines .append (line );
11291 lines .append ('\n' );
11392 }
93+
94+ public static String bufferToWriteOp (String buffered ) {
95+ if (buffered == null ) {
96+ return "" ;
97+ }
98+ if (buffered .length () == 1 ) {
99+ return String .format ("stream.write((byte)'%s');" , escape (buffered .charAt (0 )));
100+ } else if (buffered .length () == 2 ) {
101+ return String .format ("stream.write((byte)'%s', (byte)'%s');" ,
102+ escape (buffered .charAt (0 )), escape (buffered .charAt (1 )));
103+ } else if (buffered .length () == 3 ) {
104+ return String .format ("stream.write((byte)'%s', (byte)'%s', (byte)'%s');" ,
105+ escape (buffered .charAt (0 )), escape (buffered .charAt (1 )), escape (buffered .charAt (2 )));
106+ } else if (buffered .length () == 4 ) {
107+ return String .format ("stream.write((byte)'%s', (byte)'%s', (byte)'%s', (byte)'%s');" ,
108+ escape (buffered .charAt (0 )), escape (buffered .charAt (1 )), escape (buffered .charAt (2 )), escape (buffered .charAt (3 )));
109+ } else {
110+ StringBuilder escaped = new StringBuilder ();
111+ for (int i = 0 ; i < buffered .length (); i ++) {
112+ char c = buffered .charAt (i );
113+ if (c == '"' ) {
114+ escaped .append ('\\' );
115+ }
116+ escaped .append (c );
117+ }
118+ return String .format ("stream.writeRaw(\" %s\" , %s);" , escaped .toString (), buffered .length ());
119+ }
120+ }
121+
122+ private static String escape (char c ) {
123+ if (c == '"' ) {
124+ return "\\ \" " ;
125+ }
126+ if (c == '\\' ) {
127+ return "\\ \\ " ;
128+ }
129+ return String .valueOf (c );
130+ }
114131}
0 commit comments