@@ -5,9 +5,11 @@ package model
55
66import (
77 "fmt"
8+ "sort"
89 "strings"
910
1011 "github.com/Azure/azure-sdk-for-go/eng/tools/internal/delta"
12+ "github.com/Azure/azure-sdk-for-go/eng/tools/internal/exports"
1113 "github.com/Azure/azure-sdk-for-go/eng/tools/internal/markdown"
1214 "github.com/Azure/azure-sdk-for-go/eng/tools/internal/report"
1315)
@@ -124,19 +126,20 @@ func getNewContents(c *delta.Content) []string {
124126 var items []string
125127
126128 if len (c .Consts ) > 0 {
127- for k := range c .Consts {
129+ for _ , k := range sortChangeItem ( c .Consts ) {
128130 line := fmt .Sprintf ("New const `%s`" , k )
129131 items = append (items , line )
130132 }
131133 }
132134 if len (c .TypeAliases ) > 0 {
133- for k := range c .TypeAliases {
135+ for _ , k := range sortChangeItem ( c .TypeAliases ) {
134136 line := fmt .Sprintf ("New type alias `%s`" , k )
135137 items = append (items , line )
136138 }
137139 }
138140 if len (c .Funcs ) > 0 {
139- for k , v := range c .Funcs {
141+ for _ , k := range sortFuncItem (c .Funcs ) {
142+ v := c .Funcs [k ]
140143 params := ""
141144 if v .Params != nil {
142145 params = * v .Params
@@ -160,13 +163,14 @@ func getNewContents(c *delta.Content) []string {
160163 }
161164 if len (c .Structs ) > 0 {
162165 modified := c .GetModifiedStructs ()
163- for s , f := range modified {
166+ for _ , s := range sortChangeItem (modified ) {
167+ f := modified [s ]
164168 for _ , af := range f .AnonymousFields {
165169 line := fmt .Sprintf ("New anonymous field `%s` in struct `%s`" , af , s )
166170 items = append (items , line )
167171 }
168- for f := range f .Fields {
169- line := fmt .Sprintf ("New field `%s` in struct `%s`" , f , s )
172+ for _ , field := range sortChangeItem ( f .Fields ) {
173+ line := fmt .Sprintf ("New field `%s` in struct `%s`" , field , s )
170174 items = append (items , line )
171175 }
172176 }
@@ -199,22 +203,24 @@ func getSignatureChangeItems(b *report.BreakingChanges) []string {
199203
200204 // write const changes
201205 if len (b .Consts ) > 0 {
202- for k , v := range b .Consts {
206+ for _ , k := range sortChangeItem (b .Consts ) {
207+ v := b .Consts [k ]
203208 line := fmt .Sprintf ("Const `%s` type has been changed from `%s` to `%s`" , k , v .From , v .To )
204209 items = append (items , line )
205210 }
206- // TODO -- sort?
207211 }
208212 // write type alias changes
209213 if len (b .TypeAliases ) > 0 {
210- for k , v := range b .TypeAliases {
214+ for _ , k := range sortChangeItem (b .TypeAliases ) {
215+ v := b .TypeAliases [k ]
211216 line := fmt .Sprintf ("Type alias `%s` type has been changed from `%s` to `%s`" , k , v .From , v .To )
212217 items = append (items , line )
213218 }
214219 }
215220 // write function changes
216221 if len (b .Funcs ) > 0 {
217- for k , v := range b .Funcs {
222+ for _ , k := range sortFuncItem (b .Funcs ) {
223+ v := b .Funcs [k ]
218224 if v .Params != nil {
219225 line := fmt .Sprintf ("Function `%s` parameter(s) have been changed from `(%s)` to `(%s)`" , k , v .Params .From , v .Params .To )
220226 items = append (items , line )
@@ -227,7 +233,8 @@ func getSignatureChangeItems(b *report.BreakingChanges) []string {
227233 }
228234 // write struct changes
229235 if len (b .Structs ) > 0 {
230- for k , v := range b .Structs {
236+ for _ , k := range sortChangeItem (b .Structs ) {
237+ v := b .Structs [k ]
231238 for f , d := range v .Fields {
232239 line := fmt .Sprintf ("Type of `%s.%s` has been changed from `%s` to `%s`" , k , f , d .From , d .To )
233240 items = append (items , line )
@@ -247,21 +254,21 @@ func getRemovedContent(removed *delta.Content) []string {
247254 var items []string
248255 // write constants
249256 if len (removed .Consts ) > 0 {
250- for k := range removed .Consts {
257+ for _ , k := range sortChangeItem ( removed .Consts ) {
251258 line := fmt .Sprintf ("Const `%s` has been removed" , k )
252259 items = append (items , line )
253260 }
254261 }
255262 // write type alias
256263 if len (removed .TypeAliases ) > 0 {
257- for k := range removed .TypeAliases {
264+ for _ , k := range sortChangeItem ( removed .TypeAliases ) {
258265 line := fmt .Sprintf ("Type alias `%s` has been removed" , k )
259266 items = append (items , line )
260267 }
261268 }
262269 // write functions
263270 if len (removed .Funcs ) > 0 {
264- for k := range removed .Funcs {
271+ for _ , k := range sortFuncItem ( removed .Funcs ) {
265272 line := fmt .Sprintf ("Function `%s` has been removed" , k )
266273 items = append (items , line )
267274 }
@@ -276,17 +283,79 @@ func getRemovedContent(removed *delta.Content) []string {
276283 // write struct modification (some fields are removed)
277284 modified := removed .GetModifiedStructs ()
278285 if len (modified ) > 0 {
279- for s , f := range modified {
286+ for _ , s := range sortChangeItem (modified ) {
287+ f := modified [s ]
280288 for _ , af := range f .AnonymousFields {
281289 line := fmt .Sprintf ("Field `%s` of struct `%s` has been removed" , af , s )
282290 items = append (items , line )
283291 }
284- for f := range f .Fields {
285- line := fmt .Sprintf ("Field `%s` of struct `%s` has been removed" , f , s )
292+ for _ , field := range sortChangeItem ( f .Fields ) {
293+ line := fmt .Sprintf ("Field `%s` of struct `%s` has been removed" , field , s )
286294 items = append (items , line )
287295 }
288296 }
289297 }
290298
291299 return items
292300}
301+
302+ type sortItem interface {
303+ delta.Signature | delta.StructDef | exports.Const | exports.TypeAlias | exports.Struct | string
304+ }
305+
306+ func sortChangeItem [T sortItem ](change map [string ]T ) []string {
307+ s := make ([]string , 0 , len (change ))
308+ for k := range change {
309+ s = append (s , k )
310+ }
311+
312+ sort .Strings (s )
313+ return s
314+ }
315+
316+ func sortFuncItem [T delta.FuncSig | exports.Func ](change map [string ]T ) []string {
317+ s := make ([]string , 0 , len (change ))
318+ for k := range change {
319+ s = append (s , k )
320+ }
321+
322+ sort .Slice (s , func (i , j int ) bool {
323+ si := removePattern (s [i ], getReturnValue (change [s [i ]]))
324+ sj := removePattern (s [j ], getReturnValue (change [s [j ]]))
325+ return si < sj
326+ })
327+
328+ return s
329+ }
330+
331+ func getReturnValue (t interface {}) string {
332+ switch value := t .(type ) {
333+ case delta.FuncSig :
334+ if value .Returns == nil {
335+ return ""
336+ }
337+ return value .Returns .To
338+ case exports.Func :
339+ if value .Returns == nil {
340+ return ""
341+ }
342+ return * value .Returns
343+ }
344+ return ""
345+ }
346+
347+ func removePattern (funcName string , returnValue string ) string {
348+ funcName = strings .TrimLeft (strings .TrimLeft (funcName , "*" ), "New" )
349+ before , after , b := strings .Cut (funcName , "." )
350+ if ! b {
351+ return funcName
352+ }
353+
354+ if strings .Contains (returnValue , "runtime.Poller" ) {
355+ after = strings .TrimLeft (after , "Begin" )
356+ } else if strings .Contains (returnValue , "runtime.Pager" ) {
357+ after = strings .TrimLeft (after , "New" )
358+ }
359+
360+ return fmt .Sprintf ("%s.%s" , before , after )
361+ }
0 commit comments