From ae540489f3ad8363cfab15a878879b7768bc41b8 Mon Sep 17 00:00:00 2001 From: Ruud Kamphuis Date: Wed, 26 Feb 2025 16:08:50 +0100 Subject: [PATCH 1/9] Make NodeVisitor Node argument covariant When creating a node visitor that uses more specific types, we get this error: ``` Parameter #2 $visitor of static method GraphQL\Language\Visitor::visit() expects array|(callable(GraphQL\Language\AST\Node): (GraphQL\Language\VisitorOperation|void|false|null))>, array{OperationDefinition: array{enter: Closure(GraphQL\Language\AST\OperationDefinitionNode): void, leave: Closure(): void}, Field: array{enter: Closure(GraphQL\Language\AST\FieldNode): void, leave: Closure(GraphQL\Language\AST\FieldNode): void}, InlineFragment: array{enter: Closure(GraphQL\Language\AST\InlineFragmentNode): void, leave: Closure(GraphQL\Language\AST\InlineFragmentNode): void}, FragmentDefinition: array{enter: Closure(GraphQL\Language\AST\FragmentDefinitionNode): void, leave: Closure(GraphQL\Language\AST\FragmentDefinitionNode): void}, SelectionSet: Closure(GraphQL\Language\AST\SelectionSetNode): void} given. ``` For the following code: ```php $ast = Visitor::visit($ast, [ NodeKind::OPERATION_DEFINITION => [ 'enter' => function (OperationDefinitionNode $node) : void { $this->parents[] = $node->operation; // Remove the operation name as we don't need this $node->name = null; }, 'leave' => function () : void { array_pop($this->parents); }, ], NodeKind::FIELD => [ 'enter' => function (FieldNode $node) : void { $this->parents[] = $node->name->value; }, 'leave' => function (FieldNode $node) : void { array_pop($this->parents); }, ], // ... ``` By changing the signature to `covariant` the problem goes away. --- docs/class-reference.md | 2 +- src/Language/Visitor.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/class-reference.md b/docs/class-reference.md index 63102a358..b96eccd69 100644 --- a/docs/class-reference.md +++ b/docs/class-reference.md @@ -1298,7 +1298,7 @@ visitor API: ] ]); -@phpstan-type NodeVisitor callable(Node): (VisitorOperation|null|false|void) +@phpstan-type NodeVisitor callable(covariant Node): (VisitorOperation|null|false|void) @phpstan-type VisitorArray array|array> @see \GraphQL\Tests\Language\VisitorTest diff --git a/src/Language/Visitor.php b/src/Language/Visitor.php index ad8892c7e..be4cef3d8 100644 --- a/src/Language/Visitor.php +++ b/src/Language/Visitor.php @@ -89,7 +89,7 @@ * ] * ]); * - * @phpstan-type NodeVisitor callable(Node): (VisitorOperation|null|false|void) + * @phpstan-type NodeVisitor callable(covariant Node): (VisitorOperation|null|false|void) * @phpstan-type VisitorArray array|array> * * @see \GraphQL\Tests\Language\VisitorTest From d83b95b4d9fef539a4977f14658db7430843c308 Mon Sep 17 00:00:00 2001 From: Ruud Kamphuis Date: Thu, 27 Feb 2025 14:16:17 +0100 Subject: [PATCH 2/9] Add fully VisitorArray shape --- docs/class-reference.md | 96 ++++++++++++++++++++++++++++++- src/Language/Visitor.php | 121 ++++++++++++++++++++++++++++++++++++++- 2 files changed, 213 insertions(+), 4 deletions(-) diff --git a/docs/class-reference.md b/docs/class-reference.md index b96eccd69..42f907334 100644 --- a/docs/class-reference.md +++ b/docs/class-reference.md @@ -1298,8 +1298,100 @@ visitor API: ] ]); -@phpstan-type NodeVisitor callable(covariant Node): (VisitorOperation|null|false|void) -@phpstan-type VisitorArray array|array> +@phpstan-type VisitorArray array{ +Name?: array{ +enter?: callable(NameNode): (VisitorOperation|null|false|void), +leave?: callable(NameNode): (VisitorOperation|null|false|void), +}|callable(NameNode): (VisitorOperation|null|false|void), +Document?: array{ +enter?: callable(DocumentNode): (VisitorOperation|null|false|void), +leave?: callable(DocumentNode): (VisitorOperation|null|false|void), +}|callable(DocumentNode): (VisitorOperation|null|false|void), +OperationDefinition?: array{ +enter?: callable(OperationDefinitionNode): (VisitorOperation|null|false|void), +leave?: callable(OperationDefinitionNode): (VisitorOperation|null|false|void), +}|callable(OperationDefinitionNode): (VisitorOperation|null|false|void), +VariableDefinition?: array{ +enter?: callable(VariableDefinitionNode): (VisitorOperation|null|false|void), +leave?: callable(VariableDefinitionNode): (VisitorOperation|null|false|void), +}|callable(VariableDefinitionNode): (VisitorOperation|null|false|void), +SchemaDefinition?: array{ +enter?: callable(SchemaDefinitionNode): (VisitorOperation|null|false|void), +leave?: callable(SchemaDefinitionNode): (VisitorOperation|null|false|void), +}|callable(SchemaDefinitionNode): (VisitorOperation|null|false|void), +OperationTypeDefinition?: array{ +enter?: callable(OperationTypeDefinitionNode): (VisitorOperation|null|false|void), +leave?: callable(OperationTypeDefinitionNode): (VisitorOperation|null|false|void), +}|callable(OperationTypeDefinitionNode): (VisitorOperation|null|false|void), +ScalarTypeDefinition?: array{ +enter?: callable(ScalarTypeDefinitionNode): (VisitorOperation|null|false|void), +leave?: callable(ScalarTypeDefinitionNode): (VisitorOperation|null|false|void), +}|callable(ScalarTypeDefinitionNode): (VisitorOperation|null|false|void), +ObjectTypeDefinition?: array{ +enter?: callable(ObjectTypeDefinitionNode): (VisitorOperation|null|false|void), +leave?: callable(ObjectTypeDefinitionNode): (VisitorOperation|null|false|void), +}|callable(ObjectTypeDefinitionNode): (VisitorOperation|null|false|void), +FieldDefinition?: array{ +enter?: callable(FieldDefinitionNode): (VisitorOperation|null|false|void), +leave?: callable(FieldDefinitionNode): (VisitorOperation|null|false|void), +}|callable(FieldDefinitionNode): (VisitorOperation|null|false|void), +InputValueDefinition?: array{ +enter?: callable(InputValueDefinitionNode): (VisitorOperation|null|false|void), +leave?: callable(InputValueDefinitionNode): (VisitorOperation|null|false|void), +}|callable(InputValueDefinitionNode): (VisitorOperation|null|false|void), +InterfaceTypeDefinition?: array{ +enter?: callable(InterfaceTypeDefinitionNode): (VisitorOperation|null|false|void), +leave?: callable(InterfaceTypeDefinitionNode): (VisitorOperation|null|false|void), +}|callable(InterfaceTypeDefinitionNode): (VisitorOperation|null|false|void), +UnionTypeDefinition?: array{ +enter?: callable(UnionTypeDefinitionNode): (VisitorOperation|null|false|void), +leave?: callable(UnionTypeDefinitionNode): (VisitorOperation|null|false|void), +}|callable(UnionTypeDefinitionNode): (VisitorOperation|null|false|void), +EnumTypeDefinition?: array{ +enter?: callable(EnumTypeDefinitionNode): (VisitorOperation|null|false|void), +leave?: callable(EnumTypeDefinitionNode): (VisitorOperation|null|false|void), +}|callable(EnumTypeDefinitionNode): (VisitorOperation|null|false|void), +EnumValueDefinition?: array{ +enter?: callable(EnumValueDefinitionNode): (VisitorOperation|null|false|void), +leave?: callable(EnumValueDefinitionNode): (VisitorOperation|null|false|void), +}|callable(EnumValueDefinitionNode): (VisitorOperation|null|false|void), +InputObjectTypeDefinition?: array{ +enter?: callable(InputObjectTypeDefinitionNode): (VisitorOperation|null|false|void), +leave?: callable(InputObjectTypeDefinitionNode): (VisitorOperation|null|false|void), +}|callable(InputObjectTypeDefinitionNode): (VisitorOperation|null|false|void), +SchemaExtension?: array{ +enter?: callable(SchemaExtensionNode): (VisitorOperation|null|false|void), +leave?: callable(SchemaExtensionNode): (VisitorOperation|null|false|void), +}|callable(SchemaExtensionNode): (VisitorOperation|null|false|void), +DirectiveDefinition?: array{ +enter?: callable(DirectiveDefinitionNode): (VisitorOperation|null|false|void), +leave?: callable(DirectiveDefinitionNode): (VisitorOperation|null|false|void), +}|callable(DirectiveDefinitionNode): (VisitorOperation|null|false|void), +ScalarTypeExtension?: array{ +enter?: callable(ScalarTypeExtensionNode): (VisitorOperation|null|false|void), +leave?: callable(ScalarTypeExtensionNode): (VisitorOperation|null|false|void), +}|callable(ScalarTypeExtensionNode): (VisitorOperation|null|false|void), +ObjectTypeExtension?: array{ +enter?: callable(ObjectTypeExtensionNode): (VisitorOperation|null|false|void), +leave?: callable(ObjectTypeExtensionNode): (VisitorOperation|null|false|void), +}|callable(ObjectTypeExtensionNode): (VisitorOperation|null|false|void), +InterfaceTypeExtension?: array{ +enter?: callable(InterfaceTypeExtensionNode): (VisitorOperation|null|false|void), +leave?: callable(InterfaceTypeExtensionNode): (VisitorOperation|null|false|void), +}|callable(InterfaceTypeExtensionNode): (VisitorOperation|null|false|void), +UnionTypeExtension?: array{ +enter?: callable(UnionTypeExtensionNode): (VisitorOperation|null|false|void), +leave?: callable(UnionTypeExtensionNode): (VisitorOperation|null|false|void), +}|callable(UnionTypeExtensionNode): (VisitorOperation|null|false|void), +EnumTypeExtension?: array{ +enter?: callable(EnumTypeExtensionNode): (VisitorOperation|null|false|void), +leave?: callable(EnumTypeExtensionNode): (VisitorOperation|null|false|void), +}|callable(EnumTypeExtensionNode): (VisitorOperation|null|false|void), +InputObjectTypeExtension?: array{ +enter?: callable(InputObjectTypeExtensionNode): (VisitorOperation|null|false|void), +leave?: callable(InputObjectTypeExtensionNode): (VisitorOperation|null|false|void), +}|callable(InputObjectTypeExtensionNode): (VisitorOperation|null|false|void), +} @see \GraphQL\Tests\Language\VisitorTest diff --git a/src/Language/Visitor.php b/src/Language/Visitor.php index be4cef3d8..9d8d53877 100644 --- a/src/Language/Visitor.php +++ b/src/Language/Visitor.php @@ -2,9 +2,32 @@ namespace GraphQL\Language; +use GraphQL\Language\AST\DirectiveDefinitionNode; +use GraphQL\Language\AST\DocumentNode; +use GraphQL\Language\AST\EnumTypeDefinitionNode; +use GraphQL\Language\AST\EnumTypeExtensionNode; +use GraphQL\Language\AST\EnumValueDefinitionNode; +use GraphQL\Language\AST\FieldDefinitionNode; +use GraphQL\Language\AST\InputObjectTypeDefinitionNode; +use GraphQL\Language\AST\InputObjectTypeExtensionNode; +use GraphQL\Language\AST\InputValueDefinitionNode; +use GraphQL\Language\AST\InterfaceTypeDefinitionNode; +use GraphQL\Language\AST\InterfaceTypeExtensionNode; +use GraphQL\Language\AST\NameNode; use GraphQL\Language\AST\Node; use GraphQL\Language\AST\NodeKind; use GraphQL\Language\AST\NodeList; +use GraphQL\Language\AST\ObjectTypeDefinitionNode; +use GraphQL\Language\AST\ObjectTypeExtensionNode; +use GraphQL\Language\AST\OperationDefinitionNode; +use GraphQL\Language\AST\OperationTypeDefinitionNode; +use GraphQL\Language\AST\ScalarTypeDefinitionNode; +use GraphQL\Language\AST\ScalarTypeExtensionNode; +use GraphQL\Language\AST\SchemaDefinitionNode; +use GraphQL\Language\AST\SchemaExtensionNode; +use GraphQL\Language\AST\UnionTypeDefinitionNode; +use GraphQL\Language\AST\UnionTypeExtensionNode; +use GraphQL\Language\AST\VariableDefinitionNode; use GraphQL\Utils\TypeInfo; use GraphQL\Utils\Utils; @@ -89,8 +112,102 @@ * ] * ]); * - * @phpstan-type NodeVisitor callable(covariant Node): (VisitorOperation|null|false|void) - * @phpstan-type VisitorArray array|array> + * @phpstan-type VisitorArray array{ + * enter?: callable(Node): (VisitorOperation|null|false|void), + * leave?: callable(Node): (VisitorOperation|null|false|void), + * Name?: array{ + * enter?: callable(NameNode): (VisitorOperation|null|false|void), + * leave?: callable(NameNode): (VisitorOperation|null|false|void), + * }|callable(NameNode): (VisitorOperation|null|false|void), + * Document?: array{ + * enter?: callable(DocumentNode): (VisitorOperation|null|false|void), + * leave?: callable(DocumentNode): (VisitorOperation|null|false|void), + * }|callable(DocumentNode): (VisitorOperation|null|false|void), + * OperationDefinition?: array{ + * enter?: callable(OperationDefinitionNode): (VisitorOperation|null|false|void), + * leave?: callable(OperationDefinitionNode): (VisitorOperation|null|false|void), + * }|callable(OperationDefinitionNode): (VisitorOperation|null|false|void), + * VariableDefinition?: array{ + * enter?: callable(VariableDefinitionNode): (VisitorOperation|null|false|void), + * leave?: callable(VariableDefinitionNode): (VisitorOperation|null|false|void), + * }|callable(VariableDefinitionNode): (VisitorOperation|null|false|void), + * SchemaDefinition?: array{ + * enter?: callable(SchemaDefinitionNode): (VisitorOperation|null|false|void), + * leave?: callable(SchemaDefinitionNode): (VisitorOperation|null|false|void), + * }|callable(SchemaDefinitionNode): (VisitorOperation|null|false|void), + * OperationTypeDefinition?: array{ + * enter?: callable(OperationTypeDefinitionNode): (VisitorOperation|null|false|void), + * leave?: callable(OperationTypeDefinitionNode): (VisitorOperation|null|false|void), + * }|callable(OperationTypeDefinitionNode): (VisitorOperation|null|false|void), + * ScalarTypeDefinition?: array{ + * enter?: callable(ScalarTypeDefinitionNode): (VisitorOperation|null|false|void), + * leave?: callable(ScalarTypeDefinitionNode): (VisitorOperation|null|false|void), + * }|callable(ScalarTypeDefinitionNode): (VisitorOperation|null|false|void), + * ObjectTypeDefinition?: array{ + * enter?: callable(ObjectTypeDefinitionNode): (VisitorOperation|null|false|void), + * leave?: callable(ObjectTypeDefinitionNode): (VisitorOperation|null|false|void), + * }|callable(ObjectTypeDefinitionNode): (VisitorOperation|null|false|void), + * FieldDefinition?: array{ + * enter?: callable(FieldDefinitionNode): (VisitorOperation|null|false|void), + * leave?: callable(FieldDefinitionNode): (VisitorOperation|null|false|void), + * }|callable(FieldDefinitionNode): (VisitorOperation|null|false|void), + * InputValueDefinition?: array{ + * enter?: callable(InputValueDefinitionNode): (VisitorOperation|null|false|void), + * leave?: callable(InputValueDefinitionNode): (VisitorOperation|null|false|void), + * }|callable(InputValueDefinitionNode): (VisitorOperation|null|false|void), + * InterfaceTypeDefinition?: array{ + * enter?: callable(InterfaceTypeDefinitionNode): (VisitorOperation|null|false|void), + * leave?: callable(InterfaceTypeDefinitionNode): (VisitorOperation|null|false|void), + * }|callable(InterfaceTypeDefinitionNode): (VisitorOperation|null|false|void), + * UnionTypeDefinition?: array{ + * enter?: callable(UnionTypeDefinitionNode): (VisitorOperation|null|false|void), + * leave?: callable(UnionTypeDefinitionNode): (VisitorOperation|null|false|void), + * }|callable(UnionTypeDefinitionNode): (VisitorOperation|null|false|void), + * EnumTypeDefinition?: array{ + * enter?: callable(EnumTypeDefinitionNode): (VisitorOperation|null|false|void), + * leave?: callable(EnumTypeDefinitionNode): (VisitorOperation|null|false|void), + * }|callable(EnumTypeDefinitionNode): (VisitorOperation|null|false|void), + * EnumValueDefinition?: array{ + * enter?: callable(EnumValueDefinitionNode): (VisitorOperation|null|false|void), + * leave?: callable(EnumValueDefinitionNode): (VisitorOperation|null|false|void), + * }|callable(EnumValueDefinitionNode): (VisitorOperation|null|false|void), + * InputObjectTypeDefinition?: array{ + * enter?: callable(InputObjectTypeDefinitionNode): (VisitorOperation|null|false|void), + * leave?: callable(InputObjectTypeDefinitionNode): (VisitorOperation|null|false|void), + * }|callable(InputObjectTypeDefinitionNode): (VisitorOperation|null|false|void), + * SchemaExtension?: array{ + * enter?: callable(SchemaExtensionNode): (VisitorOperation|null|false|void), + * leave?: callable(SchemaExtensionNode): (VisitorOperation|null|false|void), + * }|callable(SchemaExtensionNode): (VisitorOperation|null|false|void), + * DirectiveDefinition?: array{ + * enter?: callable(DirectiveDefinitionNode): (VisitorOperation|null|false|void), + * leave?: callable(DirectiveDefinitionNode): (VisitorOperation|null|false|void), + * }|callable(DirectiveDefinitionNode): (VisitorOperation|null|false|void), + * ScalarTypeExtension?: array{ + * enter?: callable(ScalarTypeExtensionNode): (VisitorOperation|null|false|void), + * leave?: callable(ScalarTypeExtensionNode): (VisitorOperation|null|false|void), + * }|callable(ScalarTypeExtensionNode): (VisitorOperation|null|false|void), + * ObjectTypeExtension?: array{ + * enter?: callable(ObjectTypeExtensionNode): (VisitorOperation|null|false|void), + * leave?: callable(ObjectTypeExtensionNode): (VisitorOperation|null|false|void), + * }|callable(ObjectTypeExtensionNode): (VisitorOperation|null|false|void), + * InterfaceTypeExtension?: array{ + * enter?: callable(InterfaceTypeExtensionNode): (VisitorOperation|null|false|void), + * leave?: callable(InterfaceTypeExtensionNode): (VisitorOperation|null|false|void), + * }|callable(InterfaceTypeExtensionNode): (VisitorOperation|null|false|void), + * UnionTypeExtension?: array{ + * enter?: callable(UnionTypeExtensionNode): (VisitorOperation|null|false|void), + * leave?: callable(UnionTypeExtensionNode): (VisitorOperation|null|false|void), + * }|callable(UnionTypeExtensionNode): (VisitorOperation|null|false|void), + * EnumTypeExtension?: array{ + * enter?: callable(EnumTypeExtensionNode): (VisitorOperation|null|false|void), + * leave?: callable(EnumTypeExtensionNode): (VisitorOperation|null|false|void), + * }|callable(EnumTypeExtensionNode): (VisitorOperation|null|false|void), + * InputObjectTypeExtension?: array{ + * enter?: callable(InputObjectTypeExtensionNode): (VisitorOperation|null|false|void), + * leave?: callable(InputObjectTypeExtensionNode): (VisitorOperation|null|false|void), + * }|callable(InputObjectTypeExtensionNode): (VisitorOperation|null|false|void), + * } * * @see \GraphQL\Tests\Language\VisitorTest */ From a3a75400a91e88226228f4340e87a4cb0de80d54 Mon Sep 17 00:00:00 2001 From: ruudk Date: Thu, 27 Feb 2025 13:30:02 +0000 Subject: [PATCH 3/9] Prettify docs --- docs/class-reference.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/class-reference.md b/docs/class-reference.md index 42f907334..8c6732052 100644 --- a/docs/class-reference.md +++ b/docs/class-reference.md @@ -1299,6 +1299,8 @@ visitor API: ]); @phpstan-type VisitorArray array{ +enter?: callable(Node): (VisitorOperation|null|false|void), +leave?: callable(Node): (VisitorOperation|null|false|void), Name?: array{ enter?: callable(NameNode): (VisitorOperation|null|false|void), leave?: callable(NameNode): (VisitorOperation|null|false|void), From 586d0faa972a9b4566f48512d6be394526db7055 Mon Sep 17 00:00:00 2001 From: Ruud Kamphuis Date: Thu, 27 Feb 2025 14:32:14 +0100 Subject: [PATCH 4/9] VisitorReturnType --- src/Language/Visitor.php | 143 ++++++++++++++++++++------------------- 1 file changed, 72 insertions(+), 71 deletions(-) diff --git a/src/Language/Visitor.php b/src/Language/Visitor.php index 9d8d53877..7f4d56239 100644 --- a/src/Language/Visitor.php +++ b/src/Language/Visitor.php @@ -112,101 +112,102 @@ * ] * ]); * + * @phpstan-type VisitorReturnType VisitorOperation|null|false|void * @phpstan-type VisitorArray array{ - * enter?: callable(Node): (VisitorOperation|null|false|void), - * leave?: callable(Node): (VisitorOperation|null|false|void), + * enter?: callable(Node): VisitorReturnType, + * leave?: callable(Node): VisitorReturnType, * Name?: array{ - * enter?: callable(NameNode): (VisitorOperation|null|false|void), - * leave?: callable(NameNode): (VisitorOperation|null|false|void), - * }|callable(NameNode): (VisitorOperation|null|false|void), + * enter?: callable(NameNode): VisitorReturnType, + * leave?: callable(NameNode): VisitorReturnType, + * }|callable(NameNode): VisitorReturnType, * Document?: array{ - * enter?: callable(DocumentNode): (VisitorOperation|null|false|void), - * leave?: callable(DocumentNode): (VisitorOperation|null|false|void), - * }|callable(DocumentNode): (VisitorOperation|null|false|void), + * enter?: callable(DocumentNode): VisitorReturnType, + * leave?: callable(DocumentNode): VisitorReturnType, + * }|callable(DocumentNode): VisitorReturnType, * OperationDefinition?: array{ - * enter?: callable(OperationDefinitionNode): (VisitorOperation|null|false|void), - * leave?: callable(OperationDefinitionNode): (VisitorOperation|null|false|void), - * }|callable(OperationDefinitionNode): (VisitorOperation|null|false|void), + * enter?: callable(OperationDefinitionNode): VisitorReturnType, + * leave?: callable(OperationDefinitionNode): VisitorReturnType, + * }|callable(OperationDefinitionNode): VisitorReturnType, * VariableDefinition?: array{ - * enter?: callable(VariableDefinitionNode): (VisitorOperation|null|false|void), - * leave?: callable(VariableDefinitionNode): (VisitorOperation|null|false|void), - * }|callable(VariableDefinitionNode): (VisitorOperation|null|false|void), + * enter?: callable(VariableDefinitionNode): VisitorReturnType, + * leave?: callable(VariableDefinitionNode): VisitorReturnType, + * }|callable(VariableDefinitionNode): VisitorReturnType, * SchemaDefinition?: array{ - * enter?: callable(SchemaDefinitionNode): (VisitorOperation|null|false|void), - * leave?: callable(SchemaDefinitionNode): (VisitorOperation|null|false|void), - * }|callable(SchemaDefinitionNode): (VisitorOperation|null|false|void), + * enter?: callable(SchemaDefinitionNode): VisitorReturnType, + * leave?: callable(SchemaDefinitionNode): VisitorReturnType, + * }|callable(SchemaDefinitionNode): VisitorReturnType, * OperationTypeDefinition?: array{ - * enter?: callable(OperationTypeDefinitionNode): (VisitorOperation|null|false|void), - * leave?: callable(OperationTypeDefinitionNode): (VisitorOperation|null|false|void), - * }|callable(OperationTypeDefinitionNode): (VisitorOperation|null|false|void), + * enter?: callable(OperationTypeDefinitionNode): VisitorReturnType, + * leave?: callable(OperationTypeDefinitionNode): VisitorReturnType, + * }|callable(OperationTypeDefinitionNode): VisitorReturnType, * ScalarTypeDefinition?: array{ - * enter?: callable(ScalarTypeDefinitionNode): (VisitorOperation|null|false|void), - * leave?: callable(ScalarTypeDefinitionNode): (VisitorOperation|null|false|void), - * }|callable(ScalarTypeDefinitionNode): (VisitorOperation|null|false|void), + * enter?: callable(ScalarTypeDefinitionNode): VisitorReturnType, + * leave?: callable(ScalarTypeDefinitionNode): VisitorReturnType, + * }|callable(ScalarTypeDefinitionNode): VisitorReturnType, * ObjectTypeDefinition?: array{ - * enter?: callable(ObjectTypeDefinitionNode): (VisitorOperation|null|false|void), - * leave?: callable(ObjectTypeDefinitionNode): (VisitorOperation|null|false|void), - * }|callable(ObjectTypeDefinitionNode): (VisitorOperation|null|false|void), + * enter?: callable(ObjectTypeDefinitionNode): VisitorReturnType, + * leave?: callable(ObjectTypeDefinitionNode): VisitorReturnType, + * }|callable(ObjectTypeDefinitionNode): VisitorReturnType, * FieldDefinition?: array{ - * enter?: callable(FieldDefinitionNode): (VisitorOperation|null|false|void), - * leave?: callable(FieldDefinitionNode): (VisitorOperation|null|false|void), - * }|callable(FieldDefinitionNode): (VisitorOperation|null|false|void), + * enter?: callable(FieldDefinitionNode): VisitorReturnType, + * leave?: callable(FieldDefinitionNode): VisitorReturnType, + * }|callable(FieldDefinitionNode): VisitorReturnType, * InputValueDefinition?: array{ - * enter?: callable(InputValueDefinitionNode): (VisitorOperation|null|false|void), - * leave?: callable(InputValueDefinitionNode): (VisitorOperation|null|false|void), - * }|callable(InputValueDefinitionNode): (VisitorOperation|null|false|void), + * enter?: callable(InputValueDefinitionNode): VisitorReturnType, + * leave?: callable(InputValueDefinitionNode): VisitorReturnType, + * }|callable(InputValueDefinitionNode): VisitorReturnType, * InterfaceTypeDefinition?: array{ - * enter?: callable(InterfaceTypeDefinitionNode): (VisitorOperation|null|false|void), - * leave?: callable(InterfaceTypeDefinitionNode): (VisitorOperation|null|false|void), - * }|callable(InterfaceTypeDefinitionNode): (VisitorOperation|null|false|void), + * enter?: callable(InterfaceTypeDefinitionNode): VisitorReturnType, + * leave?: callable(InterfaceTypeDefinitionNode): VisitorReturnType, + * }|callable(InterfaceTypeDefinitionNode): VisitorReturnType, * UnionTypeDefinition?: array{ - * enter?: callable(UnionTypeDefinitionNode): (VisitorOperation|null|false|void), - * leave?: callable(UnionTypeDefinitionNode): (VisitorOperation|null|false|void), - * }|callable(UnionTypeDefinitionNode): (VisitorOperation|null|false|void), + * enter?: callable(UnionTypeDefinitionNode): VisitorReturnType, + * leave?: callable(UnionTypeDefinitionNode): VisitorReturnType, + * }|callable(UnionTypeDefinitionNode): VisitorReturnType, * EnumTypeDefinition?: array{ - * enter?: callable(EnumTypeDefinitionNode): (VisitorOperation|null|false|void), - * leave?: callable(EnumTypeDefinitionNode): (VisitorOperation|null|false|void), - * }|callable(EnumTypeDefinitionNode): (VisitorOperation|null|false|void), + * enter?: callable(EnumTypeDefinitionNode): VisitorReturnType, + * leave?: callable(EnumTypeDefinitionNode): VisitorReturnType, + * }|callable(EnumTypeDefinitionNode): VisitorReturnType, * EnumValueDefinition?: array{ - * enter?: callable(EnumValueDefinitionNode): (VisitorOperation|null|false|void), - * leave?: callable(EnumValueDefinitionNode): (VisitorOperation|null|false|void), - * }|callable(EnumValueDefinitionNode): (VisitorOperation|null|false|void), + * enter?: callable(EnumValueDefinitionNode): VisitorReturnType, + * leave?: callable(EnumValueDefinitionNode): VisitorReturnType, + * }|callable(EnumValueDefinitionNode): VisitorReturnType, * InputObjectTypeDefinition?: array{ - * enter?: callable(InputObjectTypeDefinitionNode): (VisitorOperation|null|false|void), - * leave?: callable(InputObjectTypeDefinitionNode): (VisitorOperation|null|false|void), - * }|callable(InputObjectTypeDefinitionNode): (VisitorOperation|null|false|void), + * enter?: callable(InputObjectTypeDefinitionNode): VisitorReturnType, + * leave?: callable(InputObjectTypeDefinitionNode): VisitorReturnType, + * }|callable(InputObjectTypeDefinitionNode): VisitorReturnType, * SchemaExtension?: array{ - * enter?: callable(SchemaExtensionNode): (VisitorOperation|null|false|void), - * leave?: callable(SchemaExtensionNode): (VisitorOperation|null|false|void), - * }|callable(SchemaExtensionNode): (VisitorOperation|null|false|void), + * enter?: callable(SchemaExtensionNode): VisitorReturnType, + * leave?: callable(SchemaExtensionNode): VisitorReturnType, + * }|callable(SchemaExtensionNode): VisitorReturnType, * DirectiveDefinition?: array{ - * enter?: callable(DirectiveDefinitionNode): (VisitorOperation|null|false|void), - * leave?: callable(DirectiveDefinitionNode): (VisitorOperation|null|false|void), - * }|callable(DirectiveDefinitionNode): (VisitorOperation|null|false|void), + * enter?: callable(DirectiveDefinitionNode): VisitorReturnType, + * leave?: callable(DirectiveDefinitionNode): VisitorReturnType, + * }|callable(DirectiveDefinitionNode): VisitorReturnType, * ScalarTypeExtension?: array{ - * enter?: callable(ScalarTypeExtensionNode): (VisitorOperation|null|false|void), - * leave?: callable(ScalarTypeExtensionNode): (VisitorOperation|null|false|void), - * }|callable(ScalarTypeExtensionNode): (VisitorOperation|null|false|void), + * enter?: callable(ScalarTypeExtensionNode): VisitorReturnType, + * leave?: callable(ScalarTypeExtensionNode): VisitorReturnType, + * }|callable(ScalarTypeExtensionNode): VisitorReturnType, * ObjectTypeExtension?: array{ - * enter?: callable(ObjectTypeExtensionNode): (VisitorOperation|null|false|void), - * leave?: callable(ObjectTypeExtensionNode): (VisitorOperation|null|false|void), - * }|callable(ObjectTypeExtensionNode): (VisitorOperation|null|false|void), + * enter?: callable(ObjectTypeExtensionNode): VisitorReturnType, + * leave?: callable(ObjectTypeExtensionNode): VisitorReturnType, + * }|callable(ObjectTypeExtensionNode): VisitorReturnType, * InterfaceTypeExtension?: array{ - * enter?: callable(InterfaceTypeExtensionNode): (VisitorOperation|null|false|void), - * leave?: callable(InterfaceTypeExtensionNode): (VisitorOperation|null|false|void), - * }|callable(InterfaceTypeExtensionNode): (VisitorOperation|null|false|void), + * enter?: callable(InterfaceTypeExtensionNode): VisitorReturnType, + * leave?: callable(InterfaceTypeExtensionNode): VisitorReturnType, + * }|callable(InterfaceTypeExtensionNode): VisitorReturnType, * UnionTypeExtension?: array{ - * enter?: callable(UnionTypeExtensionNode): (VisitorOperation|null|false|void), - * leave?: callable(UnionTypeExtensionNode): (VisitorOperation|null|false|void), - * }|callable(UnionTypeExtensionNode): (VisitorOperation|null|false|void), + * enter?: callable(UnionTypeExtensionNode): VisitorReturnType, + * leave?: callable(UnionTypeExtensionNode): VisitorReturnType, + * }|callable(UnionTypeExtensionNode): VisitorReturnType, * EnumTypeExtension?: array{ - * enter?: callable(EnumTypeExtensionNode): (VisitorOperation|null|false|void), - * leave?: callable(EnumTypeExtensionNode): (VisitorOperation|null|false|void), - * }|callable(EnumTypeExtensionNode): (VisitorOperation|null|false|void), + * enter?: callable(EnumTypeExtensionNode): VisitorReturnType, + * leave?: callable(EnumTypeExtensionNode): VisitorReturnType, + * }|callable(EnumTypeExtensionNode): VisitorReturnType, * InputObjectTypeExtension?: array{ - * enter?: callable(InputObjectTypeExtensionNode): (VisitorOperation|null|false|void), - * leave?: callable(InputObjectTypeExtensionNode): (VisitorOperation|null|false|void), - * }|callable(InputObjectTypeExtensionNode): (VisitorOperation|null|false|void), + * enter?: callable(InputObjectTypeExtensionNode): VisitorReturnType, + * leave?: callable(InputObjectTypeExtensionNode): VisitorReturnType, + * }|callable(InputObjectTypeExtensionNode): VisitorReturnType, * } * * @see \GraphQL\Tests\Language\VisitorTest From 563e4ea85331a8de3599e968df79d037471017cf Mon Sep 17 00:00:00 2001 From: ruudk Date: Thu, 27 Feb 2025 13:32:50 +0000 Subject: [PATCH 5/9] Prettify docs --- docs/class-reference.md | 143 ++++++++++++++++++++-------------------- 1 file changed, 72 insertions(+), 71 deletions(-) diff --git a/docs/class-reference.md b/docs/class-reference.md index 8c6732052..546993ee7 100644 --- a/docs/class-reference.md +++ b/docs/class-reference.md @@ -1298,101 +1298,102 @@ visitor API: ] ]); +@phpstan-type VisitorReturnType VisitorOperation|null|false|void @phpstan-type VisitorArray array{ -enter?: callable(Node): (VisitorOperation|null|false|void), -leave?: callable(Node): (VisitorOperation|null|false|void), +enter?: callable(Node): VisitorReturnType, +leave?: callable(Node): VisitorReturnType, Name?: array{ -enter?: callable(NameNode): (VisitorOperation|null|false|void), -leave?: callable(NameNode): (VisitorOperation|null|false|void), -}|callable(NameNode): (VisitorOperation|null|false|void), +enter?: callable(NameNode): VisitorReturnType, +leave?: callable(NameNode): VisitorReturnType, +}|callable(NameNode): VisitorReturnType, Document?: array{ -enter?: callable(DocumentNode): (VisitorOperation|null|false|void), -leave?: callable(DocumentNode): (VisitorOperation|null|false|void), -}|callable(DocumentNode): (VisitorOperation|null|false|void), +enter?: callable(DocumentNode): VisitorReturnType, +leave?: callable(DocumentNode): VisitorReturnType, +}|callable(DocumentNode): VisitorReturnType, OperationDefinition?: array{ -enter?: callable(OperationDefinitionNode): (VisitorOperation|null|false|void), -leave?: callable(OperationDefinitionNode): (VisitorOperation|null|false|void), -}|callable(OperationDefinitionNode): (VisitorOperation|null|false|void), +enter?: callable(OperationDefinitionNode): VisitorReturnType, +leave?: callable(OperationDefinitionNode): VisitorReturnType, +}|callable(OperationDefinitionNode): VisitorReturnType, VariableDefinition?: array{ -enter?: callable(VariableDefinitionNode): (VisitorOperation|null|false|void), -leave?: callable(VariableDefinitionNode): (VisitorOperation|null|false|void), -}|callable(VariableDefinitionNode): (VisitorOperation|null|false|void), +enter?: callable(VariableDefinitionNode): VisitorReturnType, +leave?: callable(VariableDefinitionNode): VisitorReturnType, +}|callable(VariableDefinitionNode): VisitorReturnType, SchemaDefinition?: array{ -enter?: callable(SchemaDefinitionNode): (VisitorOperation|null|false|void), -leave?: callable(SchemaDefinitionNode): (VisitorOperation|null|false|void), -}|callable(SchemaDefinitionNode): (VisitorOperation|null|false|void), +enter?: callable(SchemaDefinitionNode): VisitorReturnType, +leave?: callable(SchemaDefinitionNode): VisitorReturnType, +}|callable(SchemaDefinitionNode): VisitorReturnType, OperationTypeDefinition?: array{ -enter?: callable(OperationTypeDefinitionNode): (VisitorOperation|null|false|void), -leave?: callable(OperationTypeDefinitionNode): (VisitorOperation|null|false|void), -}|callable(OperationTypeDefinitionNode): (VisitorOperation|null|false|void), +enter?: callable(OperationTypeDefinitionNode): VisitorReturnType, +leave?: callable(OperationTypeDefinitionNode): VisitorReturnType, +}|callable(OperationTypeDefinitionNode): VisitorReturnType, ScalarTypeDefinition?: array{ -enter?: callable(ScalarTypeDefinitionNode): (VisitorOperation|null|false|void), -leave?: callable(ScalarTypeDefinitionNode): (VisitorOperation|null|false|void), -}|callable(ScalarTypeDefinitionNode): (VisitorOperation|null|false|void), +enter?: callable(ScalarTypeDefinitionNode): VisitorReturnType, +leave?: callable(ScalarTypeDefinitionNode): VisitorReturnType, +}|callable(ScalarTypeDefinitionNode): VisitorReturnType, ObjectTypeDefinition?: array{ -enter?: callable(ObjectTypeDefinitionNode): (VisitorOperation|null|false|void), -leave?: callable(ObjectTypeDefinitionNode): (VisitorOperation|null|false|void), -}|callable(ObjectTypeDefinitionNode): (VisitorOperation|null|false|void), +enter?: callable(ObjectTypeDefinitionNode): VisitorReturnType, +leave?: callable(ObjectTypeDefinitionNode): VisitorReturnType, +}|callable(ObjectTypeDefinitionNode): VisitorReturnType, FieldDefinition?: array{ -enter?: callable(FieldDefinitionNode): (VisitorOperation|null|false|void), -leave?: callable(FieldDefinitionNode): (VisitorOperation|null|false|void), -}|callable(FieldDefinitionNode): (VisitorOperation|null|false|void), +enter?: callable(FieldDefinitionNode): VisitorReturnType, +leave?: callable(FieldDefinitionNode): VisitorReturnType, +}|callable(FieldDefinitionNode): VisitorReturnType, InputValueDefinition?: array{ -enter?: callable(InputValueDefinitionNode): (VisitorOperation|null|false|void), -leave?: callable(InputValueDefinitionNode): (VisitorOperation|null|false|void), -}|callable(InputValueDefinitionNode): (VisitorOperation|null|false|void), +enter?: callable(InputValueDefinitionNode): VisitorReturnType, +leave?: callable(InputValueDefinitionNode): VisitorReturnType, +}|callable(InputValueDefinitionNode): VisitorReturnType, InterfaceTypeDefinition?: array{ -enter?: callable(InterfaceTypeDefinitionNode): (VisitorOperation|null|false|void), -leave?: callable(InterfaceTypeDefinitionNode): (VisitorOperation|null|false|void), -}|callable(InterfaceTypeDefinitionNode): (VisitorOperation|null|false|void), +enter?: callable(InterfaceTypeDefinitionNode): VisitorReturnType, +leave?: callable(InterfaceTypeDefinitionNode): VisitorReturnType, +}|callable(InterfaceTypeDefinitionNode): VisitorReturnType, UnionTypeDefinition?: array{ -enter?: callable(UnionTypeDefinitionNode): (VisitorOperation|null|false|void), -leave?: callable(UnionTypeDefinitionNode): (VisitorOperation|null|false|void), -}|callable(UnionTypeDefinitionNode): (VisitorOperation|null|false|void), +enter?: callable(UnionTypeDefinitionNode): VisitorReturnType, +leave?: callable(UnionTypeDefinitionNode): VisitorReturnType, +}|callable(UnionTypeDefinitionNode): VisitorReturnType, EnumTypeDefinition?: array{ -enter?: callable(EnumTypeDefinitionNode): (VisitorOperation|null|false|void), -leave?: callable(EnumTypeDefinitionNode): (VisitorOperation|null|false|void), -}|callable(EnumTypeDefinitionNode): (VisitorOperation|null|false|void), +enter?: callable(EnumTypeDefinitionNode): VisitorReturnType, +leave?: callable(EnumTypeDefinitionNode): VisitorReturnType, +}|callable(EnumTypeDefinitionNode): VisitorReturnType, EnumValueDefinition?: array{ -enter?: callable(EnumValueDefinitionNode): (VisitorOperation|null|false|void), -leave?: callable(EnumValueDefinitionNode): (VisitorOperation|null|false|void), -}|callable(EnumValueDefinitionNode): (VisitorOperation|null|false|void), +enter?: callable(EnumValueDefinitionNode): VisitorReturnType, +leave?: callable(EnumValueDefinitionNode): VisitorReturnType, +}|callable(EnumValueDefinitionNode): VisitorReturnType, InputObjectTypeDefinition?: array{ -enter?: callable(InputObjectTypeDefinitionNode): (VisitorOperation|null|false|void), -leave?: callable(InputObjectTypeDefinitionNode): (VisitorOperation|null|false|void), -}|callable(InputObjectTypeDefinitionNode): (VisitorOperation|null|false|void), +enter?: callable(InputObjectTypeDefinitionNode): VisitorReturnType, +leave?: callable(InputObjectTypeDefinitionNode): VisitorReturnType, +}|callable(InputObjectTypeDefinitionNode): VisitorReturnType, SchemaExtension?: array{ -enter?: callable(SchemaExtensionNode): (VisitorOperation|null|false|void), -leave?: callable(SchemaExtensionNode): (VisitorOperation|null|false|void), -}|callable(SchemaExtensionNode): (VisitorOperation|null|false|void), +enter?: callable(SchemaExtensionNode): VisitorReturnType, +leave?: callable(SchemaExtensionNode): VisitorReturnType, +}|callable(SchemaExtensionNode): VisitorReturnType, DirectiveDefinition?: array{ -enter?: callable(DirectiveDefinitionNode): (VisitorOperation|null|false|void), -leave?: callable(DirectiveDefinitionNode): (VisitorOperation|null|false|void), -}|callable(DirectiveDefinitionNode): (VisitorOperation|null|false|void), +enter?: callable(DirectiveDefinitionNode): VisitorReturnType, +leave?: callable(DirectiveDefinitionNode): VisitorReturnType, +}|callable(DirectiveDefinitionNode): VisitorReturnType, ScalarTypeExtension?: array{ -enter?: callable(ScalarTypeExtensionNode): (VisitorOperation|null|false|void), -leave?: callable(ScalarTypeExtensionNode): (VisitorOperation|null|false|void), -}|callable(ScalarTypeExtensionNode): (VisitorOperation|null|false|void), +enter?: callable(ScalarTypeExtensionNode): VisitorReturnType, +leave?: callable(ScalarTypeExtensionNode): VisitorReturnType, +}|callable(ScalarTypeExtensionNode): VisitorReturnType, ObjectTypeExtension?: array{ -enter?: callable(ObjectTypeExtensionNode): (VisitorOperation|null|false|void), -leave?: callable(ObjectTypeExtensionNode): (VisitorOperation|null|false|void), -}|callable(ObjectTypeExtensionNode): (VisitorOperation|null|false|void), +enter?: callable(ObjectTypeExtensionNode): VisitorReturnType, +leave?: callable(ObjectTypeExtensionNode): VisitorReturnType, +}|callable(ObjectTypeExtensionNode): VisitorReturnType, InterfaceTypeExtension?: array{ -enter?: callable(InterfaceTypeExtensionNode): (VisitorOperation|null|false|void), -leave?: callable(InterfaceTypeExtensionNode): (VisitorOperation|null|false|void), -}|callable(InterfaceTypeExtensionNode): (VisitorOperation|null|false|void), +enter?: callable(InterfaceTypeExtensionNode): VisitorReturnType, +leave?: callable(InterfaceTypeExtensionNode): VisitorReturnType, +}|callable(InterfaceTypeExtensionNode): VisitorReturnType, UnionTypeExtension?: array{ -enter?: callable(UnionTypeExtensionNode): (VisitorOperation|null|false|void), -leave?: callable(UnionTypeExtensionNode): (VisitorOperation|null|false|void), -}|callable(UnionTypeExtensionNode): (VisitorOperation|null|false|void), +enter?: callable(UnionTypeExtensionNode): VisitorReturnType, +leave?: callable(UnionTypeExtensionNode): VisitorReturnType, +}|callable(UnionTypeExtensionNode): VisitorReturnType, EnumTypeExtension?: array{ -enter?: callable(EnumTypeExtensionNode): (VisitorOperation|null|false|void), -leave?: callable(EnumTypeExtensionNode): (VisitorOperation|null|false|void), -}|callable(EnumTypeExtensionNode): (VisitorOperation|null|false|void), +enter?: callable(EnumTypeExtensionNode): VisitorReturnType, +leave?: callable(EnumTypeExtensionNode): VisitorReturnType, +}|callable(EnumTypeExtensionNode): VisitorReturnType, InputObjectTypeExtension?: array{ -enter?: callable(InputObjectTypeExtensionNode): (VisitorOperation|null|false|void), -leave?: callable(InputObjectTypeExtensionNode): (VisitorOperation|null|false|void), -}|callable(InputObjectTypeExtensionNode): (VisitorOperation|null|false|void), +enter?: callable(InputObjectTypeExtensionNode): VisitorReturnType, +leave?: callable(InputObjectTypeExtensionNode): VisitorReturnType, +}|callable(InputObjectTypeExtensionNode): VisitorReturnType, } @see \GraphQL\Tests\Language\VisitorTest From 8adbe70539f47f9390a9aba61b0acbbebf5c5b1b Mon Sep 17 00:00:00 2001 From: Ruud Kamphuis Date: Thu, 27 Feb 2025 14:42:25 +0100 Subject: [PATCH 6/9] Fix broken phpdoc --- src/Language/Visitor.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Language/Visitor.php b/src/Language/Visitor.php index 7f4d56239..11114ca76 100644 --- a/src/Language/Visitor.php +++ b/src/Language/Visitor.php @@ -596,7 +596,7 @@ public static function visitWithTypeInfo(TypeInfo $typeInfo, array $visitor): ar /** * @phpstan-param VisitorArray $visitor * - * @return callable(Node $node, string $key, Node|NodeList $parent, array $ancestors): VisitorOperation|Node|null + * @return callable(Node $node, string $key, Node|NodeList $parent, array $path, array $ancestors): VisitorOperation|Node|null */ protected static function extractVisitFn(array $visitor, string $kind, bool $isLeaving): ?callable { From a8adc73011fa64e9873fb8a6f02132c32d2af3e9 Mon Sep 17 00:00:00 2001 From: Ruud Kamphuis Date: Thu, 27 Feb 2025 15:15:37 +0100 Subject: [PATCH 7/9] Use default value for NodeList T This makes it easier to work with NodeList, if you don't care about it's type. --- src/Language/AST/NodeList.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Language/AST/NodeList.php b/src/Language/AST/NodeList.php index 01071d476..6329de7fe 100644 --- a/src/Language/AST/NodeList.php +++ b/src/Language/AST/NodeList.php @@ -6,7 +6,7 @@ use GraphQL\Utils\AST; /** - * @template T of Node + * @template T of Node = Node * * @phpstan-implements \ArrayAccess * @phpstan-implements \IteratorAggregate From aca99b3115207be5f7adb3dac7cd8e97f296a3c6 Mon Sep 17 00:00:00 2001 From: Ruud Kamphuis Date: Thu, 27 Feb 2025 15:48:04 +0100 Subject: [PATCH 8/9] Fix --- phpstan-baseline.neon | 7 +- phpstan.neon.dist | 3 - src/Language/Visitor.php | 147 ++++++++++--------- src/Validator/Rules/CustomValidationRule.php | 6 +- 4 files changed, 78 insertions(+), 85 deletions(-) diff --git a/phpstan-baseline.neon b/phpstan-baseline.neon index c9ad1df81..b28a860ba 100644 --- a/phpstan-baseline.neon +++ b/phpstan-baseline.neon @@ -75,11 +75,6 @@ parameters: count: 1 path: src/Utils/AST.php - - - message: "#^Method GraphQL\\\\Validator\\\\Rules\\\\KnownDirectives\\:\\:getDirectiveLocationForASTPath\\(\\) has parameter \\$ancestors with generic class GraphQL\\\\Language\\\\AST\\\\NodeList but does not specify its types\\: T$#" - count: 1 - path: src/Validator/Rules/KnownDirectives.php - - message: "#^Method GraphQL\\\\Validator\\\\Rules\\\\OverlappingFieldsCanBeMerged\\:\\:getFieldsAndFragmentNames\\(\\) should return array\\{array\\\\>, array\\\\} but returns array\\{mixed, array\\\\}\\.$#" count: 1 @@ -88,4 +83,4 @@ parameters: - message: "#^SplObjectStorage\\\\>, array\\\\}\\> does not accept array\\\\.$#" count: 1 - path: src/Validator/Rules/OverlappingFieldsCanBeMerged.php \ No newline at end of file + path: src/Validator/Rules/OverlappingFieldsCanBeMerged.php diff --git a/phpstan.neon.dist b/phpstan.neon.dist index 4fd2c394e..9b19b9b8c 100644 --- a/phpstan.neon.dist +++ b/phpstan.neon.dist @@ -34,9 +34,6 @@ parameters: - message: "#^Property GraphQL\\\\Tests\\\\Type\\\\SchemaTest\\:\\:\\$implementingType is never read, only written\\.$#" path: tests - # Cannot satisfy input covariance - - '~(expects|should return) array\|\(callable\(GraphQL\\Language\\AST\\Node\): \(GraphQL\\Language\\VisitorOperation\|void\|false\|null\)\)>(,| but returns)?~' - # No need to have @throws in methods that are never called ## PHPUnit - message: "~Method GraphQL\\\\Tests\\\\.+?Test(CaseBase)?::(test.+?|setUp(BeforeClass)?|tearDown)\\(\\) throws checked exception .+? but it's missing from the PHPDoc @throws tag~" diff --git a/src/Language/Visitor.php b/src/Language/Visitor.php index 11114ca76..6582f8377 100644 --- a/src/Language/Visitor.php +++ b/src/Language/Visitor.php @@ -112,102 +112,102 @@ * ] * ]); * - * @phpstan-type VisitorReturnType VisitorOperation|null|false|void + * @phpstan-type VisitorReturnType Node|VisitorOperation|null|false|void * @phpstan-type VisitorArray array{ - * enter?: callable(Node): VisitorReturnType, - * leave?: callable(Node): VisitorReturnType, + * enter?: callable(Node, string, null|Node|NodeList, array, array): VisitorReturnType, + * leave?: callable(Node, string, null|Node|NodeList, array, array): VisitorReturnType, * Name?: array{ - * enter?: callable(NameNode): VisitorReturnType, - * leave?: callable(NameNode): VisitorReturnType, - * }|callable(NameNode): VisitorReturnType, + * enter?: callable(NameNode, string, null|Node|NodeList, array, array): VisitorReturnType, + * leave?: callable(NameNode, string, null|Node|NodeList, array, array): VisitorReturnType, + * }|callable(NameNode, string, null|Node|NodeList, array, array): VisitorReturnType, * Document?: array{ - * enter?: callable(DocumentNode): VisitorReturnType, - * leave?: callable(DocumentNode): VisitorReturnType, - * }|callable(DocumentNode): VisitorReturnType, + * enter?: callable(DocumentNode, string, null|Node|NodeList, array, array): VisitorReturnType, + * leave?: callable(DocumentNode, string, null|Node|NodeList, array, array): VisitorReturnType, + * }|callable(DocumentNode, string, null|Node|NodeList, array, array): VisitorReturnType, * OperationDefinition?: array{ - * enter?: callable(OperationDefinitionNode): VisitorReturnType, - * leave?: callable(OperationDefinitionNode): VisitorReturnType, - * }|callable(OperationDefinitionNode): VisitorReturnType, + * enter?: callable(OperationDefinitionNode, string, null|Node|NodeList, array, array): VisitorReturnType, + * leave?: callable(OperationDefinitionNode, string, null|Node|NodeList, array, array): VisitorReturnType, + * }|callable(OperationDefinitionNode, string, null|Node|NodeList, array, array): VisitorReturnType, * VariableDefinition?: array{ - * enter?: callable(VariableDefinitionNode): VisitorReturnType, - * leave?: callable(VariableDefinitionNode): VisitorReturnType, - * }|callable(VariableDefinitionNode): VisitorReturnType, + * enter?: callable(VariableDefinitionNode, string, null|Node|NodeList, array, array): VisitorReturnType, + * leave?: callable(VariableDefinitionNode, string, null|Node|NodeList, array, array): VisitorReturnType, + * }|callable(VariableDefinitionNode, string, null|Node|NodeList, array, array): VisitorReturnType, * SchemaDefinition?: array{ - * enter?: callable(SchemaDefinitionNode): VisitorReturnType, - * leave?: callable(SchemaDefinitionNode): VisitorReturnType, - * }|callable(SchemaDefinitionNode): VisitorReturnType, + * enter?: callable(SchemaDefinitionNode, string, null|Node|NodeList, array, array): VisitorReturnType, + * leave?: callable(SchemaDefinitionNode, string, null|Node|NodeList, array, array): VisitorReturnType, + * }|callable(SchemaDefinitionNode, string, null|Node|NodeList, array, array): VisitorReturnType, * OperationTypeDefinition?: array{ - * enter?: callable(OperationTypeDefinitionNode): VisitorReturnType, - * leave?: callable(OperationTypeDefinitionNode): VisitorReturnType, - * }|callable(OperationTypeDefinitionNode): VisitorReturnType, + * enter?: callable(OperationTypeDefinitionNode, string, null|Node|NodeList, array, array): VisitorReturnType, + * leave?: callable(OperationTypeDefinitionNode, string, null|Node|NodeList, array, array): VisitorReturnType, + * }|callable(OperationTypeDefinitionNode, string, null|Node|NodeList, array, array): VisitorReturnType, * ScalarTypeDefinition?: array{ - * enter?: callable(ScalarTypeDefinitionNode): VisitorReturnType, - * leave?: callable(ScalarTypeDefinitionNode): VisitorReturnType, - * }|callable(ScalarTypeDefinitionNode): VisitorReturnType, + * enter?: callable(ScalarTypeDefinitionNode, string, null|Node|NodeList, array, array): VisitorReturnType, + * leave?: callable(ScalarTypeDefinitionNode, string, null|Node|NodeList, array, array): VisitorReturnType, + * }|callable(ScalarTypeDefinitionNode, string, null|Node|NodeList, array, array): VisitorReturnType, * ObjectTypeDefinition?: array{ - * enter?: callable(ObjectTypeDefinitionNode): VisitorReturnType, - * leave?: callable(ObjectTypeDefinitionNode): VisitorReturnType, - * }|callable(ObjectTypeDefinitionNode): VisitorReturnType, + * enter?: callable(ObjectTypeDefinitionNode, string, null|Node|NodeList, array, array): VisitorReturnType, + * leave?: callable(ObjectTypeDefinitionNode, string, null|Node|NodeList, array, array): VisitorReturnType, + * }|callable(ObjectTypeDefinitionNode, string, null|Node|NodeList, array, array): VisitorReturnType, * FieldDefinition?: array{ - * enter?: callable(FieldDefinitionNode): VisitorReturnType, - * leave?: callable(FieldDefinitionNode): VisitorReturnType, - * }|callable(FieldDefinitionNode): VisitorReturnType, + * enter?: callable(FieldDefinitionNode, string, null|Node|NodeList, array, array): VisitorReturnType, + * leave?: callable(FieldDefinitionNode, string, null|Node|NodeList, array, array): VisitorReturnType, + * }|callable(FieldDefinitionNode, string, null|Node|NodeList, array, array): VisitorReturnType, * InputValueDefinition?: array{ - * enter?: callable(InputValueDefinitionNode): VisitorReturnType, - * leave?: callable(InputValueDefinitionNode): VisitorReturnType, - * }|callable(InputValueDefinitionNode): VisitorReturnType, + * enter?: callable(InputValueDefinitionNode, string, null|Node|NodeList, array, array): VisitorReturnType, + * leave?: callable(InputValueDefinitionNode, string, null|Node|NodeList, array, array): VisitorReturnType, + * }|callable(InputValueDefinitionNode, string, null|Node|NodeList, array, array): VisitorReturnType, * InterfaceTypeDefinition?: array{ - * enter?: callable(InterfaceTypeDefinitionNode): VisitorReturnType, - * leave?: callable(InterfaceTypeDefinitionNode): VisitorReturnType, - * }|callable(InterfaceTypeDefinitionNode): VisitorReturnType, + * enter?: callable(InterfaceTypeDefinitionNode, string, null|Node|NodeList, array, array): VisitorReturnType, + * leave?: callable(InterfaceTypeDefinitionNode, string, null|Node|NodeList, array, array): VisitorReturnType, + * }|callable(InterfaceTypeDefinitionNode, string, null|Node|NodeList, array, array): VisitorReturnType, * UnionTypeDefinition?: array{ - * enter?: callable(UnionTypeDefinitionNode): VisitorReturnType, - * leave?: callable(UnionTypeDefinitionNode): VisitorReturnType, - * }|callable(UnionTypeDefinitionNode): VisitorReturnType, + * enter?: callable(UnionTypeDefinitionNode, string, null|Node|NodeList, array, array): VisitorReturnType, + * leave?: callable(UnionTypeDefinitionNode, string, null|Node|NodeList, array, array): VisitorReturnType, + * }|callable(UnionTypeDefinitionNode, string, null|Node|NodeList, array, array): VisitorReturnType, * EnumTypeDefinition?: array{ - * enter?: callable(EnumTypeDefinitionNode): VisitorReturnType, - * leave?: callable(EnumTypeDefinitionNode): VisitorReturnType, - * }|callable(EnumTypeDefinitionNode): VisitorReturnType, + * enter?: callable(EnumTypeDefinitionNode, string, null|Node|NodeList, array, array): VisitorReturnType, + * leave?: callable(EnumTypeDefinitionNode, string, null|Node|NodeList, array, array): VisitorReturnType, + * }|callable(EnumTypeDefinitionNode, string, null|Node|NodeList, array, array): VisitorReturnType, * EnumValueDefinition?: array{ - * enter?: callable(EnumValueDefinitionNode): VisitorReturnType, - * leave?: callable(EnumValueDefinitionNode): VisitorReturnType, - * }|callable(EnumValueDefinitionNode): VisitorReturnType, + * enter?: callable(EnumValueDefinitionNode, string, null|Node|NodeList, array, array): VisitorReturnType, + * leave?: callable(EnumValueDefinitionNode, string, null|Node|NodeList, array, array): VisitorReturnType, + * }|callable(EnumValueDefinitionNode, string, null|Node|NodeList, array, array): VisitorReturnType, * InputObjectTypeDefinition?: array{ - * enter?: callable(InputObjectTypeDefinitionNode): VisitorReturnType, - * leave?: callable(InputObjectTypeDefinitionNode): VisitorReturnType, - * }|callable(InputObjectTypeDefinitionNode): VisitorReturnType, + * enter?: callable(InputObjectTypeDefinitionNode, string, null|Node|NodeList, array, array): VisitorReturnType, + * leave?: callable(InputObjectTypeDefinitionNode, string, null|Node|NodeList, array, array): VisitorReturnType, + * }|callable(InputObjectTypeDefinitionNode, string, null|Node|NodeList, array, array): VisitorReturnType, * SchemaExtension?: array{ - * enter?: callable(SchemaExtensionNode): VisitorReturnType, - * leave?: callable(SchemaExtensionNode): VisitorReturnType, - * }|callable(SchemaExtensionNode): VisitorReturnType, + * enter?: callable(SchemaExtensionNode, string, null|Node|NodeList, array, array): VisitorReturnType, + * leave?: callable(SchemaExtensionNode, string, null|Node|NodeList, array, array): VisitorReturnType, + * }|callable(SchemaExtensionNode, string, null|Node|NodeList, array, array): VisitorReturnType, * DirectiveDefinition?: array{ - * enter?: callable(DirectiveDefinitionNode): VisitorReturnType, - * leave?: callable(DirectiveDefinitionNode): VisitorReturnType, - * }|callable(DirectiveDefinitionNode): VisitorReturnType, + * enter?: callable(DirectiveDefinitionNode, string, null|Node|NodeList, array, array): VisitorReturnType, + * leave?: callable(DirectiveDefinitionNode, string, null|Node|NodeList, array, array): VisitorReturnType, + * }|callable(DirectiveDefinitionNode, string, null|Node|NodeList, array, array): VisitorReturnType, * ScalarTypeExtension?: array{ - * enter?: callable(ScalarTypeExtensionNode): VisitorReturnType, - * leave?: callable(ScalarTypeExtensionNode): VisitorReturnType, - * }|callable(ScalarTypeExtensionNode): VisitorReturnType, + * enter?: callable(ScalarTypeExtensionNode, string, null|Node|NodeList, array, array): VisitorReturnType, + * leave?: callable(ScalarTypeExtensionNode, string, null|Node|NodeList, array, array): VisitorReturnType, + * }|callable(ScalarTypeExtensionNode, string, null|Node|NodeList, array, array): VisitorReturnType, * ObjectTypeExtension?: array{ - * enter?: callable(ObjectTypeExtensionNode): VisitorReturnType, - * leave?: callable(ObjectTypeExtensionNode): VisitorReturnType, - * }|callable(ObjectTypeExtensionNode): VisitorReturnType, + * enter?: callable(ObjectTypeExtensionNode, string, null|Node|NodeList, array, array): VisitorReturnType, + * leave?: callable(ObjectTypeExtensionNode, string, null|Node|NodeList, array, array): VisitorReturnType, + * }|callable(ObjectTypeExtensionNode, string, null|Node|NodeList, array, array): VisitorReturnType, * InterfaceTypeExtension?: array{ - * enter?: callable(InterfaceTypeExtensionNode): VisitorReturnType, - * leave?: callable(InterfaceTypeExtensionNode): VisitorReturnType, - * }|callable(InterfaceTypeExtensionNode): VisitorReturnType, + * enter?: callable(InterfaceTypeExtensionNode, string, null|Node|NodeList, array, array): VisitorReturnType, + * leave?: callable(InterfaceTypeExtensionNode, string, null|Node|NodeList, array, array): VisitorReturnType, + * }|callable(InterfaceTypeExtensionNode, string, null|Node|NodeList, array, array): VisitorReturnType, * UnionTypeExtension?: array{ - * enter?: callable(UnionTypeExtensionNode): VisitorReturnType, - * leave?: callable(UnionTypeExtensionNode): VisitorReturnType, - * }|callable(UnionTypeExtensionNode): VisitorReturnType, + * enter?: callable(UnionTypeExtensionNode, string, null|Node|NodeList, array, array): VisitorReturnType, + * leave?: callable(UnionTypeExtensionNode, string, null|Node|NodeList, array, array): VisitorReturnType, + * }|callable(UnionTypeExtensionNode, string, null|Node|NodeList, array, array): VisitorReturnType, * EnumTypeExtension?: array{ - * enter?: callable(EnumTypeExtensionNode): VisitorReturnType, - * leave?: callable(EnumTypeExtensionNode): VisitorReturnType, - * }|callable(EnumTypeExtensionNode): VisitorReturnType, + * enter?: callable(EnumTypeExtensionNode, string, null|Node|NodeList, array, array): VisitorReturnType, + * leave?: callable(EnumTypeExtensionNode, string, null|Node|NodeList, array, array): VisitorReturnType, + * }|callable(EnumTypeExtensionNode, string, null|Node|NodeList, array, array): VisitorReturnType, * InputObjectTypeExtension?: array{ - * enter?: callable(InputObjectTypeExtensionNode): VisitorReturnType, - * leave?: callable(InputObjectTypeExtensionNode): VisitorReturnType, - * }|callable(InputObjectTypeExtensionNode): VisitorReturnType, + * enter?: callable(InputObjectTypeExtensionNode, string, null|Node|NodeList, array, array): VisitorReturnType, + * leave?: callable(InputObjectTypeExtensionNode, string, null|Node|NodeList, array, array): VisitorReturnType, + * }|callable(InputObjectTypeExtensionNode, string, null|Node|NodeList, array, array): VisitorReturnType, * } * * @see \GraphQL\Tests\Language\VisitorTest @@ -596,7 +596,7 @@ public static function visitWithTypeInfo(TypeInfo $typeInfo, array $visitor): ar /** * @phpstan-param VisitorArray $visitor * - * @return callable(Node $node, string $key, Node|NodeList $parent, array $path, array $ancestors): VisitorOperation|Node|null + * @return null|callable(Node, string, null|Node|NodeList, array, array): VisitorReturnType */ protected static function extractVisitFn(array $visitor, string $kind, bool $isLeaving): ?callable { @@ -609,6 +609,7 @@ protected static function extractVisitFn(array $visitor, string $kind, bool $isL } if ($kindVisitor !== null && ! $isLeaving) { + // @phpstan-ignore return.type return $kindVisitor; } diff --git a/src/Validator/Rules/CustomValidationRule.php b/src/Validator/Rules/CustomValidationRule.php index c0e659729..b2712286c 100644 --- a/src/Validator/Rules/CustomValidationRule.php +++ b/src/Validator/Rules/CustomValidationRule.php @@ -3,15 +3,15 @@ namespace GraphQL\Validator\Rules; use GraphQL\Language\AST\Node; +use GraphQL\Language\Visitor; use GraphQL\Language\VisitorOperation; use GraphQL\Validator\ValidationContext; /** * @see Node, VisitorOperation * - * @phpstan-type NodeVisitorFnResult VisitorOperation|mixed|null - * @phpstan-type VisitorFnResult array|array> - * @phpstan-type VisitorFn callable(ValidationContext): VisitorFnResult + * @phpstan-import-type VisitorArray from Visitor + * @phpstan-type VisitorFn callable(ValidationContext): VisitorArray */ class CustomValidationRule extends ValidationRule { From 606c093b2e83c4cbbe3caf063888150f85a389ce Mon Sep 17 00:00:00 2001 From: ruudk Date: Thu, 27 Feb 2025 14:59:45 +0000 Subject: [PATCH 9/9] Prettify docs --- docs/class-reference.md | 144 ++++++++++++++++++++-------------------- 1 file changed, 72 insertions(+), 72 deletions(-) diff --git a/docs/class-reference.md b/docs/class-reference.md index 546993ee7..b16254679 100644 --- a/docs/class-reference.md +++ b/docs/class-reference.md @@ -1298,102 +1298,102 @@ visitor API: ] ]); -@phpstan-type VisitorReturnType VisitorOperation|null|false|void +@phpstan-type VisitorReturnType Node|VisitorOperation|null|false|void @phpstan-type VisitorArray array{ -enter?: callable(Node): VisitorReturnType, -leave?: callable(Node): VisitorReturnType, +enter?: callable(Node, string, null|Node|NodeList, array, array): VisitorReturnType, +leave?: callable(Node, string, null|Node|NodeList, array, array): VisitorReturnType, Name?: array{ -enter?: callable(NameNode): VisitorReturnType, -leave?: callable(NameNode): VisitorReturnType, -}|callable(NameNode): VisitorReturnType, +enter?: callable(NameNode, string, null|Node|NodeList, array, array): VisitorReturnType, +leave?: callable(NameNode, string, null|Node|NodeList, array, array): VisitorReturnType, +}|callable(NameNode, string, null|Node|NodeList, array, array): VisitorReturnType, Document?: array{ -enter?: callable(DocumentNode): VisitorReturnType, -leave?: callable(DocumentNode): VisitorReturnType, -}|callable(DocumentNode): VisitorReturnType, +enter?: callable(DocumentNode, string, null|Node|NodeList, array, array): VisitorReturnType, +leave?: callable(DocumentNode, string, null|Node|NodeList, array, array): VisitorReturnType, +}|callable(DocumentNode, string, null|Node|NodeList, array, array): VisitorReturnType, OperationDefinition?: array{ -enter?: callable(OperationDefinitionNode): VisitorReturnType, -leave?: callable(OperationDefinitionNode): VisitorReturnType, -}|callable(OperationDefinitionNode): VisitorReturnType, +enter?: callable(OperationDefinitionNode, string, null|Node|NodeList, array, array): VisitorReturnType, +leave?: callable(OperationDefinitionNode, string, null|Node|NodeList, array, array): VisitorReturnType, +}|callable(OperationDefinitionNode, string, null|Node|NodeList, array, array): VisitorReturnType, VariableDefinition?: array{ -enter?: callable(VariableDefinitionNode): VisitorReturnType, -leave?: callable(VariableDefinitionNode): VisitorReturnType, -}|callable(VariableDefinitionNode): VisitorReturnType, +enter?: callable(VariableDefinitionNode, string, null|Node|NodeList, array, array): VisitorReturnType, +leave?: callable(VariableDefinitionNode, string, null|Node|NodeList, array, array): VisitorReturnType, +}|callable(VariableDefinitionNode, string, null|Node|NodeList, array, array): VisitorReturnType, SchemaDefinition?: array{ -enter?: callable(SchemaDefinitionNode): VisitorReturnType, -leave?: callable(SchemaDefinitionNode): VisitorReturnType, -}|callable(SchemaDefinitionNode): VisitorReturnType, +enter?: callable(SchemaDefinitionNode, string, null|Node|NodeList, array, array): VisitorReturnType, +leave?: callable(SchemaDefinitionNode, string, null|Node|NodeList, array, array): VisitorReturnType, +}|callable(SchemaDefinitionNode, string, null|Node|NodeList, array, array): VisitorReturnType, OperationTypeDefinition?: array{ -enter?: callable(OperationTypeDefinitionNode): VisitorReturnType, -leave?: callable(OperationTypeDefinitionNode): VisitorReturnType, -}|callable(OperationTypeDefinitionNode): VisitorReturnType, +enter?: callable(OperationTypeDefinitionNode, string, null|Node|NodeList, array, array): VisitorReturnType, +leave?: callable(OperationTypeDefinitionNode, string, null|Node|NodeList, array, array): VisitorReturnType, +}|callable(OperationTypeDefinitionNode, string, null|Node|NodeList, array, array): VisitorReturnType, ScalarTypeDefinition?: array{ -enter?: callable(ScalarTypeDefinitionNode): VisitorReturnType, -leave?: callable(ScalarTypeDefinitionNode): VisitorReturnType, -}|callable(ScalarTypeDefinitionNode): VisitorReturnType, +enter?: callable(ScalarTypeDefinitionNode, string, null|Node|NodeList, array, array): VisitorReturnType, +leave?: callable(ScalarTypeDefinitionNode, string, null|Node|NodeList, array, array): VisitorReturnType, +}|callable(ScalarTypeDefinitionNode, string, null|Node|NodeList, array, array): VisitorReturnType, ObjectTypeDefinition?: array{ -enter?: callable(ObjectTypeDefinitionNode): VisitorReturnType, -leave?: callable(ObjectTypeDefinitionNode): VisitorReturnType, -}|callable(ObjectTypeDefinitionNode): VisitorReturnType, +enter?: callable(ObjectTypeDefinitionNode, string, null|Node|NodeList, array, array): VisitorReturnType, +leave?: callable(ObjectTypeDefinitionNode, string, null|Node|NodeList, array, array): VisitorReturnType, +}|callable(ObjectTypeDefinitionNode, string, null|Node|NodeList, array, array): VisitorReturnType, FieldDefinition?: array{ -enter?: callable(FieldDefinitionNode): VisitorReturnType, -leave?: callable(FieldDefinitionNode): VisitorReturnType, -}|callable(FieldDefinitionNode): VisitorReturnType, +enter?: callable(FieldDefinitionNode, string, null|Node|NodeList, array, array): VisitorReturnType, +leave?: callable(FieldDefinitionNode, string, null|Node|NodeList, array, array): VisitorReturnType, +}|callable(FieldDefinitionNode, string, null|Node|NodeList, array, array): VisitorReturnType, InputValueDefinition?: array{ -enter?: callable(InputValueDefinitionNode): VisitorReturnType, -leave?: callable(InputValueDefinitionNode): VisitorReturnType, -}|callable(InputValueDefinitionNode): VisitorReturnType, +enter?: callable(InputValueDefinitionNode, string, null|Node|NodeList, array, array): VisitorReturnType, +leave?: callable(InputValueDefinitionNode, string, null|Node|NodeList, array, array): VisitorReturnType, +}|callable(InputValueDefinitionNode, string, null|Node|NodeList, array, array): VisitorReturnType, InterfaceTypeDefinition?: array{ -enter?: callable(InterfaceTypeDefinitionNode): VisitorReturnType, -leave?: callable(InterfaceTypeDefinitionNode): VisitorReturnType, -}|callable(InterfaceTypeDefinitionNode): VisitorReturnType, +enter?: callable(InterfaceTypeDefinitionNode, string, null|Node|NodeList, array, array): VisitorReturnType, +leave?: callable(InterfaceTypeDefinitionNode, string, null|Node|NodeList, array, array): VisitorReturnType, +}|callable(InterfaceTypeDefinitionNode, string, null|Node|NodeList, array, array): VisitorReturnType, UnionTypeDefinition?: array{ -enter?: callable(UnionTypeDefinitionNode): VisitorReturnType, -leave?: callable(UnionTypeDefinitionNode): VisitorReturnType, -}|callable(UnionTypeDefinitionNode): VisitorReturnType, +enter?: callable(UnionTypeDefinitionNode, string, null|Node|NodeList, array, array): VisitorReturnType, +leave?: callable(UnionTypeDefinitionNode, string, null|Node|NodeList, array, array): VisitorReturnType, +}|callable(UnionTypeDefinitionNode, string, null|Node|NodeList, array, array): VisitorReturnType, EnumTypeDefinition?: array{ -enter?: callable(EnumTypeDefinitionNode): VisitorReturnType, -leave?: callable(EnumTypeDefinitionNode): VisitorReturnType, -}|callable(EnumTypeDefinitionNode): VisitorReturnType, +enter?: callable(EnumTypeDefinitionNode, string, null|Node|NodeList, array, array): VisitorReturnType, +leave?: callable(EnumTypeDefinitionNode, string, null|Node|NodeList, array, array): VisitorReturnType, +}|callable(EnumTypeDefinitionNode, string, null|Node|NodeList, array, array): VisitorReturnType, EnumValueDefinition?: array{ -enter?: callable(EnumValueDefinitionNode): VisitorReturnType, -leave?: callable(EnumValueDefinitionNode): VisitorReturnType, -}|callable(EnumValueDefinitionNode): VisitorReturnType, +enter?: callable(EnumValueDefinitionNode, string, null|Node|NodeList, array, array): VisitorReturnType, +leave?: callable(EnumValueDefinitionNode, string, null|Node|NodeList, array, array): VisitorReturnType, +}|callable(EnumValueDefinitionNode, string, null|Node|NodeList, array, array): VisitorReturnType, InputObjectTypeDefinition?: array{ -enter?: callable(InputObjectTypeDefinitionNode): VisitorReturnType, -leave?: callable(InputObjectTypeDefinitionNode): VisitorReturnType, -}|callable(InputObjectTypeDefinitionNode): VisitorReturnType, +enter?: callable(InputObjectTypeDefinitionNode, string, null|Node|NodeList, array, array): VisitorReturnType, +leave?: callable(InputObjectTypeDefinitionNode, string, null|Node|NodeList, array, array): VisitorReturnType, +}|callable(InputObjectTypeDefinitionNode, string, null|Node|NodeList, array, array): VisitorReturnType, SchemaExtension?: array{ -enter?: callable(SchemaExtensionNode): VisitorReturnType, -leave?: callable(SchemaExtensionNode): VisitorReturnType, -}|callable(SchemaExtensionNode): VisitorReturnType, +enter?: callable(SchemaExtensionNode, string, null|Node|NodeList, array, array): VisitorReturnType, +leave?: callable(SchemaExtensionNode, string, null|Node|NodeList, array, array): VisitorReturnType, +}|callable(SchemaExtensionNode, string, null|Node|NodeList, array, array): VisitorReturnType, DirectiveDefinition?: array{ -enter?: callable(DirectiveDefinitionNode): VisitorReturnType, -leave?: callable(DirectiveDefinitionNode): VisitorReturnType, -}|callable(DirectiveDefinitionNode): VisitorReturnType, +enter?: callable(DirectiveDefinitionNode, string, null|Node|NodeList, array, array): VisitorReturnType, +leave?: callable(DirectiveDefinitionNode, string, null|Node|NodeList, array, array): VisitorReturnType, +}|callable(DirectiveDefinitionNode, string, null|Node|NodeList, array, array): VisitorReturnType, ScalarTypeExtension?: array{ -enter?: callable(ScalarTypeExtensionNode): VisitorReturnType, -leave?: callable(ScalarTypeExtensionNode): VisitorReturnType, -}|callable(ScalarTypeExtensionNode): VisitorReturnType, +enter?: callable(ScalarTypeExtensionNode, string, null|Node|NodeList, array, array): VisitorReturnType, +leave?: callable(ScalarTypeExtensionNode, string, null|Node|NodeList, array, array): VisitorReturnType, +}|callable(ScalarTypeExtensionNode, string, null|Node|NodeList, array, array): VisitorReturnType, ObjectTypeExtension?: array{ -enter?: callable(ObjectTypeExtensionNode): VisitorReturnType, -leave?: callable(ObjectTypeExtensionNode): VisitorReturnType, -}|callable(ObjectTypeExtensionNode): VisitorReturnType, +enter?: callable(ObjectTypeExtensionNode, string, null|Node|NodeList, array, array): VisitorReturnType, +leave?: callable(ObjectTypeExtensionNode, string, null|Node|NodeList, array, array): VisitorReturnType, +}|callable(ObjectTypeExtensionNode, string, null|Node|NodeList, array, array): VisitorReturnType, InterfaceTypeExtension?: array{ -enter?: callable(InterfaceTypeExtensionNode): VisitorReturnType, -leave?: callable(InterfaceTypeExtensionNode): VisitorReturnType, -}|callable(InterfaceTypeExtensionNode): VisitorReturnType, +enter?: callable(InterfaceTypeExtensionNode, string, null|Node|NodeList, array, array): VisitorReturnType, +leave?: callable(InterfaceTypeExtensionNode, string, null|Node|NodeList, array, array): VisitorReturnType, +}|callable(InterfaceTypeExtensionNode, string, null|Node|NodeList, array, array): VisitorReturnType, UnionTypeExtension?: array{ -enter?: callable(UnionTypeExtensionNode): VisitorReturnType, -leave?: callable(UnionTypeExtensionNode): VisitorReturnType, -}|callable(UnionTypeExtensionNode): VisitorReturnType, +enter?: callable(UnionTypeExtensionNode, string, null|Node|NodeList, array, array): VisitorReturnType, +leave?: callable(UnionTypeExtensionNode, string, null|Node|NodeList, array, array): VisitorReturnType, +}|callable(UnionTypeExtensionNode, string, null|Node|NodeList, array, array): VisitorReturnType, EnumTypeExtension?: array{ -enter?: callable(EnumTypeExtensionNode): VisitorReturnType, -leave?: callable(EnumTypeExtensionNode): VisitorReturnType, -}|callable(EnumTypeExtensionNode): VisitorReturnType, +enter?: callable(EnumTypeExtensionNode, string, null|Node|NodeList, array, array): VisitorReturnType, +leave?: callable(EnumTypeExtensionNode, string, null|Node|NodeList, array, array): VisitorReturnType, +}|callable(EnumTypeExtensionNode, string, null|Node|NodeList, array, array): VisitorReturnType, InputObjectTypeExtension?: array{ -enter?: callable(InputObjectTypeExtensionNode): VisitorReturnType, -leave?: callable(InputObjectTypeExtensionNode): VisitorReturnType, -}|callable(InputObjectTypeExtensionNode): VisitorReturnType, +enter?: callable(InputObjectTypeExtensionNode, string, null|Node|NodeList, array, array): VisitorReturnType, +leave?: callable(InputObjectTypeExtensionNode, string, null|Node|NodeList, array, array): VisitorReturnType, +}|callable(InputObjectTypeExtensionNode, string, null|Node|NodeList, array, array): VisitorReturnType, } @see \GraphQL\Tests\Language\VisitorTest