Skip to content

Commit dca6ebf

Browse files
committed
Ensure type references are not duplicated
1 parent 18f7300 commit dca6ebf

File tree

2 files changed

+24
-5
lines changed

2 files changed

+24
-5
lines changed

reference-gen/pkg/generator/references.go

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -68,25 +68,36 @@ func filterToPackageTypes(allReferences map[*types.Type][]*types.Type, pkgTypes
6868
// findTypeReferences converts a list of types to a map of types and types that
6969
// reference that type.
7070
func findTypeReferences(allTypes map[string]*types.Type) map[*types.Type][]*types.Type {
71-
m := make(map[*types.Type][]*types.Type)
71+
m := make(map[*types.Type]typeSet)
7272
for _, typ := range allTypes {
7373
// Ensure every type is initialised, if not already
7474
if _, ok := m[typ]; !ok {
75-
m[typ] = []*types.Type{}
75+
m[typ] = make(typeSet)
7676
}
7777

7878
// add this type to other types that it references
7979
for _, member := range typ.Members {
8080
t := member.Type
8181
t = tryDereference(t)
82-
m[t] = append(m[t], typ)
82+
if _, ok := m[t]; !ok {
83+
m[t] = make(typeSet)
84+
}
85+
m[t].add(typ)
8386
}
8487

8588
// Cater for aliases rather than structs
8689
if typ.Underlying != nil {
8790
t := tryDereference(typ.Underlying)
88-
m[t] = append(m[t], typ)
91+
if _, ok := m[t]; !ok {
92+
m[t] = make(typeSet)
93+
}
94+
m[t].add(typ)
8995
}
9096
}
91-
return m
97+
98+
out := make(map[*types.Type][]*types.Type)
99+
for t, s := range m {
100+
out[t] = s.toList()
101+
}
102+
return out
92103
}

reference-gen/pkg/generator/utils.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,14 @@ func (s typeSet) has(required *types.Type) bool {
5858
return ok
5959
}
6060

61+
func (s typeSet) toList() []*types.Type {
62+
list := []*types.Type{}
63+
for typ := range s {
64+
list = append(list, typ)
65+
}
66+
return list
67+
}
68+
6169
func newTypeSetFromStringMap(typeMap map[string]*types.Type) typeSet {
6270
set := make(typeSet)
6371
for _, t := range typeMap {

0 commit comments

Comments
 (0)