11package com .jsoniter ;
22
3- import com .jsoniter .spi .Binding ;
4- import com .jsoniter .spi .ClassDescriptor ;
5- import com .jsoniter .spi .ConstructorDescriptor ;
6- import com .jsoniter .spi .SetterDescriptor ;
3+ import com .jsoniter .spi .*;
74
85import java .lang .reflect .Type ;
96import java .util .*;
@@ -27,7 +24,7 @@ public static String genObjectUsingSlice(Class clazz, String cacheKey, ClassDesc
2724 List <Binding > allBindings = desc .allDecoderBindings ();
2825 int currentIdx = 0 ;
2926 for (Binding binding : allBindings ) {
30- if (binding .isMandatory ) {
27+ if (binding .failOnMissing ) {
3128 binding .idx = currentIdx ++;
3229 } else {
3330 binding .idx = -1 ;
@@ -184,8 +181,8 @@ private static void addFieldDispatch(
184181 append (lines , String .format ("field.at(%d)==%s" , i , b ));
185182 append (lines , ") {" );
186183 Binding field = (Binding ) entry .getValue ();
187- append (lines , String .format ("_%s_ = %s;" , field .name , CodegenImplNative . genField (field , cacheKey )));
188- if (field .isMandatory ) {
184+ append (lines , String .format ("_%s_ = %s;" , field .name , genField (field , cacheKey )));
185+ if (field .failOnMissing ) {
189186 long mask = 1L << field .idx ;
190187 append (lines , "tracker = tracker | " + mask + "L;" );
191188 }
@@ -307,9 +304,9 @@ private static void appendFieldSet(StringBuilder lines, String cacheKey, Constru
307304 if (!shouldReuseObject (field .valueType )) {
308305 append (lines , String .format ("com.jsoniter.CodegenAccess.setExistingObject(iter, obj.%s);" , field .name ));
309306 }
310- append (lines , String .format ("obj.%s = %s;" , field .name , CodegenImplNative . genField (field , cacheKey )));
307+ append (lines , String .format ("obj.%s = %s;" , field .name , genField (field , cacheKey )));
311308 } else {
312- append (lines , String .format ("_%s_ = %s;" , field .name , CodegenImplNative . genField (field , cacheKey )));
309+ append (lines , String .format ("_%s_ = %s;" , field .name , genField (field , cacheKey )));
313310 }
314311 }
315312
@@ -388,4 +385,67 @@ public static boolean shouldReuseObject(Type valueType) {
388385 }
389386 return CodegenImplNative .isNative (valueType );
390387 }
388+
389+ public static String genField (Binding field , String cacheKey ) {
390+ String fieldCacheKey = field .name + "@" + cacheKey ;
391+ if (field .decoder != null ) {
392+ ExtensionManager .addNewDecoder (fieldCacheKey , field .decoder );
393+ }
394+ // the field decoder might be registered directly
395+ Decoder decoder = ExtensionManager .getDecoder (fieldCacheKey );
396+ Type fieldType = field .valueType ;
397+ if (decoder == null ) {
398+ return String .format ("(%s)%s" , CodegenImplNative .getTypeName (fieldType ), CodegenImplNative .genReadOp (fieldType ));
399+ }
400+ if (fieldType == boolean .class ) {
401+ if (!(decoder instanceof Decoder .BooleanDecoder )) {
402+ throw new JsonException ("decoder for field " + field + "must implement Decoder.BooleanDecoder" );
403+ }
404+ return String .format ("com.jsoniter.CodegenAccess.readBoolean(\" %s\" , iter)" , fieldCacheKey );
405+ }
406+ if (fieldType == byte .class ) {
407+ if (!(decoder instanceof Decoder .ShortDecoder )) {
408+ throw new JsonException ("decoder for field " + field + "must implement Decoder.ShortDecoder" );
409+ }
410+ return String .format ("com.jsoniter.CodegenAccess.readShort(\" %s\" , iter)" , fieldCacheKey );
411+ }
412+ if (fieldType == short .class ) {
413+ if (!(decoder instanceof Decoder .ShortDecoder )) {
414+ throw new JsonException ("decoder for field " + field + "must implement Decoder.ShortDecoder" );
415+ }
416+ return String .format ("com.jsoniter.CodegenAccess.readShort(\" %s\" , iter)" , fieldCacheKey );
417+ }
418+ if (fieldType == char .class ) {
419+ if (!(decoder instanceof Decoder .IntDecoder )) {
420+ throw new JsonException ("decoder for field " + field + "must implement Decoder.IntDecoder" );
421+ }
422+ return String .format ("com.jsoniter.CodegenAccess.readInt(\" %s\" , iter)" , fieldCacheKey );
423+ }
424+ if (fieldType == int .class ) {
425+ if (!(decoder instanceof Decoder .IntDecoder )) {
426+ throw new JsonException ("decoder for field " + field + "must implement Decoder.IntDecoder" );
427+ }
428+ return String .format ("com.jsoniter.CodegenAccess.readInt(\" %s\" , iter)" , fieldCacheKey );
429+ }
430+ if (fieldType == long .class ) {
431+ if (!(decoder instanceof Decoder .LongDecoder )) {
432+ throw new JsonException ("decoder for field " + field + "must implement Decoder.LongDecoder" );
433+ }
434+ return String .format ("com.jsoniter.CodegenAccess.readLong(\" %s\" , iter)" , fieldCacheKey );
435+ }
436+ if (fieldType == float .class ) {
437+ if (!(decoder instanceof Decoder .FloatDecoder )) {
438+ throw new JsonException ("decoder for field " + field + "must implement Decoder.FloatDecoder" );
439+ }
440+ return String .format ("com.jsoniter.CodegenAccess.readFloat(\" %s\" , iter)" , fieldCacheKey );
441+ }
442+ if (fieldType == double .class ) {
443+ if (!(decoder instanceof Decoder .DoubleDecoder )) {
444+ throw new JsonException ("decoder for field " + field + "must implement Decoder.DoubleDecoder" );
445+ }
446+ return String .format ("com.jsoniter.CodegenAccess.readDouble(\" %s\" , iter)" , fieldCacheKey );
447+ }
448+ return String .format ("(%s)com.jsoniter.CodegenAccess.read(\" %s\" , iter);" ,
449+ CodegenImplNative .getTypeName (fieldType ), fieldCacheKey );
450+ }
391451}
0 commit comments