@@ -196,12 +196,8 @@ func (r *resolver) Resolve(lang, impLang, imp string) []resolve.FindResult {
196196 }
197197 if got , ok := known [imp ]; ok {
198198 res := make ([]resolve.FindResult , len (got ))
199- // use last-wins semantics by providing FindResults in reverse to how
200- // they were provided.
201- var index int
202- for i := len (got ) - 1 ; i >= 0 ; i -- {
203- res [index ] = resolve.FindResult {Label : got [i ]}
204- index ++
199+ for i , l := range got {
200+ res [i ] = resolve.FindResult {Label : l }
205201 }
206202 return res
207203 }
@@ -270,20 +266,16 @@ func (r *resolver) Install(c *config.Config) {
270266 // The resolve config has already processed resolve directives, and there's
271267 // no public API. Take somewhat extreme measures to augment it's internal
272268 // override list via unsafe memory reallocation.
273- overrides := make ([] overrideSpec , 0 )
269+ overrides := make (overrideSpec , 0 )
274270
275271 for key , known := range r .known {
276272 lang , impLang := keyLang (key )
277273 for imp , lbls := range known {
278274 for _ , lbl := range lbls {
279- overrides = append (overrides , overrideSpec {
280- imp : resolve.ImportSpec {
281- Lang : impLang ,
282- Imp : imp ,
283- },
275+ overrides [overrideKey {
276+ imp : resolve.ImportSpec {Lang : impLang , Imp : imp },
284277 lang : lang ,
285- dep : lbl ,
286- })
278+ }] = lbl
287279 }
288280 }
289281 }
@@ -333,32 +325,37 @@ func getResolveConfig(c *config.Config) interface{} {
333325
334326// rewriteResolveConfigOverrides reads the existing private attribute and
335327// appends more overrides.
336- func rewriteResolveConfigOverrides (rc interface {}, more [] overrideSpec ) {
328+ func rewriteResolveConfigOverrides (rc interface {}, more overrideSpec ) {
337329 rcv := reflect .ValueOf (rc ).Elem ()
338330 val := reflect .Indirect (rcv )
339331 member := val .FieldByName ("overrides" )
340332 ptrToOverrides := unsafe .Pointer (member .UnsafeAddr ())
341- overrides := (* [] overrideSpec )(ptrToOverrides )
333+ overrides := (* overrideSpec )(ptrToOverrides )
342334
343335 // create new array: FindRuleWithOverride searches last entries first, so
344336 // respect the users own resolve directives by putting them last
345- newOverrides := make ([]overrideSpec , 0 )
346- newOverrides = append (newOverrides , more ... )
347- newOverrides = append (newOverrides , * overrides ... )
337+ newOverrides := make (overrideSpec , 0 )
338+ for k , v := range more {
339+ newOverrides [k ] = v
340+ }
341+ for k , v := range * overrides {
342+ newOverrides [k ] = v
343+ }
348344
349345 // reassign memory value
350346 * overrides = newOverrides
351347}
352348
353- // overrideSpec is a copy of the same private type in resolve/config.go. It must be
354- // kept in sync with the original to avoid discrepancy with the expected memory
355- // layout.
356- type overrideSpec struct {
349+ type overrideKey struct {
357350 imp resolve.ImportSpec
358351 lang string
359- dep label.Label
360352}
361353
354+ // overrideSpec is a copy of the same private type in resolve/config.go. It must be
355+ // kept in sync with the original to avoid discrepancy with the expected memory
356+ // layout.
357+ type overrideSpec map [overrideKey ]label.Label
358+
362359func langKey (lang , impLang string ) string {
363360 return lang + " " + impLang
364361}
@@ -367,3 +364,4 @@ func keyLang(key string) (string, string) {
367364 parts := strings .SplitN (key , " " , 2 )
368365 return parts [0 ], parts [1 ]
369366}
367+
0 commit comments