Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Reorganize AST interfaces related to schema and type extensions #1073

Merged
merged 3 commits into from
Feb 18, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ You can find and compare releases at the [GitHub release page](https://github.co
- `PromiseAdapter::all()` accepts `iterable`
- Throw if `Introspection::fromSchema()` returns no data
- Reorganize abstract class `ASTValidationContext` to interface `ValidationContext`
- Reorganize AST interfaces related to schema and type extensions

### Added

Expand Down
3 changes: 2 additions & 1 deletion src/Language/AST/DefinitionNode.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@
/**
* export type DefinitionNode =
* | ExecutableDefinitionNode
* | TypeSystemDefinitionNode;.
* | TypeSystemDefinitionNode
* | TypeSystemExtensionNode;.
*/
interface DefinitionNode
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

namespace GraphQL\Language\AST;

class SchemaTypeExtensionNode extends Node implements TypeExtensionNode
class SchemaExtensionNode extends Node implements TypeSystemExtensionNode
{
public string $kind = NodeKind::SCHEMA_EXTENSION;

Expand Down
2 changes: 2 additions & 0 deletions src/Language/AST/TypeDefinitionNode.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
* | UnionTypeDefinitionNode
* | EnumTypeDefinitionNode
* | InputObjectTypeDefinitionNode.
*
* @property NameNode $name
*/
interface TypeDefinitionNode extends TypeSystemDefinitionNode
{
Expand Down
4 changes: 3 additions & 1 deletion src/Language/AST/TypeExtensionNode.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,9 @@
* | UnionTypeExtensionNode
* | EnumTypeExtensionNode
* | InputObjectTypeExtensionNode;.
*
* @property NameNode $name
*/
interface TypeExtensionNode extends TypeSystemDefinitionNode
interface TypeExtensionNode extends TypeSystemExtensionNode
{
}
3 changes: 0 additions & 3 deletions src/Language/AST/TypeSystemDefinitionNode.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,7 @@
* export type TypeSystemDefinitionNode =
* | SchemaDefinitionNode
* | TypeDefinitionNode
* | TypeExtensionNode
* | DirectiveDefinitionNode.
*
* @property NameNode $name
*/
interface TypeSystemDefinitionNode extends DefinitionNode
{
Expand Down
10 changes: 10 additions & 0 deletions src/Language/AST/TypeSystemExtensionNode.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<?php declare(strict_types=1);

namespace GraphQL\Language\AST;

/**
* export type TypeSystemExtensionNode = SchemaExtensionNode | TypeExtensionNode;.
*/
interface TypeSystemExtensionNode extends DefinitionNode
{
}
20 changes: 10 additions & 10 deletions src/Language/Parser.php
Original file line number Diff line number Diff line change
Expand Up @@ -45,13 +45,14 @@
use GraphQL\Language\AST\ScalarTypeDefinitionNode;
use GraphQL\Language\AST\ScalarTypeExtensionNode;
use GraphQL\Language\AST\SchemaDefinitionNode;
use GraphQL\Language\AST\SchemaTypeExtensionNode;
use GraphQL\Language\AST\SchemaExtensionNode;
use GraphQL\Language\AST\SelectionNode;
use GraphQL\Language\AST\SelectionSetNode;
use GraphQL\Language\AST\StringValueNode;
use GraphQL\Language\AST\TypeExtensionNode;
use GraphQL\Language\AST\TypeNode;
use GraphQL\Language\AST\TypeSystemDefinitionNode;
use GraphQL\Language\AST\TypeSystemExtensionNode;
use GraphQL\Language\AST\UnionTypeDefinitionNode;
use GraphQL\Language\AST\UnionTypeExtensionNode;
use GraphQL\Language\AST\ValueNode;
Expand Down Expand Up @@ -161,7 +162,7 @@
* @method static InputObjectTypeDefinitionNode inputObjectTypeDefinition(Source|string $source, bool[] $options = [])
* @method static NodeList<InputValueDefinitionNode> inputFieldsDefinition(Source|string $source, bool[] $options = [])
* @method static TypeExtensionNode typeExtension(Source|string $source, bool[] $options = [])
* @method static SchemaTypeExtensionNode schemaTypeExtension(Source|string $source, bool[] $options = [])
* @method static SchemaExtensionNode schemaTypeExtension(Source|string $source, bool[] $options = [])
* @method static ScalarTypeExtensionNode scalarTypeExtension(Source|string $source, bool[] $options = [])
* @method static ObjectTypeExtensionNode objectTypeExtension(Source|string $source, bool[] $options = [])
* @method static InterfaceTypeExtensionNode interfaceTypeExtension(Source|string $source, bool[] $options = [])
Expand Down Expand Up @@ -508,10 +509,12 @@ private function parseDefinition(): DefinitionNode
case 'union':
case 'enum':
case 'input':
case 'extend':
case 'directive':
// Note: The schema definition language is an experimental addition.
return $this->parseTypeSystemDefinition();

case 'extend':
return $this->parseTypeSystemExtension();
}
} elseif ($this->peek(Token::BRACE_L)) {
return $this->parseExecutableDefinition();
Expand Down Expand Up @@ -1055,9 +1058,6 @@ private function parseTypeSystemDefinition(): TypeSystemDefinitionNode
case 'input':
return $this->parseInputObjectTypeDefinition();

case 'extend':
return $this->parseTypeExtension();

case 'directive':
return $this->parseDirectiveDefinition();
}
Expand Down Expand Up @@ -1404,9 +1404,9 @@ function (): InputValueDefinitionNode {
}

/**
* @return TypeExtensionNode&Node
* @return TypeSystemExtensionNode&Node
*/
private function parseTypeExtension(): TypeExtensionNode
private function parseTypeSystemExtension(): TypeSystemExtensionNode
{
$keywordToken = $this->lexer->lookahead();

Expand Down Expand Up @@ -1438,7 +1438,7 @@ private function parseTypeExtension(): TypeExtensionNode
throw $this->unexpected($keywordToken);
}

private function parseSchemaTypeExtension(): SchemaTypeExtensionNode
private function parseSchemaTypeExtension(): SchemaExtensionNode
{
$start = $this->lexer->token;
$this->expectKeyword('extend');
Expand All @@ -1456,7 +1456,7 @@ private function parseSchemaTypeExtension(): SchemaTypeExtensionNode
$this->unexpected();
}

return new SchemaTypeExtensionNode([
return new SchemaExtensionNode([
'directives' => $directives,
'operationTypes' => $operationTypes,
'loc' => $this->loc($start),
Expand Down
4 changes: 2 additions & 2 deletions src/Language/Printer.php
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@
use GraphQL\Language\AST\ScalarTypeDefinitionNode;
use GraphQL\Language\AST\ScalarTypeExtensionNode;
use GraphQL\Language\AST\SchemaDefinitionNode;
use GraphQL\Language\AST\SchemaTypeExtensionNode;
use GraphQL\Language\AST\SchemaExtensionNode;
use GraphQL\Language\AST\SelectionSetNode;
use GraphQL\Language\AST\StringValueNode;
use GraphQL\Language\AST\UnionTypeDefinitionNode;
Expand Down Expand Up @@ -389,7 +389,7 @@ protected function p(?Node $node, bool $isDescription = false): string
' '
);

case $node instanceof SchemaTypeExtensionNode:
case $node instanceof SchemaExtensionNode:
return $this->join(
[
'extend schema',
Expand Down
4 changes: 2 additions & 2 deletions src/Type/Schema.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
use GraphQL\Error\InvariantViolation;
use GraphQL\GraphQL;
use GraphQL\Language\AST\SchemaDefinitionNode;
use GraphQL\Language\AST\SchemaTypeExtensionNode;
use GraphQL\Language\AST\SchemaExtensionNode;
use GraphQL\Type\Definition\AbstractType;
use GraphQL\Type\Definition\Directive;
use GraphQL\Type\Definition\ImplementingType;
Expand Down Expand Up @@ -70,7 +70,7 @@ class Schema
/** @var array<int, Error> */
private array $validationErrors;

/** @var array<int, SchemaTypeExtensionNode> */
/** @var array<int, SchemaExtensionNode> */
public array $extensionASTNodes = [];

/**
Expand Down
8 changes: 4 additions & 4 deletions src/Type/SchemaConfig.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

use function count;
use GraphQL\Language\AST\SchemaDefinitionNode;
use GraphQL\Language\AST\SchemaTypeExtensionNode;
use GraphQL\Language\AST\SchemaExtensionNode;
use GraphQL\Type\Definition\Directive;
use GraphQL\Type\Definition\NamedType;
use GraphQL\Type\Definition\ObjectType;
Expand Down Expand Up @@ -56,7 +56,7 @@ class SchemaConfig

public ?SchemaDefinitionNode $astNode = null;

/** @var array<SchemaTypeExtensionNode> */
/** @var array<SchemaExtensionNode> */
public array $extensionASTNodes = [];

/**
Expand Down Expand Up @@ -260,15 +260,15 @@ public function setAstNode(SchemaDefinitionNode $astNode): self
}

/**
* @return array<SchemaTypeExtensionNode>
* @return array<SchemaExtensionNode>
*/
public function getExtensionASTNodes(): array
{
return $this->extensionASTNodes;
}

/**
* @param array<SchemaTypeExtensionNode> $extensionASTNodes
* @param array<SchemaExtensionNode> $extensionASTNodes
*/
public function setExtensionASTNodes(array $extensionASTNodes): self
{
Expand Down
6 changes: 3 additions & 3 deletions src/Type/SchemaValidationContext.php
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
use GraphQL\Language\AST\ObjectTypeDefinitionNode;
use GraphQL\Language\AST\ObjectTypeExtensionNode;
use GraphQL\Language\AST\SchemaDefinitionNode;
use GraphQL\Language\AST\SchemaTypeExtensionNode;
use GraphQL\Language\AST\SchemaExtensionNode;
use GraphQL\Language\AST\TypeNode;
use GraphQL\Language\AST\UnionTypeDefinitionNode;
use GraphQL\Language\AST\UnionTypeExtensionNode;
Expand Down Expand Up @@ -470,7 +470,7 @@ private function validateFields(Type $type): void
/**
* @param Schema|ObjectType|InterfaceType|UnionType|EnumType|InputObjectType|Directive $obj
*
* @return array<int, SchemaDefinitionNode|SchemaTypeExtensionNode>|array<int, ObjectTypeDefinitionNode|ObjectTypeExtensionNode>|array<int, InterfaceTypeDefinitionNode|InterfaceTypeExtensionNode>|array<int, UnionTypeDefinitionNode|UnionTypeExtensionNode>|array<int, EnumTypeDefinitionNode|EnumTypeExtensionNode>|array<int, InputObjectTypeDefinitionNode|InputObjectTypeExtensionNode>|array<int, DirectiveDefinitionNode>
* @return array<int, SchemaDefinitionNode|SchemaExtensionNode>|array<int, ObjectTypeDefinitionNode|ObjectTypeExtensionNode>|array<int, InterfaceTypeDefinitionNode|InterfaceTypeExtensionNode>|array<int, UnionTypeDefinitionNode|UnionTypeExtensionNode>|array<int, EnumTypeDefinitionNode|EnumTypeExtensionNode>|array<int, InputObjectTypeDefinitionNode|InputObjectTypeExtensionNode>|array<int, DirectiveDefinitionNode>
*/
private function getAllNodes(object $obj): array
{
Expand Down Expand Up @@ -633,7 +633,7 @@ private function getDirectives(object $object): NodeList
/**
* Excluding directiveNode, since $object is not Directive.
*
* @var SchemaDefinitionNode|SchemaTypeExtensionNode|ObjectTypeDefinitionNode|ObjectTypeExtensionNode|InterfaceTypeDefinitionNode|InterfaceTypeExtensionNode|UnionTypeDefinitionNode|UnionTypeExtensionNode|EnumTypeDefinitionNode|EnumTypeExtensionNode|InputObjectTypeDefinitionNode|InputObjectTypeExtensionNode $node
* @var SchemaDefinitionNode|SchemaExtensionNode|ObjectTypeDefinitionNode|ObjectTypeExtensionNode|InterfaceTypeDefinitionNode|InterfaceTypeExtensionNode|UnionTypeDefinitionNode|UnionTypeExtensionNode|EnumTypeDefinitionNode|EnumTypeExtensionNode|InputObjectTypeDefinitionNode|InputObjectTypeExtensionNode $node
*/
// @phpstan-ignore-next-line union types are not pervasive
foreach ($this->getAllNodes($object) as $node) {
Expand Down
6 changes: 3 additions & 3 deletions src/Utils/SchemaExtender.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
use GraphQL\Language\AST\ObjectTypeExtensionNode;
use GraphQL\Language\AST\ScalarTypeExtensionNode;
use GraphQL\Language\AST\SchemaDefinitionNode;
use GraphQL\Language\AST\SchemaTypeExtensionNode;
use GraphQL\Language\AST\SchemaExtensionNode;
use GraphQL\Language\AST\TypeDefinitionNode;
use GraphQL\Language\AST\TypeExtensionNode;
use GraphQL\Language\AST\UnionTypeExtensionNode;
Expand Down Expand Up @@ -570,13 +570,13 @@ public static function extend(
/** @var SchemaDefinitionNode|null $schemaDef */
$schemaDef = null;

/** @var array<int, SchemaTypeExtensionNode> $schemaExtensions */
/** @var array<int, SchemaExtensionNode> $schemaExtensions */
$schemaExtensions = [];

foreach ($documentAST->definitions as $def) {
if ($def instanceof SchemaDefinitionNode) {
$schemaDef = $def;
} elseif ($def instanceof SchemaTypeExtensionNode) {
} elseif ($def instanceof SchemaExtensionNode) {
$schemaExtensions[] = $def;
} elseif ($def instanceof TypeDefinitionNode) {
$typeName = $def->name->value;
Expand Down
21 changes: 16 additions & 5 deletions src/Validator/Rules/ExecutableDefinitions.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,10 @@
use GraphQL\Language\AST\DocumentNode;
use GraphQL\Language\AST\ExecutableDefinitionNode;
use GraphQL\Language\AST\NodeKind;
use GraphQL\Language\AST\TypeSystemDefinitionNode;
use GraphQL\Language\AST\SchemaDefinitionNode;
use GraphQL\Language\AST\SchemaExtensionNode;
use GraphQL\Language\AST\TypeDefinitionNode;
use GraphQL\Language\AST\TypeExtensionNode;
use GraphQL\Language\Visitor;
use GraphQL\Language\VisitorOperation;
use GraphQL\Validator\QueryValidationContext;
Expand All @@ -25,11 +28,19 @@ public function getVisitor(QueryValidationContext $context): array
NodeKind::DOCUMENT => static function (DocumentNode $node) use ($context): VisitorOperation {
foreach ($node->definitions as $definition) {
if (! $definition instanceof ExecutableDefinitionNode) {
assert($definition instanceof TypeSystemDefinitionNode, 'only other option');
if ($definition instanceof SchemaDefinitionNode || $definition instanceof SchemaExtensionNode) {
$defName = 'schema';
} else {
assert(
$definition instanceof TypeDefinitionNode || $definition instanceof TypeExtensionNode,
'only other option'
);
$defName = "\"{$definition->name->value}\"";
}

$context->reportError(new Error(
static::nonExecutableDefinitionMessage($definition->name->value),
[$definition->name]
static::nonExecutableDefinitionMessage($defName),
[$definition]
));
}
}
Expand All @@ -41,6 +52,6 @@ public function getVisitor(QueryValidationContext $context): array

public static function nonExecutableDefinitionMessage(string $defName): string
{
return "The \"{$defName}\" definition is not executable.";
return "The {$defName} definition is not executable.";
}
}
4 changes: 2 additions & 2 deletions src/Validator/Rules/KnownDirectives.php
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@
use GraphQL\Language\AST\ScalarTypeDefinitionNode;
use GraphQL\Language\AST\ScalarTypeExtensionNode;
use GraphQL\Language\AST\SchemaDefinitionNode;
use GraphQL\Language\AST\SchemaTypeExtensionNode;
use GraphQL\Language\AST\SchemaExtensionNode;
use GraphQL\Language\AST\UnionTypeDefinitionNode;
use GraphQL\Language\AST\UnionTypeExtensionNode;
use GraphQL\Language\AST\VariableDefinitionNode;
Expand Down Expand Up @@ -166,7 +166,7 @@ protected function getDirectiveLocationForASTPath(array $ancestors): string
return DirectiveLocation::VARIABLE_DEFINITION;

case $appliedTo instanceof SchemaDefinitionNode:
case $appliedTo instanceof SchemaTypeExtensionNode:
case $appliedTo instanceof SchemaExtensionNode:
return DirectiveLocation::SCHEMA;

case $appliedTo instanceof ScalarTypeDefinitionNode:
Expand Down
4 changes: 2 additions & 2 deletions src/Validator/Rules/UniqueOperationTypes.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
use GraphQL\Error\Error;
use GraphQL\Language\AST\NodeKind;
use GraphQL\Language\AST\SchemaDefinitionNode;
use GraphQL\Language\AST\SchemaTypeExtensionNode;
use GraphQL\Language\AST\SchemaExtensionNode;
use GraphQL\Language\Visitor;
use GraphQL\Language\VisitorOperation;
use GraphQL\Validator\SDLValidationContext;
Expand All @@ -30,7 +30,7 @@ public function getSDLVisitor(SDLValidationContext $context): array
: [];

/**
* @param SchemaDefinitionNode|SchemaTypeExtensionNode $node
* @param SchemaDefinitionNode|SchemaExtensionNode $node
*/
$checkOperationTypes = static function ($node) use ($context, &$definedOperationTypes, $existingOperationTypes): VisitorOperation {
foreach ($node->operationTypes as $operationType) {
Expand Down
4 changes: 2 additions & 2 deletions tests/Validator/CustomRuleTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,8 @@ public static function nonExecutableDefinitionMessage(string $defName): string
',
[
ErrorHelper::create(
'Custom message including Cow',
[new SourceLocation(8, 12)]
'Custom message including "Cow"',
[new SourceLocation(8, 7)]
),
]
);
Expand Down
4 changes: 2 additions & 2 deletions tests/Validator/ExecutableDefinitionsTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -75,8 +75,8 @@ public function testWithTypeDefinition(): void
}
',
[
$this->nonExecutableDefinition('Cow', 8, 12),
$this->nonExecutableDefinition('Dog', 12, 19),
$this->nonExecutableDefinition('"Cow"', 8, 7),
$this->nonExecutableDefinition('"Dog"', 12, 7),
]
);
}
Expand Down