getRecursiveVariableUsages() публичный Метод

public getRecursiveVariableUsages ( OperationDefinitionNode $operation ) : array
$operation GraphQL\Language\AST\OperationDefinitionNode
Результат array List of ['node' => VariableNode, 'type' => ?InputObjectType]
 public function __invoke(ValidationContext $context)
 {
     return [NodeKind::OPERATION_DEFINITION => ['enter' => function () {
         $this->varDefMap = [];
     }, 'leave' => function (OperationDefinitionNode $operation) use($context) {
         $usages = $context->getRecursiveVariableUsages($operation);
         foreach ($usages as $usage) {
             $node = $usage['node'];
             $type = $usage['type'];
             $varName = $node->name->value;
             $varDef = isset($this->varDefMap[$varName]) ? $this->varDefMap[$varName] : null;
             if ($varDef && $type) {
                 // A var type is allowed if it is the same or more strict (e.g. is
                 // a subtype of) than the expected type. It can be more strict if
                 // the variable type is non-null when the expected type is nullable.
                 // If both are list types, the variable item type can be more strict
                 // than the expected item type (contravariant).
                 $schema = $context->getSchema();
                 $varType = TypeInfo::typeFromAST($schema, $varDef->type);
                 if ($varType && !TypeInfo::isTypeSubTypeOf($schema, $this->effectiveType($varType, $varDef), $type)) {
                     $context->reportError(new Error(self::badVarPosMessage($varName, $varType, $type), [$varDef, $node]));
                 }
             }
         }
     }], NodeKind::VARIABLE_DEFINITION => function (VariableDefinitionNode $varDefNode) {
         $this->varDefMap[$varDefNode->variable->name->value] = $varDefNode;
     }];
 }
Пример #2
0
 public function __invoke(ValidationContext $context)
 {
     $variableNameDefined = [];
     return [NodeKind::OPERATION_DEFINITION => ['enter' => function () use(&$variableNameDefined) {
         $variableNameDefined = [];
     }, 'leave' => function (OperationDefinitionNode $operation) use(&$variableNameDefined, $context) {
         $usages = $context->getRecursiveVariableUsages($operation);
         foreach ($usages as $usage) {
             $node = $usage['node'];
             $varName = $node->name->value;
             if (empty($variableNameDefined[$varName])) {
                 $context->reportError(new Error(self::undefinedVarMessage($varName, $operation->name ? $operation->name->value : null), [$node, $operation]));
             }
         }
     }], NodeKind::VARIABLE_DEFINITION => function (VariableDefinitionNode $def) use(&$variableNameDefined) {
         $variableNameDefined[$def->variable->name->value] = true;
     }];
 }
Пример #3
0
 public function __invoke(ValidationContext $context)
 {
     $this->variableDefs = [];
     return [Node::OPERATION_DEFINITION => ['enter' => function () {
         $this->variableDefs = [];
     }, 'leave' => function (OperationDefinition $operation) use($context) {
         $variableNameUsed = [];
         $usages = $context->getRecursiveVariableUsages($operation);
         $opName = $operation->name ? $operation->name->value : null;
         foreach ($usages as $usage) {
             $node = $usage['node'];
             $variableNameUsed[$node->name->value] = true;
         }
         foreach ($this->variableDefs as $variableDef) {
             $variableName = $variableDef->variable->name->value;
             if (empty($variableNameUsed[$variableName])) {
                 $context->reportError(new Error(self::unusedVariableMessage($variableName, $opName), [$variableDef]));
             }
         }
     }], Node::VARIABLE_DEFINITION => function ($def) {
         $this->variableDefs[] = $def;
     }];
 }