Skip to content

Commit

Permalink
Reorganize AST interfaces related to schema and type extensions (#1073)
Browse files Browse the repository at this point in the history
  • Loading branch information
spawnia committed Feb 18, 2022
1 parent 4f7db61 commit ceb6e94
Show file tree
Hide file tree
Showing 18 changed files with 67 additions and 43 deletions.
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) {
$typeDefinitionMap[$def->name->value] = $def;
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

0 comments on commit ceb6e94

Please sign in to comment.