func makeFieldUnfolder()

in gotype/unfold_struct.go [125:149]


func makeFieldUnfolder(ctx *unfoldCtx, st reflect.StructField) (fieldUnfolder, error) {
	fu := fieldUnfolder{offset: st.Offset}
	targetType := reflect.PtrTo(st.Type)

	if uu := lookupReflUser(ctx, targetType); uu != nil {
		fu.initState = wrapReflUnfolder(st.Type, uu)
	} else if targetType.Implements(tExpander) {
		fu.initState = wrapReflUnfolder(st.Type, newExpanderInit())
	} else if pu := lookupGoPtrUnfolder(st.Type); pu != nil {
		fu.initState = pu.initState
	} else {
		ru, err := lookupReflUnfolder(ctx, targetType, false)
		if err != nil {
			return fu, err
		}

		if su, ok := ru.(*unfolderStruct); ok {
			fu.initState = su.initStatePtr
		} else {
			fu.initState = wrapReflUnfolder(st.Type, ru)
		}
	}

	return fu, nil
}