Skip to content

Commit deaa0ab

Browse files
committed
Track the key of any named group objects.
As part of #380 we allowed names and groups tags/options to co-exist to ultimately support Fx feature request uber-go/fx#998. We now intend to support Map value groups as per uber-go/fx#1036. We will do this in 2 steps. 1. This PR will begin tracking any names passed into value groups with out changing any external facing functionality. 2. a subsequent PR will exploit this structure to support Map value groups.
1 parent 48e086f commit deaa0ab

File tree

6 files changed

+49
-34
lines changed

6 files changed

+49
-34
lines changed

constructor.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -213,15 +213,15 @@ func (n *constructorNode) Call(c containerStore) (err error) {
213213
// would be made to a containerWriter and defers them until Commit is called.
214214
type stagingContainerWriter struct {
215215
values map[key]reflect.Value
216-
groups map[key][]reflect.Value
216+
groups map[key][]keyedGroupValue
217217
}
218218

219219
var _ containerWriter = (*stagingContainerWriter)(nil)
220220

221221
func newStagingContainerWriter() *stagingContainerWriter {
222222
return &stagingContainerWriter{
223223
values: make(map[key]reflect.Value),
224-
groups: make(map[key][]reflect.Value),
224+
groups: make(map[key][]keyedGroupValue),
225225
}
226226
}
227227

@@ -233,12 +233,12 @@ func (sr *stagingContainerWriter) setDecoratedValue(_ string, _ reflect.Type, _
233233
digerror.BugPanicf("stagingContainerWriter.setDecoratedValue must never be called")
234234
}
235235

236-
func (sr *stagingContainerWriter) submitGroupedValue(group string, t reflect.Type, v reflect.Value) {
236+
func (sr *stagingContainerWriter) submitGroupedValue(group, mapKey string, t reflect.Type, v reflect.Value) {
237237
k := key{t: t, group: group}
238-
sr.groups[k] = append(sr.groups[k], v)
238+
sr.groups[k] = append(sr.groups[k], keyedGroupValue{key: mapKey, value: v})
239239
}
240240

241-
func (sr *stagingContainerWriter) submitDecoratedGroupedValue(_ string, _ reflect.Type, _ reflect.Value) {
241+
func (sr *stagingContainerWriter) submitDecoratedGroupedValue(_, _ string, _ reflect.Type, _ reflect.Value) {
242242
digerror.BugPanicf("stagingContainerWriter.submitDecoratedGroupedValue must never be called")
243243
}
244244

@@ -248,9 +248,9 @@ func (sr *stagingContainerWriter) Commit(cw containerWriter) {
248248
cw.setValue(k.name, k.t, v)
249249
}
250250

251-
for k, vs := range sr.groups {
252-
for _, v := range vs {
253-
cw.submitGroupedValue(k.group, k.t, v)
251+
for k, kgvs := range sr.groups {
252+
for _, kgv := range kgvs {
253+
cw.submitGroupedValue(k.group, kgv.key, k.t, kgv.value)
254254
}
255255
}
256256
}

container.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -82,12 +82,12 @@ type containerWriter interface {
8282
setDecoratedValue(name string, t reflect.Type, v reflect.Value)
8383

8484
// submitGroupedValue submits a value to the value group with the provided
85-
// name.
86-
submitGroupedValue(name string, t reflect.Type, v reflect.Value)
85+
// name and optional map key.
86+
submitGroupedValue(name, mapKey string, t reflect.Type, v reflect.Value)
8787

8888
// submitDecoratedGroupedValue submits a decorated value to the value group
89-
// with the provided name.
90-
submitDecoratedGroupedValue(name string, t reflect.Type, v reflect.Value)
89+
// with the provided name and optional map key.
90+
submitDecoratedGroupedValue(name, mapKey string, t reflect.Type, v reflect.Value)
9191
}
9292

9393
// containerStore provides access to the Container's underlying data store.
@@ -109,7 +109,7 @@ type containerStore interface {
109109
// Retrieves all values for the provided group and type.
110110
//
111111
// The order in which the values are returned is undefined.
112-
getValueGroup(name string, t reflect.Type) []reflect.Value
112+
getValueGroup(name string, t reflect.Type) []keyedGroupValue
113113

114114
// Retrieves all decorated values for the provided group and type, if any.
115115
getDecoratedValueGroup(name string, t reflect.Type) (reflect.Value, bool)
@@ -292,8 +292,8 @@ func (bs byTypeName) Swap(i int, j int) {
292292
bs[i], bs[j] = bs[j], bs[i]
293293
}
294294

295-
func shuffledCopy(rand *rand.Rand, items []reflect.Value) []reflect.Value {
296-
newItems := make([]reflect.Value, len(items))
295+
func shuffledCopy(rand *rand.Rand, items []keyedGroupValue) []keyedGroupValue {
296+
newItems := make([]keyedGroupValue, len(items))
297297
for i, j := range rand.Perm(len(items)) {
298298
newItems[i] = items[j]
299299
}

param.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -628,6 +628,7 @@ func (pt paramGroupedSlice) Build(c containerStore) (reflect.Value, error) {
628628
}
629629

630630
// Check if we have decorated values
631+
// qjeremy(how to handle this with maps?)
631632
if decoratedItems, ok := pt.getDecoratedValues(c); ok {
632633
return decoratedItems, nil
633634
}
@@ -646,7 +647,10 @@ func (pt paramGroupedSlice) Build(c containerStore) (reflect.Value, error) {
646647
stores := c.storesToRoot()
647648
result := reflect.MakeSlice(pt.Type, 0, itemCount)
648649
for _, c := range stores {
649-
result = reflect.Append(result, c.getValueGroup(pt.Group, pt.Type.Elem())...)
650+
kgvs := c.getValueGroup(pt.Group, pt.Type.Elem())
651+
for _, kgv := range kgvs {
652+
result = reflect.Append(result, kgv.value)
653+
}
650654
}
651655
return result, nil
652656
}

result.go

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -491,6 +491,9 @@ type resultGrouped struct {
491491
// Name of the group as specified in the `group:".."` tag.
492492
Group string
493493

494+
// Key if a name tag or option was provided, for populating maps
495+
Key string
496+
494497
// Type of value produced.
495498
Type reflect.Type
496499

@@ -527,8 +530,10 @@ func newResultGrouped(f reflect.StructField) (resultGrouped, error) {
527530
if err != nil {
528531
return resultGrouped{}, err
529532
}
533+
name := f.Tag.Get(_nameTag)
530534
rg := resultGrouped{
531535
Group: g.Name,
536+
Key: name,
532537
Flatten: g.Flatten,
533538
Type: f.Type,
534539
}
@@ -553,18 +558,19 @@ func newResultGrouped(f reflect.StructField) (resultGrouped, error) {
553558
func (rt resultGrouped) Extract(cw containerWriter, decorated bool, v reflect.Value) {
554559
// Decorated values are always flattened.
555560
if !decorated && !rt.Flatten {
556-
cw.submitGroupedValue(rt.Group, rt.Type, v)
561+
cw.submitGroupedValue(rt.Group, rt.Key, rt.Type, v)
557562
for _, asType := range rt.As {
558-
cw.submitGroupedValue(rt.Group, asType, v)
563+
cw.submitGroupedValue(rt.Group, rt.Key, asType, v)
559564
}
560565
return
561566
}
562567

563568
if decorated {
564-
cw.submitDecoratedGroupedValue(rt.Group, rt.Type, v)
569+
cw.submitDecoratedGroupedValue(rt.Group, rt.Key, rt.Type, v)
565570
return
566571
}
572+
// it's not possible to provide a key for the flattening case
567573
for i := 0; i < v.Len(); i++ {
568-
cw.submitGroupedValue(rt.Group, rt.Type, v.Index(i))
574+
cw.submitGroupedValue(rt.Group, "", rt.Type, v.Index(i))
569575
}
570576
}

result_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,7 @@ func TestNewResultObject(t *testing.T) {
196196
FieldName: "Writer",
197197
FieldIndex: 1,
198198
Results: []result{
199-
resultGrouped{Group: "writers", Type: typeOfWriter},
199+
resultGrouped{Group: "writers", Key: "writer1", Type: typeOfWriter},
200200
resultSingle{Name: "writer1", Type: typeOfWriter},
201201
},
202202
},

scope.go

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,11 @@ type ScopeOption interface {
3737
noScopeOption() // yet
3838
}
3939

40+
type keyedGroupValue struct {
41+
key string
42+
value reflect.Value
43+
}
44+
4045
// Scope is a scoped DAG of types and their dependencies.
4146
// A Scope may also have one or more child Scopes that inherit
4247
// from it.
@@ -63,10 +68,10 @@ type Scope struct {
6368
values map[key]reflect.Value
6469

6570
// Values groups that generated directly in the Scope.
66-
groups map[key][]reflect.Value
71+
groups map[key][]keyedGroupValue
6772

6873
// Values groups that generated via decoraters in the Scope.
69-
decoratedGroups map[key]reflect.Value
74+
decoratedGroups map[key]keyedGroupValue
7075

7176
// Source of randomness.
7277
rand *rand.Rand
@@ -103,8 +108,8 @@ func newScope() *Scope {
103108
decorators: make(map[key]*decoratorNode),
104109
values: make(map[key]reflect.Value),
105110
decoratedValues: make(map[key]reflect.Value),
106-
groups: make(map[key][]reflect.Value),
107-
decoratedGroups: make(map[key]reflect.Value),
111+
groups: make(map[key][]keyedGroupValue),
112+
decoratedGroups: make(map[key]keyedGroupValue),
108113
invokerFn: defaultInvoker,
109114
rand: rand.New(rand.NewSource(time.Now().UnixNano())),
110115
clockSrc: digclock.System,
@@ -202,25 +207,25 @@ func (s *Scope) setDecoratedValue(name string, t reflect.Type, v reflect.Value)
202207
s.decoratedValues[key{name: name, t: t}] = v
203208
}
204209

205-
func (s *Scope) getValueGroup(name string, t reflect.Type) []reflect.Value {
210+
func (s *Scope) getValueGroup(name string, t reflect.Type) []keyedGroupValue {
206211
items := s.groups[key{group: name, t: t}]
207212
// shuffle the list so users don't rely on the ordering of grouped values
208213
return shuffledCopy(s.rand, items)
209214
}
210215

211216
func (s *Scope) getDecoratedValueGroup(name string, t reflect.Type) (reflect.Value, bool) {
212217
items, ok := s.decoratedGroups[key{group: name, t: t}]
213-
return items, ok
218+
return items.value, ok
214219
}
215220

216-
func (s *Scope) submitGroupedValue(name string, t reflect.Type, v reflect.Value) {
221+
func (s *Scope) submitGroupedValue(name, mapKey string, t reflect.Type, v reflect.Value) {
217222
k := key{group: name, t: t}
218-
s.groups[k] = append(s.groups[k], v)
223+
s.groups[k] = append(s.groups[k], keyedGroupValue{key: mapKey, value: v})
219224
}
220225

221-
func (s *Scope) submitDecoratedGroupedValue(name string, t reflect.Type, v reflect.Value) {
226+
func (s *Scope) submitDecoratedGroupedValue(name, mapKey string, t reflect.Type, v reflect.Value) {
222227
k := key{group: name, t: t}
223-
s.decoratedGroups[k] = v
228+
s.decoratedGroups[k] = keyedGroupValue{key: mapKey, value: v}
224229
}
225230

226231
func (s *Scope) getValueProviders(name string, t reflect.Type) []provider {
@@ -326,9 +331,9 @@ func (s *Scope) String() string {
326331
for k, v := range s.values {
327332
fmt.Fprintln(b, "\t", k, "=>", v)
328333
}
329-
for k, vs := range s.groups {
330-
for _, v := range vs {
331-
fmt.Fprintln(b, "\t", k, "=>", v)
334+
for k, kgvs := range s.groups {
335+
for _, kgv := range kgvs {
336+
fmt.Fprintln(b, "\t", k, "=>", kgv.value)
332337
}
333338
}
334339
fmt.Fprintln(b, "}")

0 commit comments

Comments
 (0)