@@ -25,6 +25,11 @@ const OpenTracingTagTrivial = "graphql.trivial"
25
25
const OpenTracingTagArgsPrefix = "graphql.args."
26
26
const OpenTracingTagError = "graphql.error"
27
27
28
+ type contextKey string
29
+ type FieldList map [string ]FieldList
30
+
31
+ const ResolverFields contextKey = "Resolver_Fields"
32
+
28
33
type Exec struct {
29
34
queryExec iExec
30
35
mutationExec iExec
@@ -498,8 +503,9 @@ func (e *objectExec) execSelectionSet(ctx context.Context, r *request, selSet *q
498
503
continue
499
504
}
500
505
506
+ namedFields := resolveFieldNames (make (FieldList ), sel .SelSet , r .doc )
501
507
execSel (func () {
502
- e .execField (ctx , r , sel , resolver , addResult )
508
+ e .execField (context . WithValue ( ctx , ResolverFields , namedFields ) , r , sel , resolver , addResult )
503
509
})
504
510
505
511
case * query.FragmentSpread :
@@ -533,6 +539,29 @@ func (e *objectExec) execSelectionSet(ctx context.Context, r *request, selSet *q
533
539
wg .Wait ()
534
540
}
535
541
542
+ func resolveFieldNames (namedFields FieldList , selSet * query.SelectionSet , doc * query.Document ) FieldList {
543
+ if selSet != nil {
544
+ for _ , selectionField := range selSet .Selections {
545
+ switch selectionField := selectionField .(type ) {
546
+ case * query.Field :
547
+ namedFields [selectionField .Name ] = make (FieldList )
548
+ resolveFieldNames (namedFields [selectionField .Name ], selectionField .SelSet , doc )
549
+ case * query.FragmentSpread :
550
+ frag , ok := doc .Fragments [selectionField .Name ]
551
+ if ! ok {
552
+ panic (fmt .Errorf ("fragment %q not found" , selectionField .Name )) // TODO proper error handling
553
+ }
554
+ resolveFieldNames (namedFields , frag .SelSet , doc )
555
+ case * query.InlineFragment :
556
+ resolveFieldNames (namedFields , selectionField .SelSet , doc )
557
+ default :
558
+ panic ("invalid type" )
559
+ }
560
+ }
561
+ }
562
+ return namedFields
563
+ }
564
+
536
565
func (e * objectExec ) execField (ctx context.Context , r * request , f * query.Field , resolver reflect.Value , addResult addResultFn ) {
537
566
switch f .Name {
538
567
case "__typename" :
0 commit comments