1919import graphql .language .TypeName ;
2020import graphql .schema .GraphQLCompositeType ;
2121import graphql .schema .GraphQLFieldDefinition ;
22+ import graphql .schema .GraphQLFieldsContainer ;
2223import graphql .schema .GraphQLObjectType ;
2324import graphql .schema .GraphQLSchema ;
2425import graphql .schema .GraphQLUnmodifiedType ;
@@ -167,7 +168,7 @@ private List<Node> childrenOf(Node selection) {
167168
168169 private void visitImpl (QueryVisitor visitFieldCallback , boolean preOrder ) {
169170 Map <Class <?>, Object > rootVars = new LinkedHashMap <>();
170- rootVars .put (QueryTraversalContext .class , new QueryTraversalContext (rootParentType , null , null ));
171+ rootVars .put (QueryTraversalContext .class , new QueryTraversalContext (rootParentType , rootParentType , null , null ));
171172
172173 QueryVisitor noOp = new QueryVisitorStub ();
173174 QueryVisitor preOrderCallback = preOrder ? visitFieldCallback : noOp ;
@@ -211,10 +212,10 @@ public TraversalControl visitInlineFragment(InlineFragment inlineFragment, Trave
211212 TypeName typeCondition = inlineFragment .getTypeCondition ();
212213 fragmentCondition = (GraphQLCompositeType ) schema .getType (typeCondition .getName ());
213214 } else {
214- fragmentCondition = parentEnv .getType ();
215+ fragmentCondition = parentEnv .getRawType ();
215216 }
216217 // for unions we only have other fragments inside
217- context .setVar (QueryTraversalContext .class , new QueryTraversalContext (fragmentCondition , parentEnv .getEnvironment (), inlineFragment ));
218+ context .setVar (QueryTraversalContext .class , new QueryTraversalContext (fragmentCondition , fragmentCondition , parentEnv .getEnvironment (), inlineFragment ));
218219 return TraversalControl .CONTINUE ;
219220 }
220221
@@ -242,7 +243,7 @@ public TraversalControl visitFragmentSpread(FragmentSpread fragmentSpread, Trave
242243 GraphQLCompositeType typeCondition = (GraphQLCompositeType ) schema .getType (fragmentDefinition .getTypeCondition ().getName ());
243244
244245 context
245- .setVar (QueryTraversalContext .class , new QueryTraversalContext (typeCondition , parentEnv .getEnvironment (), fragmentDefinition ));
246+ .setVar (QueryTraversalContext .class , new QueryTraversalContext (typeCondition , typeCondition , parentEnv .getEnvironment (), fragmentDefinition ));
246247 return TraversalControl .CONTINUE ;
247248 }
248249
@@ -252,9 +253,18 @@ public TraversalControl visitField(Field field, TraverserContext<Node> context)
252253 .getParentContext ()
253254 .getVar (QueryTraversalContext .class );
254255
255- GraphQLFieldDefinition fieldDefinition = Introspection .getFieldDef (schema , parentEnv .getType (), field .getName ());
256+ GraphQLFieldDefinition fieldDefinition = Introspection .getFieldDef (schema , parentEnv .getRawType (), field .getName ());
257+ boolean isTypeNameIntrospectionField = fieldDefinition == Introspection .TypeNameMetaFieldDef ;
258+ GraphQLFieldsContainer fieldsContainer = !isTypeNameIntrospectionField ? (GraphQLFieldsContainer ) unwrapAll (parentEnv .getOutputType ()) : null ;
256259 Map <String , Object > argumentValues = valuesResolver .getArgumentValues (schema .getFieldVisibility (), fieldDefinition .getArguments (), field .getArguments (), variables );
257- QueryVisitorFieldEnvironment environment = new QueryVisitorFieldEnvironmentImpl (field , fieldDefinition , parentEnv .getType (), parentEnv .getEnvironment (), argumentValues , parentEnv .getSelectionSetContainer ());
260+ QueryVisitorFieldEnvironment environment = new QueryVisitorFieldEnvironmentImpl (isTypeNameIntrospectionField ,
261+ field ,
262+ fieldDefinition ,
263+ parentEnv .getOutputType (),
264+ fieldsContainer ,
265+ parentEnv .getEnvironment (),
266+ argumentValues ,
267+ parentEnv .getSelectionSetContainer ());
258268
259269 LeaveOrEnter leaveOrEnter = context .getVar (LeaveOrEnter .class );
260270 if (leaveOrEnter == LEAVE ) {
@@ -269,8 +279,8 @@ public TraversalControl visitField(Field field, TraverserContext<Node> context)
269279
270280 GraphQLUnmodifiedType unmodifiedType = unwrapAll (fieldDefinition .getType ());
271281 QueryTraversalContext fieldEnv = (unmodifiedType instanceof GraphQLCompositeType )
272- ? new QueryTraversalContext ((GraphQLCompositeType ) unmodifiedType , environment , field )
273- : new QueryTraversalContext (null , environment , field );// Terminal (scalar) node, EMPTY FRAME
282+ ? new QueryTraversalContext (fieldDefinition . getType (), (GraphQLCompositeType ) unmodifiedType , environment , field )
283+ : new QueryTraversalContext (null , null , environment , field );// Terminal (scalar) node, EMPTY FRAME
274284
275285
276286 context .setVar (QueryTraversalContext .class , fieldEnv );
0 commit comments