66 "go/token"
77 "os"
88 "path/filepath"
9+ "sort"
910 "strings"
1011 "sync"
1112
@@ -36,19 +37,19 @@ func (ja *JzeroApi) separateTypesGo(apiFiles []string, apiSpecMap map[string]*sp
3637
3738// apiFileTypes 表示 API 文件的类型信息
3839type apiFileTypes struct {
39- file string
40- types []spec.Type
41- goPackage string
42- typesGoBytes []byte
40+ file string
41+ types []spec.Type
42+ goPackage string
4343}
4444
4545// collectAndGenerateTypesByPackage 收集并按包生成 types.go 文件
4646func (ja * JzeroApi ) collectAndGenerateTypesByPackage (apiFiles []string , apiSpecMap map [string ]* spec.ApiSpec ) (typesWithPackage []apiFileTypes , typesWithoutPackage []spec.Type , err error ) {
4747 var eg errgroup.Group
4848 var mu sync.Mutex
49- results := make ([]apiFileTypes , 0 , len (apiFiles ))
49+ resultsByFile := make ([]apiFileTypes , len (apiFiles ))
5050
51- for _ , apiFile := range apiFiles {
51+ for i , apiFile := range apiFiles {
52+ index := i
5253 currentFile := apiFile
5354 currentSpec := apiSpecMap [apiFile ]
5455
@@ -59,11 +60,7 @@ func (ja *JzeroApi) collectAndGenerateTypesByPackage(apiFiles []string, apiSpecM
5960 }
6061
6162 mu .Lock ()
62- if fileTypes .goPackage != "" {
63- results = append (results , fileTypes )
64- } else {
65- typesWithoutPackage = append (typesWithoutPackage , fileTypes .types ... )
66- }
63+ resultsByFile [index ] = fileTypes
6764 mu .Unlock ()
6865
6966 return nil
@@ -74,12 +71,32 @@ func (ja *JzeroApi) collectAndGenerateTypesByPackage(apiFiles []string, apiSpecM
7471 return nil , nil , err
7572 }
7673
74+ results := make ([]apiFileTypes , 0 , len (apiFiles ))
75+ typesByPackage := make (map [string ][]spec.Type )
76+
77+ for _ , fileTypes := range resultsByFile {
78+ if fileTypes .goPackage != "" {
79+ results = append (results , fileTypes )
80+ typesByPackage [fileTypes .goPackage ] = append (typesByPackage [fileTypes .goPackage ], fileTypes .types ... )
81+ continue
82+ }
83+
84+ typesWithoutPackage = append (typesWithoutPackage , fileTypes .types ... )
85+ }
86+
7787 // 并发生成有 go_package 的 types.go 文件
7888 eg = errgroup.Group {}
79- for _ , fileTypes := range results {
80- currentTypes := fileTypes
89+ goPackages := make ([]string , 0 , len (typesByPackage ))
90+ for goPackage := range typesByPackage {
91+ goPackages = append (goPackages , goPackage )
92+ }
93+ sort .Strings (goPackages )
94+
95+ for _ , goPackage := range goPackages {
96+ currentPackage := goPackage
97+ currentTypes := typesByPackage [goPackage ]
8198 eg .Go (func () error {
82- return ja .writeTypesFile (currentTypes . goPackage , currentTypes . typesGoBytes )
99+ return ja .writeTypesFile (currentPackage , currentTypes )
83100 })
84101 }
85102
@@ -92,11 +109,6 @@ func (ja *JzeroApi) collectAndGenerateTypesByPackage(apiFiles []string, apiSpecM
92109
93110// processApiFileTypes 处理单个 API 文件的类型
94111func (ja * JzeroApi ) processApiFileTypes (apiFile string , apiSpec * spec.ApiSpec ) (apiFileTypes , error ) {
95- typesGoString , err := gogen .BuildTypes (apiSpec .Types )
96- if err != nil {
97- return apiFileTypes {}, err
98- }
99-
100112 goPackage , hasGoPackage := apiSpec .Info .Properties ["go_package" ]
101113 if ! hasGoPackage || goPackage == "" {
102114 return apiFileTypes {
@@ -105,41 +117,25 @@ func (ja *JzeroApi) processApiFileTypes(apiFile string, apiSpec *spec.ApiSpec) (
105117 }, nil
106118 }
107119
108- packageName := strings .ToLower (strings .ReplaceAll (goPackage , "/" , "" ))
109- typesGoBytes , err := templatex .ParseTemplate ("inner_types.go" , map [string ]any {
110- "Types" : typesGoString ,
111- "Package" : packageName ,
112- }, []byte (`// Code generated by jzero. DO NOT EDIT.
113- package {{.Package}}
114-
115- import (
116- "time"
117- )
118-
119- var (
120- _ = time.Now()
121- )
122-
123- {{.Types}}` ))
124- if err != nil {
125- return apiFileTypes {}, err
126- }
127-
128120 return apiFileTypes {
129- file : apiFile ,
130- types : apiSpec .Types ,
131- goPackage : goPackage ,
132- typesGoBytes : typesGoBytes ,
121+ file : apiFile ,
122+ types : apiSpec .Types ,
123+ goPackage : goPackage ,
133124 }, nil
134125}
135126
136127// writeTypesFile 写入 types.go 文件
137- func (ja * JzeroApi ) writeTypesFile (goPackage string , typesGoBytes []byte ) error {
128+ func (ja * JzeroApi ) writeTypesFile (goPackage string , types []spec. Type ) error {
138129 typesDir := filepath .Join ("internal" , "types" , goPackage )
139130 if err := os .MkdirAll (typesDir , 0o755 ); err != nil {
140131 return err
141132 }
142133
134+ typesGoBytes , err := ja .renderTypesFile (types , strings .ToLower (strings .ReplaceAll (goPackage , "/" , "" )))
135+ if err != nil {
136+ return err
137+ }
138+
143139 process , err := gosimports .Process ("" , typesGoBytes , nil )
144140 if err != nil {
145141 return err
@@ -153,15 +149,30 @@ func (ja *JzeroApi) generateDefaultTypesFile(allTypes []spec.Type) error {
153149 // 去重
154150 uniqueTypes := ja .deduplicateTypes (allTypes )
155151
156- typesGoString , err := gogen . BuildTypes (uniqueTypes )
152+ typesGoBytes , err := ja . renderTypesFile (uniqueTypes , "types" )
157153 if err != nil {
158154 return err
159155 }
160156
157+ process , err := gosimports .Process ("" , typesGoBytes , nil )
158+ if err != nil {
159+ return err
160+ }
161+
162+ return os .WriteFile (filepath .Join ("internal" , "types" , "types.go" ), process , 0o644 )
163+ }
164+
165+ func (ja * JzeroApi ) renderTypesFile (types []spec.Type , packageName string ) ([]byte , error ) {
166+ typesGoString , err := gogen .BuildTypes (types )
167+ if err != nil {
168+ return nil , err
169+ }
170+
161171 typesGoBytes , err := templatex .ParseTemplate ("inner_types.go" , map [string ]any {
162- "Types" : typesGoString ,
172+ "Types" : typesGoString ,
173+ "Package" : packageName ,
163174 }, []byte (`// Code generated by jzero. DO NOT EDIT.
164- package types
175+ package {{.Package}}
165176
166177import (
167178 "time"
@@ -173,15 +184,10 @@ var (
173184
174185{{.Types}}` ))
175186 if err != nil {
176- return err
187+ return nil , err
177188 }
178189
179- process , err := gosimports .Process ("" , typesGoBytes , nil )
180- if err != nil {
181- return err
182- }
183-
184- return os .WriteFile (filepath .Join ("internal" , "types" , "types.go" ), process , 0o644 )
190+ return typesGoBytes , nil
185191}
186192
187193// deduplicateTypes 去重类型列表
0 commit comments