func generateValue()

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))
	}
}