in cmd/generate-fastjson/main.go [259:291]
func generateValue(w *bytes.Buffer, expr string, exprType types.Type) {
if named, ok := exprType.(*types.Named); ok {
if hasMethod(named, marshalMethod) {
fmt.Fprintf(w, `
if err := %s.%s(w); err != nil && firstErr == nil {
firstErr = err
}
`[1:], expr, marshalMethod)
return
}
exprType = named.Underlying()
}
switch t := exprType.(type) {
case *types.Pointer:
generatePointerValue(w, expr, t)
case *types.Slice:
generateSliceValue(w, expr, t)
case *types.Basic:
generateBasicValue(w, expr, t)
case *types.Map:
generateMapValue(w, expr, t)
case *types.Interface:
generateInterfaceValue(w, expr, t)
case *types.Struct:
generateStructValue(w, expr, t)
case *types.Alias:
unaliasType := types.Unalias(t)
generateValue(w, expr, unaliasType)
default:
panic(fmt.Errorf("unhandled type %T", t))
}
}