33import graphql .GraphQLContext ;
44import graphql .Internal ;
55import graphql .execution .CoercedVariables ;
6- import graphql .execution .ConditionalNodes ;
76import graphql .execution .ValuesResolver ;
7+ import graphql .execution .conditional .ConditionalNodes ;
88import graphql .introspection .Introspection ;
99import graphql .language .Argument ;
1010import graphql .language .Directive ;
@@ -68,7 +68,9 @@ public TraversalControl visitDirective(Directive node, TraverserContext<Node> co
6868
6969 @ Override
7070 public TraversalControl visitInlineFragment (InlineFragment inlineFragment , TraverserContext <Node > context ) {
71- if (!conditionalNodes .shouldInclude (variables , inlineFragment .getDirectives ())) {
71+ QueryTraversalContext parentEnv = context .getVarFromParents (QueryTraversalContext .class );
72+ GraphQLContext graphQLContext = parentEnv .getGraphQLContext ();
73+ if (!conditionalNodes .shouldInclude (variables , inlineFragment , graphQLContext )) {
7274 return TraversalControl .ABORT ;
7375 }
7476
@@ -82,7 +84,6 @@ public TraversalControl visitInlineFragment(InlineFragment inlineFragment, Trave
8284 preOrderCallback .visitInlineFragment (inlineFragmentEnvironment );
8385
8486 // inline fragments are allowed not have type conditions, if so the parent type counts
85- QueryTraversalContext parentEnv = context .getVarFromParents (QueryTraversalContext .class );
8687
8788 GraphQLCompositeType fragmentCondition ;
8889 if (inlineFragment .getTypeCondition () != null ) {
@@ -92,38 +93,41 @@ public TraversalControl visitInlineFragment(InlineFragment inlineFragment, Trave
9293 fragmentCondition = parentEnv .getUnwrappedOutputType ();
9394 }
9495 // for unions we only have other fragments inside
95- context .setVar (QueryTraversalContext .class , new QueryTraversalContext (fragmentCondition , parentEnv .getEnvironment (), inlineFragment ));
96+ context .setVar (QueryTraversalContext .class , new QueryTraversalContext (fragmentCondition , parentEnv .getEnvironment (), inlineFragment , graphQLContext ));
9697 return TraversalControl .CONTINUE ;
9798 }
9899
99100 @ Override
100- public TraversalControl visitFragmentDefinition (FragmentDefinition node , TraverserContext <Node > context ) {
101- if (!conditionalNodes .shouldInclude (variables , node .getDirectives ())) {
101+ public TraversalControl visitFragmentDefinition (FragmentDefinition fragmentDefinition , TraverserContext <Node > context ) {
102+ QueryTraversalContext parentEnv = context .getVarFromParents (QueryTraversalContext .class );
103+ GraphQLContext graphQLContext = parentEnv .getGraphQLContext ();
104+ if (!conditionalNodes .shouldInclude (variables , fragmentDefinition , graphQLContext )) {
102105 return TraversalControl .ABORT ;
103106 }
104107
105- QueryVisitorFragmentDefinitionEnvironment fragmentEnvironment = new QueryVisitorFragmentDefinitionEnvironmentImpl (node , context , schema );
108+ QueryVisitorFragmentDefinitionEnvironment fragmentEnvironment = new QueryVisitorFragmentDefinitionEnvironmentImpl (fragmentDefinition , context , schema );
106109
107110 if (context .getPhase () == LEAVE ) {
108111 postOrderCallback .visitFragmentDefinition (fragmentEnvironment );
109112 return TraversalControl .CONTINUE ;
110113 }
111114 preOrderCallback .visitFragmentDefinition (fragmentEnvironment );
112115
113- QueryTraversalContext parentEnv = context .getVarFromParents (QueryTraversalContext .class );
114- GraphQLCompositeType typeCondition = (GraphQLCompositeType ) schema .getType (node .getTypeCondition ().getName ());
115- context .setVar (QueryTraversalContext .class , new QueryTraversalContext (typeCondition , parentEnv .getEnvironment (), node ));
116+ GraphQLCompositeType typeCondition = (GraphQLCompositeType ) schema .getType (fragmentDefinition .getTypeCondition ().getName ());
117+ context .setVar (QueryTraversalContext .class , new QueryTraversalContext (typeCondition , parentEnv .getEnvironment (), fragmentDefinition , graphQLContext ));
116118 return TraversalControl .CONTINUE ;
117119 }
118120
119121 @ Override
120122 public TraversalControl visitFragmentSpread (FragmentSpread fragmentSpread , TraverserContext <Node > context ) {
121- if (!conditionalNodes .shouldInclude (variables , fragmentSpread .getDirectives ())) {
123+ QueryTraversalContext parentEnv = context .getVarFromParents (QueryTraversalContext .class );
124+ GraphQLContext graphQLContext = parentEnv .getGraphQLContext ();
125+ if (!conditionalNodes .shouldInclude (variables , fragmentSpread , graphQLContext )) {
122126 return TraversalControl .ABORT ;
123127 }
124128
125129 FragmentDefinition fragmentDefinition = fragmentsByName .get (fragmentSpread .getName ());
126- if (!conditionalNodes .shouldInclude (variables , fragmentDefinition . getDirectives () )) {
130+ if (!conditionalNodes .shouldInclude (variables , fragmentDefinition , graphQLContext )) {
127131 return TraversalControl .ABORT ;
128132 }
129133
@@ -135,19 +139,19 @@ public TraversalControl visitFragmentSpread(FragmentSpread fragmentSpread, Trave
135139
136140 preOrderCallback .visitFragmentSpread (fragmentSpreadEnvironment );
137141
138- QueryTraversalContext parentEnv = context .getVarFromParents (QueryTraversalContext .class );
139142
140143 GraphQLCompositeType typeCondition = (GraphQLCompositeType ) schema .getType (fragmentDefinition .getTypeCondition ().getName ());
141144 assertNotNull (typeCondition ,
142145 () -> format ("Invalid type condition '%s' in fragment '%s'" , fragmentDefinition .getTypeCondition ().getName (),
143146 fragmentDefinition .getName ()));
144- context .setVar (QueryTraversalContext .class , new QueryTraversalContext (typeCondition , parentEnv .getEnvironment (), fragmentDefinition ));
147+ context .setVar (QueryTraversalContext .class , new QueryTraversalContext (typeCondition , parentEnv .getEnvironment (), fragmentDefinition , graphQLContext ));
145148 return TraversalControl .CONTINUE ;
146149 }
147150
148151 @ Override
149152 public TraversalControl visitField (Field field , TraverserContext <Node > context ) {
150153 QueryTraversalContext parentEnv = context .getVarFromParents (QueryTraversalContext .class );
154+ GraphQLContext graphQLContext = parentEnv .getGraphQLContext ();
151155
152156 GraphQLFieldDefinition fieldDefinition = Introspection .getFieldDef (schema , (GraphQLCompositeType ) unwrapAll (parentEnv .getOutputType ()), field .getName ());
153157 boolean isTypeNameIntrospectionField = fieldDefinition == schema .getIntrospectionTypenameFieldDefinition ();
@@ -174,16 +178,16 @@ public TraversalControl visitField(Field field, TraverserContext<Node> context)
174178 return TraversalControl .CONTINUE ;
175179 }
176180
177- if (!conditionalNodes .shouldInclude (variables , field . getDirectives () )) {
181+ if (!conditionalNodes .shouldInclude (variables , field , graphQLContext )) {
178182 return TraversalControl .ABORT ;
179183 }
180184
181185 TraversalControl traversalControl = preOrderCallback .visitFieldWithControl (environment );
182186
183187 GraphQLUnmodifiedType unmodifiedType = unwrapAll (fieldDefinition .getType ());
184188 QueryTraversalContext fieldEnv = (unmodifiedType instanceof GraphQLCompositeType )
185- ? new QueryTraversalContext (fieldDefinition .getType (), environment , field )
186- : new QueryTraversalContext (null , environment , field );// Terminal (scalar) node, EMPTY FRAME
189+ ? new QueryTraversalContext (fieldDefinition .getType (), environment , field , graphQLContext )
190+ : new QueryTraversalContext (null , environment , field , graphQLContext );// Terminal (scalar) node, EMPTY FRAME
187191
188192
189193 context .setVar (QueryTraversalContext .class , fieldEnv );
0 commit comments