public getRecursiveVariableUsages ( |
||
$operation | ||
return | 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; }]; }
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; }]; }
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; }]; }