@@ -91,20 +91,80 @@ func reorderStructLiterals(f *dst.File, structDefs map[string][]string) {
9191 return true
9292 }
9393
94- typeName := extractTypeName (cl .Type )
95- if typeName == "" {
96- return true
94+ // Process this literal and all nested children for reordering
95+ reorderCompositeLitRecursive (cl , nil , structDefs )
96+
97+ // Don't let dst.Inspect descend into children - we handle them
98+ return false
99+ })
100+ }
101+
102+ func reorderCompositeLitRecursive (cl * dst.CompositeLit , inheritedFieldOrder []string , structDefs map [string ][]string ) {
103+ // Determine field order for THIS literal
104+ fieldOrder := resolveSortedFieldOrder (cl .Type , inheritedFieldOrder , structDefs )
105+
106+ // Reorder if we know the field order
107+ if len (fieldOrder ) > 0 {
108+ reorderCompositeLitFields (cl , fieldOrder )
109+ }
110+
111+ // Determine field order to pass to children (from element type)
112+ childFieldOrder := getElementSortedFieldOrder (cl .Type , structDefs )
113+
114+ // Process all child elements
115+ for _ , elt := range cl .Elts {
116+ reorderElementRecursive (elt , childFieldOrder , structDefs )
117+ }
118+ }
119+
120+ func reorderElementRecursive (elt dst.Expr , inheritedFieldOrder []string , structDefs map [string ][]string ) {
121+ switch e := elt .(type ) {
122+ case * dst.CompositeLit :
123+ reorderCompositeLitRecursive (e , inheritedFieldOrder , structDefs )
124+ case * dst.KeyValueExpr :
125+ // Value might be a composite literal (map values, struct fields)
126+ if child , ok := e .Value .(* dst.CompositeLit ); ok {
127+ reorderCompositeLitRecursive (child , inheritedFieldOrder , structDefs )
97128 }
129+ }
130+ }
98131
99- fieldOrder , exists := structDefs [typeName ]
100- if ! exists {
101- return true
132+ func resolveSortedFieldOrder (t dst.Expr , inherited []string , structDefs map [string ][]string ) []string {
133+ if t == nil {
134+ return inherited
135+ }
136+
137+ // Anonymous struct type - get field names from the (now sorted) struct
138+ if st , ok := t .(* dst.StructType ); ok {
139+ return getFieldNamesFromStructType (st )
140+ }
141+
142+ // Named type
143+ if typeName := extractTypeName (t ); typeName != "" {
144+ if order , exists := structDefs [typeName ]; exists {
145+ return order
102146 }
147+ }
103148
104- reorderCompositeLitFields (cl , fieldOrder )
149+ return nil
150+ }
105151
106- return true
107- })
152+ func getElementSortedFieldOrder (t dst.Expr , structDefs map [string ][]string ) []string {
153+ if t == nil {
154+ return nil
155+ }
156+
157+ // Slice/array: []T or [N]T
158+ if at , ok := t .(* dst.ArrayType ); ok {
159+ return resolveSortedFieldOrder (at .Elt , nil , structDefs )
160+ }
161+
162+ // Map: map[K]V - return value type's field order
163+ if mt , ok := t .(* dst.MapType ); ok {
164+ return resolveSortedFieldOrder (mt .Value , nil , structDefs )
165+ }
166+
167+ return nil
108168}
109169
110170func assembleFieldList (embedded , public , private []* dst.Field ) []* dst.Field {
@@ -188,6 +248,14 @@ func reorderCompositeLitFields(cl *dst.CompositeLit, fieldOrder []string) {
188248 return
189249 }
190250
251+ // Capture the original first element's decoration
252+ var originalFirstBefore dst.SpaceType
253+ if len (cl .Elts ) > 0 {
254+ if kv , ok := cl .Elts [0 ].(* dst.KeyValueExpr ); ok {
255+ originalFirstBefore = kv .Decs .Before
256+ }
257+ }
258+
191259 var newElts []dst.Expr
192260 for _ , fieldName := range fieldOrder {
193261 if kv , exists := keyedElts [fieldName ]; exists {
@@ -202,10 +270,11 @@ func reorderCompositeLitFields(cl *dst.CompositeLit, fieldOrder []string) {
202270
203271 newElts = append (newElts , nonKeyed ... )
204272
273+ // Preserve original decoration style
205274 for i , elt := range newElts {
206275 if kv , ok := elt .(* dst.KeyValueExpr ); ok {
207276 if i == 0 {
208- kv .Decs .Before = dst . NewLine
277+ kv .Decs .Before = originalFirstBefore
209278 } else {
210279 kv .Decs .Before = dst .None
211280 }
0 commit comments