GraphQL\Validator\Rules\NoFragmentCycles::detectCycleRecursive PHP Метод

detectCycleRecursive() приватный Метод

private detectCycleRecursive ( FragmentDefinitionNode $fragment, ValidationContext $context )
$fragment GraphQL\Language\AST\FragmentDefinitionNode
$context GraphQL\Validator\ValidationContext
    private function detectCycleRecursive(FragmentDefinitionNode $fragment, ValidationContext $context)
    {
        $fragmentName = $fragment->name->value;
        $this->visitedFrags[$fragmentName] = true;
        $spreadNodes = $context->getFragmentSpreads($fragment);
        if (empty($spreadNodes)) {
            return;
        }
        $this->spreadPathIndexByName[$fragmentName] = count($this->spreadPath);
        for ($i = 0; $i < count($spreadNodes); $i++) {
            $spreadNode = $spreadNodes[$i];
            $spreadName = $spreadNode->name->value;
            $cycleIndex = isset($this->spreadPathIndexByName[$spreadName]) ? $this->spreadPathIndexByName[$spreadName] : null;
            if ($cycleIndex === null) {
                $this->spreadPath[] = $spreadNode;
                if (empty($this->visitedFrags[$spreadName])) {
                    $spreadFragment = $context->getFragment($spreadName);
                    if ($spreadFragment) {
                        $this->detectCycleRecursive($spreadFragment, $context);
                    }
                }
                array_pop($this->spreadPath);
            } else {
                $cyclePath = array_slice($this->spreadPath, $cycleIndex);
                $nodes = $cyclePath;
                if (is_array($spreadNode)) {
                    $nodes = array_merge($nodes, $spreadNode);
                } else {
                    $nodes[] = $spreadNode;
                }
                $context->reportError(new Error(self::cycleErrorMessage($spreadName, Utils::map($cyclePath, function ($s) {
                    return $s->name->value;
                })), $nodes));
            }
        }
        $this->spreadPathIndexByName[$fragmentName] = null;
    }