public function __invoke(ValidationContext $context)
{
$this->knownNames = [];
$this->knownNameStack = [];
return [NodeKind::OBJECT => ['enter' => function () {
$this->knownNameStack[] = $this->knownNames;
$this->knownNames = [];
}, 'leave' => function () {
$this->knownNames = array_pop($this->knownNameStack);
}], NodeKind::OBJECT_FIELD => function (ObjectFieldNode $node) use($context) {
$fieldName = $node->name->value;
if (!empty($this->knownNames[$fieldName])) {
$context->reportError(new Error(self::duplicateInputFieldMessage($fieldName), [$this->knownNames[$fieldName], $node->name]));
} else {
$this->knownNames[$fieldName] = $node->name;
}
return Visitor::skipNode();
}];
}