getASTVisitor($context); } public function getVisitor(ValidationContext $context) { return $this->getASTVisitor($context); } public function getASTVisitor(ASTValidationContext $context) { $directiveArgs = []; $schema = $context->getSchema(); $definedDirectives = $schema !== null ? $schema->getDirectives() : Directive::getInternalDirectives(); foreach ($definedDirectives as $directive) { $directiveArgs[$directive->name] = array_map( static function (FieldArgument $arg) : string { return $arg->name; }, $directive->args ); } $astDefinitions = $context->getDocument()->definitions; foreach ($astDefinitions as $def) { if (! ($def instanceof DirectiveDefinitionNode)) { continue; } $name = $def->name->value; if ($def->arguments !== null) { $directiveArgs[$name] = Utils::map( $def->arguments ?? [], static function (InputValueDefinitionNode $arg) : string { return $arg->name->value; } ); } else { $directiveArgs[$name] = []; } } return [ NodeKind::DIRECTIVE => static function (DirectiveNode $directiveNode) use ($directiveArgs, $context) : VisitorOperation { $directiveName = $directiveNode->name->value; $knownArgs = $directiveArgs[$directiveName] ?? null; if ($directiveNode->arguments === null || $knownArgs === null) { return Visitor::skipNode(); } foreach ($directiveNode->arguments as $argNode) { $argName = $argNode->name->value; if (in_array($argName, $knownArgs, true)) { continue; } $suggestions = Utils::suggestionList($argName, $knownArgs); $context->reportError(new Error( self::unknownDirectiveArgMessage($argName, $directiveName, $suggestions), [$argNode] )); } return Visitor::skipNode(); }, ]; } }