@@ -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+
525537var (
526538 contextType = reflect .TypeFor [context.Context ]()
527539 errorType = reflect .TypeFor [error ]()
0 commit comments