[ 'enter' => static function () use (&$variableNameDefined) : void { $variableNameDefined = []; }, 'leave' => static function (OperationDefinitionNode $operation) use (&$variableNameDefined, $context) : void { $usages = $context->getRecursiveVariableUsages($operation); foreach ($usages as $usage) { $node = $usage['node']; $varName = $node->name->value; if ($variableNameDefined[$varName] ?? false) { continue; } $context->reportError(new Error( self::undefinedVarMessage( $varName, $operation->name !== null ? $operation->name->value : null ), [$node, $operation] )); } }, ], NodeKind::VARIABLE_DEFINITION => static function (VariableDefinitionNode $def) use (&$variableNameDefined) : void { $variableNameDefined[$def->variable->name->value] = true; }, ]; } public static function undefinedVarMessage($varName, $opName = null) { return $opName ? sprintf('Variable "$%s" is not defined by operation "%s".', $varName, $opName) : sprintf('Variable "$%s" is not defined.', $varName); } }