Explorar el Código

move any codec

Tao Wen hace 7 años
padre
commit
b79587753b
Se han modificado 2 ficheros con 53 adiciones y 39 borrados
  1. 27 1
      any.go
  2. 26 38
      reflect.go

+ 27 - 1
any.go

@@ -245,6 +245,32 @@ func locatePath(iter *Iterator, path []interface{}) Any {
 	return iter.readAny()
 }
 
+var anyType = reflect.TypeOf((*Any)(nil)).Elem()
+
+func createDecoderOfAny(cfg *frozenConfig, prefix string, typ reflect.Type) ValDecoder {
+	if typ == anyType {
+		return &directAnyCodec{}
+	}
+	if typ.Implements(anyType) {
+		return &anyCodec{
+			valType: reflect2.Type2(typ),
+		}
+	}
+	return nil
+}
+
+func createEncoderOfAny(cfg *frozenConfig, prefix string, typ reflect.Type) ValEncoder {
+	if typ == anyType {
+		return &directAnyCodec{}
+	}
+	if typ.Implements(anyType) {
+		return &anyCodec{
+			valType: reflect2.Type2(typ),
+		}
+	}
+	return nil
+}
+
 type anyCodec struct {
 	valType reflect2.Type
 }
@@ -280,4 +306,4 @@ func (codec *directAnyCodec) Encode(ptr unsafe.Pointer, stream *Stream) {
 func (codec *directAnyCodec) IsEmpty(ptr unsafe.Pointer) bool {
 	any := *(*Any)(ptr)
 	return any.Size() == 0
-}
+}

+ 26 - 38
reflect.go

@@ -38,7 +38,6 @@ type checkIsEmpty interface {
 
 var jsonRawMessageType reflect.Type
 var jsoniterRawMessageType reflect.Type
-var anyType reflect.Type
 var marshalerType reflect.Type
 var unmarshalerType reflect.Type
 var textMarshalerType reflect.Type
@@ -47,7 +46,6 @@ var textUnmarshalerType reflect.Type
 func init() {
 	jsonRawMessageType = reflect.TypeOf((*json.RawMessage)(nil)).Elem()
 	jsoniterRawMessageType = reflect.TypeOf((*RawMessage)(nil)).Elem()
-	anyType = reflect.TypeOf((*Any)(nil)).Elem()
 	marshalerType = reflect.TypeOf((*json.Marshaler)(nil)).Elem()
 	unmarshalerType = reflect.TypeOf((*json.Unmarshaler)(nil)).Elem()
 	textMarshalerType = reflect.TypeOf((*encoding.TextMarshaler)(nil)).Elem()
@@ -105,7 +103,6 @@ func decoderOfType(cfg *frozenConfig, prefix string, typ reflect.Type) ValDecode
 }
 
 func createDecoderOfType(cfg *frozenConfig, prefix string, typ reflect.Type) ValDecoder {
-	typeName := typ.String()
 	decoder := createDecoderOfJsonRawMessage(cfg, prefix, typ)
 	if decoder != nil {
 		return decoder
@@ -118,11 +115,9 @@ func createDecoderOfType(cfg *frozenConfig, prefix string, typ reflect.Type) Val
 	if decoder != nil {
 		return decoder
 	}
-	if typ == anyType {
-		return &directAnyCodec{}
-	}
-	if typ.Implements(anyType) {
-		return &anyCodec{}
+	decoder = createDecoderOfAny(cfg, prefix, typ)
+	if decoder != nil {
+		return decoder
 	}
 	decoder = createDecoderOfNative(cfg, prefix, typ)
 	if decoder != nil {
@@ -230,15 +225,31 @@ func createEncoderOfType(cfg *frozenConfig, prefix string, typ reflect.Type) Val
 	if encoder != nil {
 		return encoder
 	}
-	if typ == anyType {
-		return &directAnyCodec{}
+	encoder = createEncoderOfAny(cfg, prefix, typ)
+	if encoder != nil {
+		return encoder
 	}
-	if typ.Implements(anyType) {
-		return &anyCodec{
-			valType: reflect2.Type2(typ),
-		}
+	encoder = createEncoderOfNative(cfg, prefix, typ)
+	if encoder != nil {
+		return encoder
+	}
+	kind := typ.Kind()
+	switch kind {
+	case reflect.Interface:
+		return &dynamicEncoder{reflect2.Type2(typ)}
+	case reflect.Struct:
+		return encoderOfStruct(cfg, prefix, typ)
+	case reflect.Array:
+		return encoderOfArray(cfg, prefix, typ)
+	case reflect.Slice:
+		return encoderOfSlice(cfg, prefix, typ)
+	case reflect.Map:
+		return encoderOfMap(cfg, prefix, typ)
+	case reflect.Ptr:
+		return encoderOfOptional(cfg, prefix, typ)
+	default:
+		return &lazyErrorEncoder{err: fmt.Errorf("%s%s is unsupported type", prefix, typ.String())}
 	}
-	return createEncoderOfSimpleType(cfg, prefix, typ)
 }
 
 func createCheckIsEmpty(cfg *frozenConfig, typ reflect.Type) checkIsEmpty {
@@ -291,29 +302,6 @@ func createCheckIsEmpty(cfg *frozenConfig, typ reflect.Type) checkIsEmpty {
 	}
 }
 
-func createEncoderOfSimpleType(cfg *frozenConfig, prefix string, typ reflect.Type) ValEncoder {
-	encoder := createEncoderOfNative(cfg, prefix, typ)
-	if encoder != nil {
-		return encoder
-	}
-	kind := typ.Kind()
-	switch kind {
-	case reflect.Interface:
-		return &dynamicEncoder{reflect2.Type2(typ)}
-	case reflect.Struct:
-		return encoderOfStruct(cfg, prefix, typ)
-	case reflect.Array:
-		return encoderOfArray(cfg, prefix, typ)
-	case reflect.Slice:
-		return encoderOfSlice(cfg, prefix, typ)
-	case reflect.Map:
-		return encoderOfMap(cfg, prefix, typ)
-	case reflect.Ptr:
-		return encoderOfOptional(cfg, prefix, typ)
-	default:
-		return &lazyErrorEncoder{err: fmt.Errorf("%s%s is unsupported type", prefix, typ.String())}
-	}
-}
 
 type placeholderDecoder struct {
 	cfg      *frozenConfig