func FlattenMembers()

in types/flatten.go [25:57]


func FlattenMembers(m []Member) []Member {
	embedded := []Member{}
	normal := []Member{}
	type nameInfo struct {
		top bool
		i   int
	}
	names := map[string]nameInfo{}
	for i := range m {
		if m[i].Embedded && m[i].Type.Kind == Struct {
			embedded = append(embedded, m[i])
		} else {
			normal = append(normal, m[i])
			names[m[i].Name] = nameInfo{true, len(normal) - 1}
		}
	}
	for i := range embedded {
		for _, e := range FlattenMembers(embedded[i].Type.Members) {
			if info, found := names[e.Name]; found {
				if info.top {
					continue
				}
				if n := normal[info.i]; n.Name == e.Name && n.Type == e.Type {
					continue
				}
				panic("conflicting members")
			}
			normal = append(normal, e)
			names[e.Name] = nameInfo{false, len(normal) - 1}
		}
	}
	return normal
}