From 72f63b7cdefa2b968814d6d5f22e3b64f4418a86 Mon Sep 17 00:00:00 2001 From: Ivan Goncharov Date: Mon, 11 Jun 2018 09:45:44 +0300 Subject: [PATCH] Split into separate PR --- src/validation/rules/NoFragmentCycles.js | 25 ++++++++++++------------ 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/src/validation/rules/NoFragmentCycles.js b/src/validation/rules/NoFragmentCycles.js index 1066e2a83b2..0a511227592 100644 --- a/src/validation/rules/NoFragmentCycles.js +++ b/src/validation/rules/NoFragmentCycles.js @@ -34,7 +34,9 @@ export function NoFragmentCycles(context: ValidationContext): ASTVisitor { return { OperationDefinition: () => false, FragmentDefinition(node) { - detectCycleRecursive(node); + if (!visitedFrags[node.name.value]) { + detectCycleRecursive(node); + } return false; }, }; @@ -43,10 +45,6 @@ export function NoFragmentCycles(context: ValidationContext): ASTVisitor { // It does not terminate when a cycle was found but continues to explore // the graph to find all possible cycles. function detectCycleRecursive(fragment: FragmentDefinitionNode) { - if (visitedFrags[fragment.name.value]) { - return; - } - const fragmentName = fragment.name.value; visitedFrags[fragmentName] = true; @@ -62,23 +60,24 @@ export function NoFragmentCycles(context: ValidationContext): ASTVisitor { const spreadName = spreadNode.name.value; const cycleIndex = spreadPathIndexByName[spreadName]; - spreadPath.push(spreadNode); if (cycleIndex === undefined) { - const spreadFragment = context.getFragment(spreadName); - if (spreadFragment) { - detectCycleRecursive(spreadFragment); + spreadPath.push(spreadNode); + if (!visitedFrags[spreadName]) { + const spreadFragment = context.getFragment(spreadName); + if (spreadFragment) { + detectCycleRecursive(spreadFragment); + } } + spreadPath.pop(); } else { const cyclePath = spreadPath.slice(cycleIndex); - const fragmentNames = cyclePath.slice(0, -1).map(s => s.name.value); context.reportError( new GraphQLError( - cycleErrorMessage(spreadName, fragmentNames), - cyclePath, + cycleErrorMessage(spreadName, cyclePath.map(s => s.name.value)), + cyclePath.concat(spreadNode), ), ); } - spreadPath.pop(); } spreadPathIndexByName[fragmentName] = undefined;