mirror of https://github.com/goccy/go-json.git
Fix error by linter
This commit is contained in:
parent
969dfcec31
commit
6a749c956b
|
@ -62,6 +62,10 @@ issues:
|
||||||
- path: rtype.go
|
- path: rtype.go
|
||||||
linters:
|
linters:
|
||||||
- golint
|
- golint
|
||||||
|
- stylecheck
|
||||||
|
- path: error.go
|
||||||
|
linters:
|
||||||
|
- staticcheck
|
||||||
|
|
||||||
# Maximum issues count per one linter. Set to 0 to disable. Default is 50.
|
# Maximum issues count per one linter. Set to 0 to disable. Default is 50.
|
||||||
max-issues-per-linter: 0
|
max-issues-per-linter: 0
|
||||||
|
|
|
@ -7,6 +7,8 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
"unicode"
|
"unicode"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
|
|
||||||
|
"github.com/goccy/go-json/internal/runtime"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
@ -327,16 +329,16 @@ func decodeCompileStruct(typ *rtype, structName, fieldName string, structTypeToD
|
||||||
structName = typ.Name()
|
structName = typ.Name()
|
||||||
for i := 0; i < fieldNum; i++ {
|
for i := 0; i < fieldNum; i++ {
|
||||||
field := typ.Field(i)
|
field := typ.Field(i)
|
||||||
if isIgnoredStructField(field) {
|
if runtime.IsIgnoredStructField(field) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
isUnexportedField := unicode.IsLower([]rune(field.Name)[0])
|
isUnexportedField := unicode.IsLower([]rune(field.Name)[0])
|
||||||
tag := structTagFromField(field)
|
tag := runtime.StructTagFromField(field)
|
||||||
dec, err := decodeCompile(type2rtype(field.Type), structName, field.Name, structTypeToDecoder)
|
dec, err := decodeCompile(type2rtype(field.Type), structName, field.Name, structTypeToDecoder)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if field.Anonymous && !tag.isTaggedKey {
|
if field.Anonymous && !tag.IsTaggedKey {
|
||||||
if stDec, ok := dec.(*structDecoder); ok {
|
if stDec, ok := dec.(*structDecoder); ok {
|
||||||
if type2rtype(field.Type) == typ {
|
if type2rtype(field.Type) == typ {
|
||||||
// recursive definition
|
// recursive definition
|
||||||
|
@ -414,19 +416,19 @@ func decodeCompileStruct(typ *rtype, structName, fieldName string, structTypeToD
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if tag.isString {
|
if tag.IsString {
|
||||||
dec = newWrappedStringDecoder(type2rtype(field.Type), dec, structName, field.Name)
|
dec = newWrappedStringDecoder(type2rtype(field.Type), dec, structName, field.Name)
|
||||||
}
|
}
|
||||||
var key string
|
var key string
|
||||||
if tag.key != "" {
|
if tag.Key != "" {
|
||||||
key = tag.key
|
key = tag.Key
|
||||||
} else {
|
} else {
|
||||||
key = field.Name
|
key = field.Name
|
||||||
}
|
}
|
||||||
fieldSet := &structFieldSet{
|
fieldSet := &structFieldSet{
|
||||||
dec: dec,
|
dec: dec,
|
||||||
offset: field.Offset,
|
offset: field.Offset,
|
||||||
isTaggedKey: tag.isTaggedKey,
|
isTaggedKey: tag.IsTaggedKey,
|
||||||
key: key,
|
key: key,
|
||||||
keyLen: int64(len(key)),
|
keyLen: int64(len(key)),
|
||||||
}
|
}
|
||||||
|
|
108
indent.go
108
indent.go
|
@ -1,108 +0,0 @@
|
||||||
package json
|
|
||||||
|
|
||||||
import "bytes"
|
|
||||||
|
|
||||||
func encodeWithIndent(dst *bytes.Buffer, src []byte, prefix, indentStr string) error {
|
|
||||||
length := int64(len(src))
|
|
||||||
indentNum := 0
|
|
||||||
indentBytes := []byte(indentStr)
|
|
||||||
for cursor := int64(0); cursor < length; cursor++ {
|
|
||||||
c := src[cursor]
|
|
||||||
switch c {
|
|
||||||
case ' ', '\t', '\n', '\r':
|
|
||||||
continue
|
|
||||||
case '"':
|
|
||||||
if err := dst.WriteByte(c); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
for {
|
|
||||||
cursor++
|
|
||||||
if err := dst.WriteByte(src[cursor]); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
switch src[cursor] {
|
|
||||||
case '\\':
|
|
||||||
cursor++
|
|
||||||
if err := dst.WriteByte(src[cursor]); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
case '"':
|
|
||||||
goto LOOP_END
|
|
||||||
case nul:
|
|
||||||
return errUnexpectedEndOfJSON("string", length)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
case '{':
|
|
||||||
if cursor+1 < length && src[cursor+1] == '}' {
|
|
||||||
if _, err := dst.Write([]byte{'{', '}'}); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
cursor++
|
|
||||||
} else {
|
|
||||||
indentNum++
|
|
||||||
b := []byte{c, '\n'}
|
|
||||||
b = append(b, prefix...)
|
|
||||||
b = append(b, bytes.Repeat(indentBytes, indentNum)...)
|
|
||||||
if _, err := dst.Write(b); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
case '}':
|
|
||||||
indentNum--
|
|
||||||
if indentNum < 0 {
|
|
||||||
return errInvalidCharacter('}', "}", cursor)
|
|
||||||
}
|
|
||||||
b := []byte{'\n'}
|
|
||||||
b = append(b, prefix...)
|
|
||||||
b = append(b, bytes.Repeat(indentBytes, indentNum)...)
|
|
||||||
b = append(b, c)
|
|
||||||
if _, err := dst.Write(b); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
case '[':
|
|
||||||
if cursor+1 < length && src[cursor+1] == ']' {
|
|
||||||
if _, err := dst.Write([]byte{'[', ']'}); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
cursor++
|
|
||||||
} else {
|
|
||||||
indentNum++
|
|
||||||
b := []byte{c, '\n'}
|
|
||||||
b = append(b, prefix...)
|
|
||||||
b = append(b, bytes.Repeat(indentBytes, indentNum)...)
|
|
||||||
if _, err := dst.Write(b); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
case ']':
|
|
||||||
indentNum--
|
|
||||||
if indentNum < 0 {
|
|
||||||
return errInvalidCharacter(']', "]", cursor)
|
|
||||||
}
|
|
||||||
b := []byte{'\n'}
|
|
||||||
b = append(b, prefix...)
|
|
||||||
b = append(b, bytes.Repeat(indentBytes, indentNum)...)
|
|
||||||
b = append(b, c)
|
|
||||||
if _, err := dst.Write(b); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
case ':':
|
|
||||||
if _, err := dst.Write([]byte{':', ' '}); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
case ',':
|
|
||||||
b := []byte{',', '\n'}
|
|
||||||
b = append(b, prefix...)
|
|
||||||
b = append(b, bytes.Repeat(indentBytes, indentNum)...)
|
|
||||||
if _, err := dst.Write(b); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
if err := dst.WriteByte(c); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
LOOP_END:
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
|
@ -51,7 +51,6 @@ var (
|
||||||
appendStructEnd = encoder.AppendStructEnd
|
appendStructEnd = encoder.AppendStructEnd
|
||||||
errUnsupportedValue = encoder.ErrUnsupportedValue
|
errUnsupportedValue = encoder.ErrUnsupportedValue
|
||||||
errUnsupportedFloat = encoder.ErrUnsupportedFloat
|
errUnsupportedFloat = encoder.ErrUnsupportedFloat
|
||||||
errMarshalerWithCode = encoder.ErrMarshalerWithCode
|
|
||||||
mapiterinit = encoder.MapIterInit
|
mapiterinit = encoder.MapIterInit
|
||||||
mapiterkey = encoder.MapIterKey
|
mapiterkey = encoder.MapIterKey
|
||||||
mapitervalue = encoder.MapIterValue
|
mapitervalue = encoder.MapIterValue
|
||||||
|
|
|
@ -51,7 +51,6 @@ var (
|
||||||
appendStructEnd = encoder.AppendStructEnd
|
appendStructEnd = encoder.AppendStructEnd
|
||||||
errUnsupportedValue = encoder.ErrUnsupportedValue
|
errUnsupportedValue = encoder.ErrUnsupportedValue
|
||||||
errUnsupportedFloat = encoder.ErrUnsupportedFloat
|
errUnsupportedFloat = encoder.ErrUnsupportedFloat
|
||||||
errMarshalerWithCode = encoder.ErrMarshalerWithCode
|
|
||||||
mapiterinit = encoder.MapIterInit
|
mapiterinit = encoder.MapIterInit
|
||||||
mapiterkey = encoder.MapIterKey
|
mapiterkey = encoder.MapIterKey
|
||||||
mapitervalue = encoder.MapIterValue
|
mapitervalue = encoder.MapIterValue
|
||||||
|
|
|
@ -47,7 +47,6 @@ var (
|
||||||
appendStructEnd = encoder.AppendStructEndIndent
|
appendStructEnd = encoder.AppendStructEndIndent
|
||||||
errUnsupportedValue = encoder.ErrUnsupportedValue
|
errUnsupportedValue = encoder.ErrUnsupportedValue
|
||||||
errUnsupportedFloat = encoder.ErrUnsupportedFloat
|
errUnsupportedFloat = encoder.ErrUnsupportedFloat
|
||||||
errMarshalerWithCode = encoder.ErrMarshalerWithCode
|
|
||||||
mapiterinit = encoder.MapIterInit
|
mapiterinit = encoder.MapIterInit
|
||||||
mapiterkey = encoder.MapIterKey
|
mapiterkey = encoder.MapIterKey
|
||||||
mapitervalue = encoder.MapIterValue
|
mapitervalue = encoder.MapIterValue
|
||||||
|
|
|
@ -53,7 +53,6 @@ var (
|
||||||
appendStructEnd = encoder.AppendStructEndIndent
|
appendStructEnd = encoder.AppendStructEndIndent
|
||||||
errUnsupportedValue = encoder.ErrUnsupportedValue
|
errUnsupportedValue = encoder.ErrUnsupportedValue
|
||||||
errUnsupportedFloat = encoder.ErrUnsupportedFloat
|
errUnsupportedFloat = encoder.ErrUnsupportedFloat
|
||||||
errMarshalerWithCode = encoder.ErrMarshalerWithCode
|
|
||||||
mapiterinit = encoder.MapIterInit
|
mapiterinit = encoder.MapIterInit
|
||||||
mapiterkey = encoder.MapIterKey
|
mapiterkey = encoder.MapIterKey
|
||||||
mapitervalue = encoder.MapIterValue
|
mapitervalue = encoder.MapIterValue
|
||||||
|
|
|
@ -252,8 +252,9 @@ func IfaceIndir(*Type) bool
|
||||||
//go:noescape
|
//go:noescape
|
||||||
func RType2Type(t *Type) reflect.Type
|
func RType2Type(t *Type) reflect.Type
|
||||||
|
|
||||||
|
//go:nolint structcheck
|
||||||
type emptyInterface struct {
|
type emptyInterface struct {
|
||||||
typ *Type
|
_ *Type
|
||||||
ptr unsafe.Pointer
|
ptr unsafe.Pointer
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
4
rtype.go
4
rtype.go
|
@ -18,10 +18,6 @@ func rtype_ptrTo(t *rtype) *rtype {
|
||||||
return runtime.PtrTo(t)
|
return runtime.PtrTo(t)
|
||||||
}
|
}
|
||||||
|
|
||||||
func ifaceIndir(t *rtype) bool {
|
|
||||||
return runtime.IfaceIndir(t)
|
|
||||||
}
|
|
||||||
|
|
||||||
func rtype2type(t *rtype) reflect.Type {
|
func rtype2type(t *rtype) reflect.Type {
|
||||||
return runtime.RType2Type(t)
|
return runtime.RType2Type(t)
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,81 +0,0 @@
|
||||||
package json
|
|
||||||
|
|
||||||
import (
|
|
||||||
"reflect"
|
|
||||||
"strings"
|
|
||||||
"unicode"
|
|
||||||
)
|
|
||||||
|
|
||||||
func getTag(field reflect.StructField) string {
|
|
||||||
return field.Tag.Get("json")
|
|
||||||
}
|
|
||||||
|
|
||||||
func isIgnoredStructField(field reflect.StructField) bool {
|
|
||||||
if field.PkgPath != "" {
|
|
||||||
if field.Anonymous {
|
|
||||||
if !(field.Type.Kind() == reflect.Ptr && field.Type.Elem().Kind() == reflect.Struct) && field.Type.Kind() != reflect.Struct {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// private field
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
tag := getTag(field)
|
|
||||||
return tag == "-"
|
|
||||||
}
|
|
||||||
|
|
||||||
type structTag struct {
|
|
||||||
key string
|
|
||||||
isTaggedKey bool
|
|
||||||
isOmitEmpty bool
|
|
||||||
isString bool
|
|
||||||
field reflect.StructField
|
|
||||||
}
|
|
||||||
|
|
||||||
type structTags []*structTag
|
|
||||||
|
|
||||||
func (t structTags) existsKey(key string) bool {
|
|
||||||
for _, tt := range t {
|
|
||||||
if tt.key == key {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
func isValidTag(s string) bool {
|
|
||||||
if s == "" {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
for _, c := range s {
|
|
||||||
switch {
|
|
||||||
case strings.ContainsRune("!#$%&()*+-./:<=>?@[]^_{|}~ ", c):
|
|
||||||
// Backslash and quote chars are reserved, but
|
|
||||||
// otherwise any punctuation chars are allowed
|
|
||||||
// in a tag name.
|
|
||||||
case !unicode.IsLetter(c) && !unicode.IsDigit(c):
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
func structTagFromField(field reflect.StructField) *structTag {
|
|
||||||
keyName := field.Name
|
|
||||||
tag := getTag(field)
|
|
||||||
st := &structTag{field: field}
|
|
||||||
opts := strings.Split(tag, ",")
|
|
||||||
if len(opts) > 0 {
|
|
||||||
if opts[0] != "" && isValidTag(opts[0]) {
|
|
||||||
keyName = opts[0]
|
|
||||||
st.isTaggedKey = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
st.key = keyName
|
|
||||||
if len(opts) > 1 {
|
|
||||||
st.isOmitEmpty = opts[1] == "omitempty"
|
|
||||||
st.isString = opts[1] == "string"
|
|
||||||
}
|
|
||||||
return st
|
|
||||||
}
|
|
Loading…
Reference in New Issue