Skip to content

Commit 132a487

Browse files
authored
Merge pull request #753 from graph-gophers/refactor-lookupOrBuildExec
refactor(exec): lookupOrBuildExec
2 parents a0ad382 + e5d8331 commit 132a487

2 files changed

Lines changed: 23 additions & 11 deletions

File tree

internal/exec/resolvable/meta.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,13 @@ func newMeta(s *ast.Schema) *Meta {
2323
b := newBuilder(s, false)
2424

2525
metaSchema := s.Types["__Schema"].(*ast.ObjectTypeDefinition)
26-
so, err := b.makeObjectExec(metaSchema.Name, metaSchema.Fields, nil, nil, false, reflect.TypeFor[*introspection.Schema](), nil)
26+
so, err := b.populateObjectExec(&Object{}, metaSchema.Name, metaSchema.Fields, nil, nil, false, reflect.TypeFor[*introspection.Schema]())
2727
if err != nil {
2828
panic(err)
2929
}
3030

3131
metaType := s.Types["__Type"].(*ast.ObjectTypeDefinition)
32-
t, err := b.makeObjectExec(metaType.Name, metaType.Fields, nil, nil, false, reflect.TypeFor[*introspection.Type](), nil)
32+
t, err := b.populateObjectExec(&Object{}, metaType.Name, metaType.Fields, nil, nil, false, reflect.TypeFor[*introspection.Type]())
3333
if err != nil {
3434
panic(err)
3535
}

internal/exec/resolvable/resolvable.go

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -281,13 +281,11 @@ func (b *execBuilder) lookupOrBuildExec(t ast.Type, resolverType reflect.Type) (
281281
if !ok {
282282
ref = &resMapEntry{}
283283
b.resMap[k] = ref
284-
var shell *Object
285284
if isObjectLikeType(t) {
286-
shell = &Object{}
287-
ref.exec = shell
285+
ref.exec = &Object{}
288286
}
289287
var err error
290-
ref.exec, err = b.makeExec(t, resolverType, shell)
288+
ref.exec, err = b.makeExec(t, resolverType)
291289
if err != nil {
292290
ref.exec = nil
293291
delete(b.resMap, k)
@@ -297,19 +295,20 @@ func (b *execBuilder) lookupOrBuildExec(t ast.Type, resolverType reflect.Type) (
297295
return ref.exec, nil
298296
}
299297

300-
func (b *execBuilder) makeExec(t ast.Type, resolverType reflect.Type, shell *Object) (Resolvable, error) {
298+
func (b *execBuilder) makeExec(t ast.Type, resolverType reflect.Type) (Resolvable, error) {
299+
rawType := t
301300
var nonNull bool
302301
t, nonNull = unwrapNonNull(t)
303302

304303
switch t := t.(type) {
305304
case *ast.ObjectTypeDefinition:
306-
return b.makeObjectExec(t.Name, t.Fields, nil, t.Interfaces, nonNull, resolverType, shell)
305+
return b.makeObjectExec(rawType, t.Name, t.Fields, nil, t.Interfaces, nonNull, resolverType)
307306

308307
case *ast.InterfaceTypeDefinition:
309-
return b.makeObjectExec(t.Name, t.Fields, t.PossibleTypes, nil, nonNull, resolverType, shell)
308+
return b.makeObjectExec(rawType, t.Name, t.Fields, t.PossibleTypes, nil, nonNull, resolverType)
310309

311310
case *ast.Union:
312-
return b.makeObjectExec(t.Name, nil, t.UnionMemberTypes, nil, nonNull, resolverType, shell)
311+
return b.makeObjectExec(rawType, t.Name, nil, t.UnionMemberTypes, nil, nonNull, resolverType)
313312
}
314313

315314
if !nonNull {
@@ -362,11 +361,15 @@ func makeScalarExec(t *ast.ScalarTypeDefinition, resolverType reflect.Type) (Res
362361
return &Scalar{}, nil
363362
}
364363

365-
func (b *execBuilder) makeObjectExec(typeName string, fields ast.FieldsDefinition, possibleTypes []*ast.ObjectTypeDefinition, interfaces []*ast.InterfaceTypeDefinition, nonNull bool, resolverType reflect.Type, obj *Object) (*Object, error) {
364+
func (b *execBuilder) makeObjectExec(rawType ast.Type, typeName string, fields ast.FieldsDefinition, possibleTypes []*ast.ObjectTypeDefinition, interfaces []*ast.InterfaceTypeDefinition, nonNull bool, resolverType reflect.Type) (*Object, error) {
365+
obj := b.objectShell(rawType, resolverType)
366366
if obj == nil {
367367
obj = &Object{}
368368
}
369+
return b.populateObjectExec(obj, typeName, fields, possibleTypes, interfaces, nonNull, resolverType)
370+
}
369371

372+
func (b *execBuilder) populateObjectExec(obj *Object, typeName string, fields ast.FieldsDefinition, possibleTypes []*ast.ObjectTypeDefinition, interfaces []*ast.InterfaceTypeDefinition, nonNull bool, resolverType reflect.Type) (*Object, error) {
370373
if !nonNull {
371374
if resolverType.Kind() != reflect.Pointer && resolverType.Kind() != reflect.Interface {
372375
return nil, fmt.Errorf("%s is not a pointer or interface", resolverType)
@@ -522,6 +525,15 @@ func (b *execBuilder) makeObjectExec(typeName string, fields ast.FieldsDefinitio
522525
return obj, nil
523526
}
524527

528+
func (b *execBuilder) objectShell(t ast.Type, resolverType reflect.Type) *Object {
529+
ref, ok := b.resMap[typePair{t, resolverType}]
530+
if !ok {
531+
return nil
532+
}
533+
obj, _ := ref.exec.(*Object)
534+
return obj
535+
}
536+
525537
var (
526538
contextType = reflect.TypeFor[context.Context]()
527539
errorType = reflect.TypeFor[error]()

0 commit comments

Comments
 (0)