@@ -14,9 +14,8 @@ import (
14
14
)
15
15
16
16
type genericTypeSpec struct {
17
- ArrayDepth int
18
- TypeSpec * TypeSpecDef
19
- Name string
17
+ TypeSpec * TypeSpecDef
18
+ Name string
20
19
}
21
20
22
21
type formalParamType struct {
@@ -31,6 +30,87 @@ func (t *genericTypeSpec) TypeName() string {
31
30
return t .Name
32
31
}
33
32
33
+ func normalizeGenericTypeName (name string ) string {
34
+ return strings .Replace (name , "." , "_" , - 1 )
35
+ }
36
+
37
+ func (pkgDefs * PackagesDefinitions ) getTypeFromGenericParam (genericParam string , file * ast.File ) (typeSpecDef * TypeSpecDef ) {
38
+ if strings .HasPrefix (genericParam , "[]" ) {
39
+ typeSpecDef = pkgDefs .getTypeFromGenericParam (genericParam [2 :], file )
40
+ if typeSpecDef == nil {
41
+ return nil
42
+ }
43
+ var expr ast.Expr
44
+ switch typeSpecDef .TypeSpec .Type .(type ) {
45
+ case * ast.ArrayType , * ast.MapType :
46
+ expr = typeSpecDef .TypeSpec .Type
47
+ default :
48
+ name := typeSpecDef .TypeName ()
49
+ expr = ast .NewIdent (name )
50
+ if _ , ok := pkgDefs .uniqueDefinitions [name ]; ! ok {
51
+ pkgDefs .uniqueDefinitions [name ] = typeSpecDef
52
+ }
53
+ }
54
+ return & TypeSpecDef {
55
+ TypeSpec : & ast.TypeSpec {
56
+ Name : ast .NewIdent (string (IgnoreNameOverridePrefix ) + "array_" + typeSpecDef .TypeName ()),
57
+ Type : & ast.ArrayType {
58
+ Elt : expr ,
59
+ },
60
+ },
61
+ Enums : typeSpecDef .Enums ,
62
+ PkgPath : typeSpecDef .PkgPath ,
63
+ ParentSpec : typeSpecDef .ParentSpec ,
64
+ NotUnique : false ,
65
+ }
66
+ }
67
+
68
+ if strings .HasPrefix (genericParam , "map[" ) {
69
+ parts := strings .SplitN (genericParam [4 :], "]" , 2 )
70
+ if len (parts ) != 2 {
71
+ return nil
72
+ }
73
+ typeSpecDef = pkgDefs .getTypeFromGenericParam (parts [1 ], file )
74
+ if typeSpecDef == nil {
75
+ return nil
76
+ }
77
+ var expr ast.Expr
78
+ switch typeSpecDef .TypeSpec .Type .(type ) {
79
+ case * ast.ArrayType , * ast.MapType :
80
+ expr = typeSpecDef .TypeSpec .Type
81
+ default :
82
+ name := typeSpecDef .TypeName ()
83
+ expr = ast .NewIdent (name )
84
+ if _ , ok := pkgDefs .uniqueDefinitions [name ]; ! ok {
85
+ pkgDefs .uniqueDefinitions [name ] = typeSpecDef
86
+ }
87
+ }
88
+ return & TypeSpecDef {
89
+ TypeSpec : & ast.TypeSpec {
90
+ Name : ast .NewIdent (string (IgnoreNameOverridePrefix ) + "map_" + parts [0 ] + "_" + typeSpecDef .TypeName ()),
91
+ Type : & ast.MapType {
92
+ Key : ast .NewIdent (parts [0 ]), //assume key is string or integer
93
+ Value : expr ,
94
+ },
95
+ },
96
+ Enums : typeSpecDef .Enums ,
97
+ PkgPath : typeSpecDef .PkgPath ,
98
+ ParentSpec : typeSpecDef .ParentSpec ,
99
+ NotUnique : false ,
100
+ }
101
+
102
+ }
103
+ if IsGolangPrimitiveType (genericParam ) {
104
+ return & TypeSpecDef {
105
+ TypeSpec : & ast.TypeSpec {
106
+ Name : ast .NewIdent (genericParam ),
107
+ Type : ast .NewIdent (genericParam ),
108
+ },
109
+ }
110
+ }
111
+ return pkgDefs .FindTypeSpec (genericParam , file )
112
+ }
113
+
34
114
func (pkgDefs * PackagesDefinitions ) parametrizeGenericType (file * ast.File , original * TypeSpecDef , fullGenericForm string ) * TypeSpecDef {
35
115
if original == nil || original .TypeSpec .TypeParams == nil || len (original .TypeSpec .TypeParams .List ) == 0 {
36
116
return original
@@ -58,45 +138,31 @@ func (pkgDefs *PackagesDefinitions) parametrizeGenericType(file *ast.File, origi
58
138
genericParamTypeDefs := map [string ]* genericTypeSpec {}
59
139
60
140
for i , genericParam := range genericParams {
61
- arrayDepth := 0
62
- for {
63
- if len (genericParam ) <= 2 || genericParam [:2 ] != "[]" {
64
- break
141
+ var typeDef * TypeSpecDef
142
+ if ! IsGolangPrimitiveType (genericParam ) {
143
+ typeDef = pkgDefs .getTypeFromGenericParam (genericParam , file )
144
+ if typeDef != nil {
145
+ genericParam = typeDef .TypeName ()
146
+ if _ , ok := pkgDefs .uniqueDefinitions [genericParam ]; ! ok {
147
+ pkgDefs .uniqueDefinitions [genericParam ] = typeDef
148
+ }
65
149
}
66
- genericParam = genericParam [2 :]
67
- arrayDepth ++
68
150
}
69
-
70
- typeDef := pkgDefs .FindTypeSpec (genericParam , file )
71
- if typeDef != nil {
72
- genericParam = typeDef .TypeName ()
73
- if _ , ok := pkgDefs .uniqueDefinitions [genericParam ]; ! ok {
74
- pkgDefs .uniqueDefinitions [genericParam ] = typeDef
75
- }
76
- }
77
-
78
151
genericParamTypeDefs [formals [i ].Name ] = & genericTypeSpec {
79
- ArrayDepth : arrayDepth ,
80
- TypeSpec : typeDef ,
81
- Name : genericParam ,
152
+ TypeSpec : typeDef ,
153
+ Name : genericParam ,
82
154
}
83
155
}
84
156
85
157
name = fmt .Sprintf ("%s%s-" , string (IgnoreNameOverridePrefix ), original .TypeName ())
86
158
var nameParts []string
87
159
for _ , def := range formals {
88
160
if specDef , ok := genericParamTypeDefs [def .Name ]; ok {
89
- var prefix = ""
90
- if specDef .ArrayDepth == 1 {
91
- prefix = "array_"
92
- } else if specDef .ArrayDepth > 1 {
93
- prefix = fmt .Sprintf ("array%d_" , specDef .ArrayDepth )
94
- }
95
- nameParts = append (nameParts , prefix + specDef .TypeName ())
161
+ nameParts = append (nameParts , specDef .TypeName ())
96
162
}
97
163
}
98
164
99
- name += strings . Replace (strings .Join (nameParts , "-" ), "." , "_" , - 1 )
165
+ name += normalizeGenericTypeName (strings .Join (nameParts , "-" ))
100
166
101
167
if typeSpec , ok := pkgDefs .uniqueDefinitions [name ]; ok {
102
168
return typeSpec
@@ -180,11 +246,7 @@ func (pkgDefs *PackagesDefinitions) resolveGenericType(file *ast.File, expr ast.
180
246
switch astExpr := expr .(type ) {
181
247
case * ast.Ident :
182
248
if genTypeSpec , ok := genericParamTypeDefs [astExpr .Name ]; ok {
183
- retType := pkgDefs .getParametrizedType (genTypeSpec )
184
- for i := 0 ; i < genTypeSpec .ArrayDepth ; i ++ {
185
- retType = & ast.ArrayType {Elt : retType }
186
- }
187
- return retType
249
+ return pkgDefs .getParametrizedType (genTypeSpec )
188
250
}
189
251
case * ast.ArrayType :
190
252
return & ast.ArrayType {
0 commit comments