Merge pull request #466 from simPod/upgrade-doctrine-cs

Upgrade Doctrine CS
This commit is contained in:
Vladimir Razuvaev 2019-03-29 15:14:04 +07:00 committed by GitHub
commit 5821caa249
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
55 changed files with 150 additions and 128 deletions

View File

@ -14,7 +14,7 @@
"ext-mbstring": "*" "ext-mbstring": "*"
}, },
"require-dev": { "require-dev": {
"doctrine/coding-standard": "^5.0", "doctrine/coding-standard": "^6.0",
"phpbench/phpbench": "^0.14.0", "phpbench/phpbench": "^0.14.0",
"phpstan/phpstan": "^0.11.4", "phpstan/phpstan": "^0.11.4",
"phpstan/phpstan-phpunit": "^0.11.0", "phpstan/phpstan-phpunit": "^0.11.0",

View File

@ -122,13 +122,13 @@ class Error extends Exception implements JsonSerializable, ClientAware
if ($previous instanceof ClientAware) { if ($previous instanceof ClientAware) {
$this->isClientSafe = $previous->isClientSafe(); $this->isClientSafe = $previous->isClientSafe();
$this->category = $previous->getCategory() ?: static::CATEGORY_INTERNAL; $this->category = $previous->getCategory() ?: self::CATEGORY_INTERNAL;
} elseif ($previous) { } elseif ($previous) {
$this->isClientSafe = false; $this->isClientSafe = false;
$this->category = static::CATEGORY_INTERNAL; $this->category = self::CATEGORY_INTERNAL;
} else { } else {
$this->isClientSafe = true; $this->isClientSafe = true;
$this->category = static::CATEGORY_GRAPHQL; $this->category = self::CATEGORY_GRAPHQL;
} }
} }
@ -148,10 +148,10 @@ class Error extends Exception implements JsonSerializable, ClientAware
if ($error instanceof self) { if ($error instanceof self) {
if ($error->path && $error->nodes) { if ($error->path && $error->nodes) {
return $error; return $error;
} else {
$nodes = $nodes ?: $error->nodes;
$path = $path ?: $error->path;
} }
$nodes = $nodes ?: $error->nodes;
$path = $path ?: $error->path;
} }
$source = $positions = $originalError = null; $source = $positions = $originalError = null;

View File

@ -7,8 +7,6 @@ namespace GraphQL\Error;
use LogicException; use LogicException;
/** /**
* Class InvariantVoilation
*
* Note: * Note:
* This exception should not inherit base Error exception as it is raised when there is an error somewhere in * This exception should not inherit base Error exception as it is raised when there is an error somewhere in
* user-land code * user-land code

View File

@ -7,8 +7,6 @@ namespace GraphQL\Error;
use RuntimeException; use RuntimeException;
/** /**
* Class UserError
*
* Error caused by actions of GraphQL clients. Can be safely displayed to a client... * Error caused by actions of GraphQL clients. Can be safely displayed to a client...
*/ */
class UserError extends RuntimeException implements ClientAware class UserError extends RuntimeException implements ClientAware

View File

@ -13,8 +13,6 @@ use function is_object;
use function method_exists; use function method_exists;
/** /**
* Class SyncPromise
*
* Simplistic (yet full-featured) implementation of Promises A+ spec for regular PHP `sync` mode * Simplistic (yet full-featured) implementation of Promises A+ spec for regular PHP `sync` mode
* (using queue to defer promises execution) * (using queue to defer promises execution)
*/ */

View File

@ -160,7 +160,9 @@ class SyncPromiseAdapter implements PromiseAdapter
if ($syncPromise->state === SyncPromise::FULFILLED) { if ($syncPromise->state === SyncPromise::FULFILLED) {
return $syncPromise->result; return $syncPromise->result;
} elseif ($syncPromise->state === SyncPromise::REJECTED) { }
if ($syncPromise->state === SyncPromise::REJECTED) {
throw $syncPromise->result; throw $syncPromise->result;
} }

View File

@ -182,6 +182,7 @@ class ReferenceExecutor implements ExecutorImplementation
} }
Utils::invariant($operation, 'Has operation if no errors.'); Utils::invariant($operation, 'Has operation if no errors.');
Utils::invariant($variableValues !== null, 'Has variables if no errors.'); Utils::invariant($variableValues !== null, 'Has variables if no errors.');
return new ExecutionContext( return new ExecutionContext(
$schema, $schema,
$fragments, $fragments,
@ -206,6 +207,7 @@ class ReferenceExecutor implements ExecutorImplementation
// resolved Promise. // resolved Promise.
$data = $this->executeOperation($this->exeContext->operation, $this->exeContext->rootValue); $data = $this->executeOperation($this->exeContext->operation, $this->exeContext->rootValue);
$result = $this->buildResponse($data); $result = $this->buildResponse($data);
// Note: we deviate here from the reference implementation a bit by always returning promise // Note: we deviate here from the reference implementation a bit by always returning promise
// But for the "sync" case it is always fulfilled // But for the "sync" case it is always fulfilled
return $this->isPromise($result) return $this->isPromise($result)
@ -228,6 +230,7 @@ class ReferenceExecutor implements ExecutorImplementation
if ($data !== null) { if ($data !== null) {
$data = (array) $data; $data = (array) $data;
} }
return new ExecutionResult($data, $this->exeContext->errors); return new ExecutionResult($data, $this->exeContext->errors);
} }
@ -257,13 +260,16 @@ class ReferenceExecutor implements ExecutorImplementation
null, null,
function ($error) { function ($error) {
$this->exeContext->addError($error); $this->exeContext->addError($error);
return $this->exeContext->promises->createFulfilled(null); return $this->exeContext->promises->createFulfilled(null);
} }
); );
} }
return $result; return $result;
} catch (Error $error) { } catch (Error $error) {
$this->exeContext->addError($error); $this->exeContext->addError($error);
return null; return null;
} }
} }
@ -286,6 +292,7 @@ class ReferenceExecutor implements ExecutorImplementation
[$operation] [$operation]
); );
} }
return $queryType; return $queryType;
case 'mutation': case 'mutation':
$mutationType = $schema->getMutationType(); $mutationType = $schema->getMutationType();
@ -295,6 +302,7 @@ class ReferenceExecutor implements ExecutorImplementation
[$operation] [$operation]
); );
} }
return $mutationType; return $mutationType;
case 'subscription': case 'subscription':
$subscriptionType = $schema->getSubscriptionType(); $subscriptionType = $schema->getSubscriptionType();
@ -304,6 +312,7 @@ class ReferenceExecutor implements ExecutorImplementation
[$operation] [$operation]
); );
} }
return $subscriptionType; return $subscriptionType;
default: default:
throw new Error( throw new Error(
@ -378,6 +387,7 @@ class ReferenceExecutor implements ExecutorImplementation
break; break;
} }
} }
return $fields; return $fields;
} }
@ -407,10 +417,8 @@ class ReferenceExecutor implements ExecutorImplementation
$node, $node,
$variableValues $variableValues
); );
if (isset($include['if']) && $include['if'] === false) {
return false; return ! isset($include['if']) || $include['if'] !== false;
}
return true;
} }
/** /**
@ -445,6 +453,7 @@ class ReferenceExecutor implements ExecutorImplementation
if ($conditionalType instanceof AbstractType) { if ($conditionalType instanceof AbstractType) {
return $this->exeContext->schema->isPossibleType($conditionalType, $type); return $this->exeContext->schema->isPossibleType($conditionalType, $type);
} }
return false; return false;
} }
@ -474,10 +483,12 @@ class ReferenceExecutor implements ExecutorImplementation
if ($promise) { if ($promise) {
return $promise->then(static function ($resolvedResult) use ($responseName, $results) { return $promise->then(static function ($resolvedResult) use ($responseName, $results) {
$results[$responseName] = $resolvedResult; $results[$responseName] = $resolvedResult;
return $results; return $results;
}); });
} }
$results[$responseName] = $result; $results[$responseName] = $result;
return $results; return $results;
}, },
[] []
@ -487,6 +498,7 @@ class ReferenceExecutor implements ExecutorImplementation
return self::fixResultsIfEmptyArray($resolvedResults); return self::fixResultsIfEmptyArray($resolvedResults);
}); });
} }
return self::fixResultsIfEmptyArray($result); return self::fixResultsIfEmptyArray($result);
} }
@ -554,6 +566,7 @@ class ReferenceExecutor implements ExecutorImplementation
$path, $path,
$result $result
); );
return $result; return $result;
} }
@ -578,12 +591,17 @@ class ReferenceExecutor implements ExecutorImplementation
$typeNameMetaFieldDef = $typeNameMetaFieldDef ?: Introspection::typeNameMetaFieldDef(); $typeNameMetaFieldDef = $typeNameMetaFieldDef ?: Introspection::typeNameMetaFieldDef();
if ($fieldName === $schemaMetaFieldDef->name && $schema->getQueryType() === $parentType) { if ($fieldName === $schemaMetaFieldDef->name && $schema->getQueryType() === $parentType) {
return $schemaMetaFieldDef; return $schemaMetaFieldDef;
} elseif ($fieldName === $typeMetaFieldDef->name && $schema->getQueryType() === $parentType) { }
if ($fieldName === $typeMetaFieldDef->name && $schema->getQueryType() === $parentType) {
return $typeMetaFieldDef; return $typeMetaFieldDef;
} elseif ($fieldName === $typeNameMetaFieldDef->name) { }
if ($fieldName === $typeNameMetaFieldDef->name) {
return $typeNameMetaFieldDef; return $typeNameMetaFieldDef;
} }
$tmp = $parentType->getFields(); $tmp = $parentType->getFields();
return $tmp[$fieldName] ?? null; return $tmp[$fieldName] ?? null;
} }
@ -610,6 +628,7 @@ class ReferenceExecutor implements ExecutorImplementation
$fieldNode, $fieldNode,
$this->exeContext->variableValues $this->exeContext->variableValues
); );
return $resolveFn($source, $args, $context, $info); return $resolveFn($source, $args, $context, $info);
} catch (Exception $error) { } catch (Exception $error) {
return $error; return $error;
@ -663,15 +682,18 @@ class ReferenceExecutor implements ExecutorImplementation
null, null,
function ($error) use ($exeContext) { function ($error) use ($exeContext) {
$exeContext->addError($error); $exeContext->addError($error);
return $this->exeContext->promises->createFulfilled(null); return $this->exeContext->promises->createFulfilled(null);
} }
); );
} }
return $completed; return $completed;
} catch (Error $err) { } catch (Error $err) {
// If `completeValueWithLocatedError` returned abruptly (threw an error), log the error // If `completeValueWithLocatedError` returned abruptly (threw an error), log the error
// and return null. // and return null.
$exeContext->addError($err); $exeContext->addError($err);
return null; return null;
} }
} }
@ -716,6 +738,7 @@ class ReferenceExecutor implements ExecutorImplementation
} }
); );
} }
return $completed; return $completed;
} catch (Exception $error) { } catch (Exception $error) {
throw Error::createLocatedError($error, $fieldNodes, $path); throw Error::createLocatedError($error, $fieldNodes, $path);
@ -786,6 +809,7 @@ class ReferenceExecutor implements ExecutorImplementation
'Cannot return null for non-nullable field ' . $info->parentType . '.' . $info->fieldName . '.' 'Cannot return null for non-nullable field ' . $info->parentType . '.' . $info->fieldName . '.'
); );
} }
return $completed; return $completed;
} }
// If result is null-like, return null. // If result is null-like, return null.
@ -863,8 +887,10 @@ class ReferenceExecutor implements ExecutorImplementation
Utils::printSafe($promise) Utils::printSafe($promise)
)); ));
} }
return $promise; return $promise;
} }
return null; return null;
} }
@ -891,6 +917,7 @@ class ReferenceExecutor implements ExecutorImplementation
return $callback($resolved, $value); return $callback($resolved, $value);
}); });
} }
return $callback($previous, $value); return $callback($previous, $value);
}, },
$initialValue $initialValue
@ -928,6 +955,7 @@ class ReferenceExecutor implements ExecutorImplementation
} }
$completedItems[] = $completedItem; $completedItems[] = $completedItem;
} }
return $containsPromise ? $this->exeContext->promises->all($completedItems) : $completedItems; return $containsPromise ? $this->exeContext->promises->all($completedItems) : $completedItems;
} }
@ -1001,6 +1029,7 @@ class ReferenceExecutor implements ExecutorImplementation
); );
}); });
} }
return $this->completeObjectValue( return $this->completeObjectValue(
$this->ensureValidRuntimeType( $this->ensureValidRuntimeType(
$runtimeType, $runtimeType,
@ -1076,9 +1105,11 @@ class ReferenceExecutor implements ExecutorImplementation
return $possibleTypes[$index]; return $possibleTypes[$index];
} }
} }
return null; return null;
}); });
} }
return null; return null;
} }
@ -1111,6 +1142,7 @@ class ReferenceExecutor implements ExecutorImplementation
if (! $isTypeOfResult) { if (! $isTypeOfResult) {
throw $this->invalidReturnTypeError($returnType, $result, $fieldNodes); throw $this->invalidReturnTypeError($returnType, $result, $fieldNodes);
} }
return $this->collectAndExecuteSubfields( return $this->collectAndExecuteSubfields(
$returnType, $returnType,
$fieldNodes, $fieldNodes,
@ -1123,6 +1155,7 @@ class ReferenceExecutor implements ExecutorImplementation
throw $this->invalidReturnTypeError($returnType, $result, $fieldNodes); throw $this->invalidReturnTypeError($returnType, $result, $fieldNodes);
} }
} }
return $this->collectAndExecuteSubfields( return $this->collectAndExecuteSubfields(
$returnType, $returnType,
$fieldNodes, $fieldNodes,
@ -1164,6 +1197,7 @@ class ReferenceExecutor implements ExecutorImplementation
&$result &$result
) { ) {
$subFieldNodes = $this->collectSubFields($returnType, $fieldNodes); $subFieldNodes = $this->collectSubFields($returnType, $fieldNodes);
return $this->executeFields($returnType, $result, $path, $subFieldNodes); return $this->executeFields($returnType, $result, $path, $subFieldNodes);
} }
@ -1189,6 +1223,7 @@ class ReferenceExecutor implements ExecutorImplementation
} }
$this->subFieldCache[$returnType][$fieldNodes] = $subFieldNodes; $this->subFieldCache[$returnType][$fieldNodes] = $subFieldNodes;
} }
return $this->subFieldCache[$returnType][$fieldNodes]; return $this->subFieldCache[$returnType][$fieldNodes];
} }
@ -1222,6 +1257,7 @@ class ReferenceExecutor implements ExecutorImplementation
if (! $containsPromise) { if (! $containsPromise) {
return self::fixResultsIfEmptyArray($finalResults); return self::fixResultsIfEmptyArray($finalResults);
} }
// Otherwise, results is a map from field name to the result // Otherwise, results is a map from field name to the result
// of resolving that field, which is possibly a promise. Return // of resolving that field, which is possibly a promise. Return
// a promise that will return this same map, but with any // a promise that will return this same map, but with any
@ -1241,6 +1277,7 @@ class ReferenceExecutor implements ExecutorImplementation
if ($results === []) { if ($results === []) {
return new stdClass(); return new stdClass();
} }
return $results; return $results;
} }
@ -1260,11 +1297,13 @@ class ReferenceExecutor implements ExecutorImplementation
$keys = array_keys($assoc); $keys = array_keys($assoc);
$valuesAndPromises = array_values($assoc); $valuesAndPromises = array_values($assoc);
$promise = $this->exeContext->promises->all($valuesAndPromises); $promise = $this->exeContext->promises->all($valuesAndPromises);
return $promise->then(static function ($values) use ($keys) { return $promise->then(static function ($values) use ($keys) {
$resolvedResults = []; $resolvedResults = [];
foreach ($values as $i => $value) { foreach ($values as $i => $value) {
$resolvedResults[$keys[$i]] = $value; $resolvedResults[$keys[$i]] = $value;
} }
return self::fixResultsIfEmptyArray($resolvedResults); return self::fixResultsIfEmptyArray($resolvedResults);
}); });
} }
@ -1318,6 +1357,7 @@ class ReferenceExecutor implements ExecutorImplementation
) )
); );
} }
return $runtimeType; return $runtimeType;
} }
} }

View File

@ -86,11 +86,13 @@ class Collector
} else { } else {
$this->runtime->addError(new Error('Must provide an operation.')); $this->runtime->addError(new Error('Must provide an operation.'));
} }
return; return;
} }
if ($hasMultipleAssumedOperations) { if ($hasMultipleAssumedOperations) {
$this->runtime->addError(new Error('Must provide operation name if query contains multiple operations.')); $this->runtime->addError(new Error('Must provide operation name if query contains multiple operations.'));
return; return;
} }
@ -211,7 +213,9 @@ class Collector
if (isset($this->visitedFragments[$fragmentName])) { if (isset($this->visitedFragments[$fragmentName])) {
continue; continue;
} elseif (! isset($this->fragments[$fragmentName])) { }
if (! isset($this->fragments[$fragmentName])) {
$this->runtime->addError(new Error( $this->runtime->addError(new Error(
sprintf('Fragment "%s" does not exist.', $fragmentName), sprintf('Fragment "%s" does not exist.', $fragmentName),
$selection $selection

View File

@ -147,6 +147,7 @@ class CoroutineExecutor implements Runtime, ExecutorImplementation
if ($emptyObjectAsStdClass && empty($array)) { if ($emptyObjectAsStdClass && empty($array)) {
return new stdClass(); return new stdClass();
} }
return $array; return $array;
} }
@ -155,6 +156,7 @@ class CoroutineExecutor implements Runtime, ExecutorImplementation
foreach ($value as $key => $item) { foreach ($value as $key => $item) {
$array[$key] = self::resultToArray($item); $array[$key] = self::resultToArray($item);
} }
return $array; return $array;
} }
@ -365,6 +367,7 @@ class CoroutineExecutor implements Runtime, ExecutorImplementation
// short-circuit evaluation for __typename // short-circuit evaluation for __typename
if ($ctx->shared->fieldName === Introspection::TYPE_NAME_FIELD_NAME) { if ($ctx->shared->fieldName === Introspection::TYPE_NAME_FIELD_NAME) {
$ctx->result->{$ctx->shared->resultName} = $ctx->type->name; $ctx->result->{$ctx->shared->resultName} = $ctx->type->name;
return; return;
} }

View File

@ -59,6 +59,7 @@ class Location
$tmp = new static(); $tmp = new static();
$tmp->start = $start; $tmp->start = $start;
$tmp->end = $end; $tmp->end = $end;
return $tmp; return $tmp;
} }

View File

@ -105,6 +105,7 @@ class NodeList implements ArrayAccess, IteratorAggregate, Countable
if ($list instanceof self) { if ($list instanceof self) {
$list = $list->nodes; $list = $list->nodes;
} }
return new NodeList(array_merge($this->nodes, $list)); return new NodeList(array_merge($this->nodes, $list));
} }

View File

@ -23,6 +23,22 @@ use function preg_match;
*/ */
class Lexer class Lexer
{ {
private const TOKEN_BANG = 33;
private const TOKEN_HASH = 35;
private const TOKEN_DOLLAR = 36;
private const TOKEN_AMP = 38;
private const TOKEN_PAREN_L = 40;
private const TOKEN_PAREN_R = 41;
private const TOKEN_DOT = 46;
private const TOKEN_COLON = 58;
private const TOKEN_EQUALS = 61;
private const TOKEN_AT = 64;
private const TOKEN_BRACKET_L = 91;
private const TOKEN_BRACKET_R = 93;
private const TOKEN_BRACE_L = 123;
private const TOKEN_PIPE = 124;
private const TOKEN_BRACE_R = 125;
/** @var Source */ /** @var Source */
public $source; public $source;
@ -92,7 +108,8 @@ class Lexer
*/ */
public function advance() public function advance()
{ {
$this->lastToken = $this->token; $this->lastToken = $this->token;
return $this->token = $this->lookahead(); return $this->token = $this->lookahead();
} }
@ -131,44 +148,45 @@ class Lexer
[, $code, $bytes] = $this->readChar(true); [, $code, $bytes] = $this->readChar(true);
switch ($code) { switch ($code) {
case 33: // ! case self::TOKEN_BANG:
return new Token(Token::BANG, $position, $position + 1, $line, $col, $prev); return new Token(Token::BANG, $position, $position + 1, $line, $col, $prev);
case 35: // # case self::TOKEN_HASH: // #
$this->moveStringCursor(-1, -1 * $bytes); $this->moveStringCursor(-1, -1 * $bytes);
return $this->readComment($line, $col, $prev); return $this->readComment($line, $col, $prev);
case 36: // $ case self::TOKEN_DOLLAR:
return new Token(Token::DOLLAR, $position, $position + 1, $line, $col, $prev); return new Token(Token::DOLLAR, $position, $position + 1, $line, $col, $prev);
case 38: // & case self::TOKEN_AMP:
return new Token(Token::AMP, $position, $position + 1, $line, $col, $prev); return new Token(Token::AMP, $position, $position + 1, $line, $col, $prev);
case 40: // ( case self::TOKEN_PAREN_L:
return new Token(Token::PAREN_L, $position, $position + 1, $line, $col, $prev); return new Token(Token::PAREN_L, $position, $position + 1, $line, $col, $prev);
case 41: // ) case self::TOKEN_PAREN_R:
return new Token(Token::PAREN_R, $position, $position + 1, $line, $col, $prev); return new Token(Token::PAREN_R, $position, $position + 1, $line, $col, $prev);
case 46: // . case self::TOKEN_DOT: // .
[, $charCode1] = $this->readChar(true); [, $charCode1] = $this->readChar(true);
[, $charCode2] = $this->readChar(true); [, $charCode2] = $this->readChar(true);
if ($charCode1 === 46 && $charCode2 === 46) { if ($charCode1 === self::TOKEN_DOT && $charCode2 === self::TOKEN_DOT) {
return new Token(Token::SPREAD, $position, $position + 3, $line, $col, $prev); return new Token(Token::SPREAD, $position, $position + 3, $line, $col, $prev);
} }
break; break;
case 58: // : case self::TOKEN_COLON:
return new Token(Token::COLON, $position, $position + 1, $line, $col, $prev); return new Token(Token::COLON, $position, $position + 1, $line, $col, $prev);
case 61: // = case self::TOKEN_EQUALS:
return new Token(Token::EQUALS, $position, $position + 1, $line, $col, $prev); return new Token(Token::EQUALS, $position, $position + 1, $line, $col, $prev);
case 64: // @ case self::TOKEN_AT:
return new Token(Token::AT, $position, $position + 1, $line, $col, $prev); return new Token(Token::AT, $position, $position + 1, $line, $col, $prev);
case 91: // [ case self::TOKEN_BRACKET_L:
return new Token(Token::BRACKET_L, $position, $position + 1, $line, $col, $prev); return new Token(Token::BRACKET_L, $position, $position + 1, $line, $col, $prev);
case 93: // ] case self::TOKEN_BRACKET_R:
return new Token(Token::BRACKET_R, $position, $position + 1, $line, $col, $prev); return new Token(Token::BRACKET_R, $position, $position + 1, $line, $col, $prev);
case 123: // { case self::TOKEN_BRACE_L:
return new Token(Token::BRACE_L, $position, $position + 1, $line, $col, $prev); return new Token(Token::BRACE_L, $position, $position + 1, $line, $col, $prev);
case 124: // | case self::TOKEN_PIPE:
return new Token(Token::PIPE, $position, $position + 1, $line, $col, $prev); return new Token(Token::PIPE, $position, $position + 1, $line, $col, $prev);
case 125: // } case self::TOKEN_BRACE_R:
return new Token(Token::BRACE_R, $position, $position + 1, $line, $col, $prev); return new Token(Token::BRACE_R, $position, $position + 1, $line, $col, $prev);
// A-Z // A-Z
case 65: case 65:
case 66: case 66:
@ -227,6 +245,7 @@ class Lexer
case 122: case 122:
return $this->moveStringCursor(-1, -1 * $bytes) return $this->moveStringCursor(-1, -1 * $bytes)
->readName($line, $col, $prev); ->readName($line, $col, $prev);
// - // -
case 45: case 45:
// 0-9 // 0-9
@ -242,6 +261,7 @@ class Lexer
case 57: case 57:
return $this->moveStringCursor(-1, -1 * $bytes) return $this->moveStringCursor(-1, -1 * $bytes)
->readNumber($line, $col, $prev); ->readNumber($line, $col, $prev);
// " // "
case 34: case 34:
[, $nextCode] = $this->readChar(); [, $nextCode] = $this->readChar();
@ -564,10 +584,10 @@ class Lexer
$prev, $prev,
BlockString::value($value) BlockString::value($value)
); );
} else {
// move cursor back to before the first quote
$this->moveStringCursor(-2, -2);
} }
// move cursor back to before the first quote
$this->moveStringCursor(-2, -2);
} }
$this->assertValidBlockStringCharacterCode($code, $this->position); $this->assertValidBlockStringCharacterCode($code, $this->position);

View File

@ -439,7 +439,6 @@ class Parser
case 'mutation': case 'mutation':
case 'subscription': case 'subscription':
return $this->parseOperationDefinition(); return $this->parseOperationDefinition();
case 'fragment': case 'fragment':
return $this->parseFragmentDefinition(); return $this->parseFragmentDefinition();
} }
@ -827,7 +826,9 @@ class Parser
'value' => $token->value === 'true', 'value' => $token->value === 'true',
'loc' => $this->loc($token), 'loc' => $this->loc($token),
]); ]);
} elseif ($token->value === 'null') { }
if ($token->value === 'null') {
$this->lexer->advance(); $this->lexer->advance();
return new NullValueNode([ return new NullValueNode([

View File

@ -115,6 +115,7 @@ class Printer
$varDefs = $this->wrap('(', $this->join($node->variableDefinitions, ', '), ')'); $varDefs = $this->wrap('(', $this->join($node->variableDefinitions, ', '), ')');
$directives = $this->join($node->directives, ' '); $directives = $this->join($node->directives, ' ');
$selectionSet = $node->selectionSet; $selectionSet = $node->selectionSet;
// Anonymous queries with no directives or variable definitions can use // Anonymous queries with no directives or variable definitions can use
// the query short form. // the query short form.
return ! $name && ! $directives && ! $varDefs && $op === 'query' return ! $name && ! $directives && ! $varDefs && $op === 'query'

View File

@ -151,6 +151,7 @@ class StandardServer
StreamInterface $writableBodyStream StreamInterface $writableBodyStream
) { ) {
$result = $this->executePsrRequest($request); $result = $this->executePsrRequest($request);
return $this->helper->toPsrResponse($result, $response, $writableBodyStream); return $this->helper->toPsrResponse($result, $response, $writableBodyStream);
} }
@ -165,6 +166,7 @@ class StandardServer
public function executePsrRequest(ServerRequestInterface $request) public function executePsrRequest(ServerRequestInterface $request)
{ {
$parsedBody = $this->helper->parsePsrRequest($request); $parsedBody = $this->helper->parsePsrRequest($request);
return $this->executeRequest($parsedBody); return $this->executeRequest($parsedBody);
} }

View File

@ -11,9 +11,6 @@ use GraphQL\Language\AST\Node;
use GraphQL\Utils\Utils; use GraphQL\Utils\Utils;
use function is_bool; use function is_bool;
/**
* Class BooleanType
*/
class BooleanType extends ScalarType class BooleanType extends ScalarType
{ {
/** @var string */ /** @var string */

View File

@ -12,9 +12,6 @@ use function call_user_func;
use function is_callable; use function is_callable;
use function sprintf; use function sprintf;
/**
* Class CustomScalarType
*/
class CustomScalarType extends ScalarType class CustomScalarType extends ScalarType
{ {
/** /**

View File

@ -12,9 +12,6 @@ use function array_keys;
use function in_array; use function in_array;
use function is_array; use function is_array;
/**
* Class Directive
*/
class Directive class Directive
{ {
public const DEFAULT_DEPRECATION_REASON = 'No longer supported'; public const DEFAULT_DEPRECATION_REASON = 'No longer supported';
@ -80,6 +77,7 @@ class Directive
public static function includeDirective() public static function includeDirective()
{ {
$internal = self::getInternalDirectives(); $internal = self::getInternalDirectives();
return $internal['include']; return $internal['include'];
} }
@ -140,24 +138,30 @@ class Directive
]), ]),
]; ];
} }
return self::$internalDirectives; return self::$internalDirectives;
} }
/** /**
* @return Directive * @return Directive
*/ */
public static function skipDirective() public static function skipDirective()
{ {
$internal = self::getInternalDirectives(); $internal = self::getInternalDirectives();
return $internal['skip']; return $internal['skip'];
} }
/** /**
* @return Directive * @return Directive
*/ */
public static function deprecatedDirective() public static function deprecatedDirective()
{ {
$internal = self::getInternalDirectives(); $internal = self::getInternalDirectives();
return $internal['deprecated']; return $internal['deprecated'];
} }
/** /**
* @return bool * @return bool
*/ */

View File

@ -19,9 +19,6 @@ use function is_int;
use function is_string; use function is_string;
use function sprintf; use function sprintf;
/**
* Class EnumType
*/
class EnumType extends Type implements InputType, OutputType, LeafType, NullableType, NamedType class EnumType extends Type implements InputType, OutputType, LeafType, NullableType, NamedType
{ {
/** @var EnumTypeDefinitionNode|null */ /** @var EnumTypeDefinitionNode|null */
@ -33,7 +30,7 @@ class EnumType extends Type implements InputType, OutputType, LeafType, Nullable
/** @var MixedStore<mixed, EnumValueDefinition> */ /** @var MixedStore<mixed, EnumValueDefinition> */
private $valueLookup; private $valueLookup;
/** @var \ArrayObject<string, EnumValueDefinition> */ /** @var ArrayObject<string, EnumValueDefinition> */
private $nameLookup; private $nameLookup;
/** @var EnumTypeExtensionNode[] */ /** @var EnumTypeExtensionNode[] */
@ -71,7 +68,7 @@ class EnumType extends Type implements InputType, OutputType, LeafType, Nullable
} }
/** /**
* @return \ArrayObject<string, EnumValueDefinition> * @return ArrayObject<string, EnumValueDefinition>
*/ */
private function getNameLookup() private function getNameLookup()
{ {

View File

@ -6,9 +6,6 @@ namespace GraphQL\Type\Definition;
use GraphQL\Language\AST\EnumValueDefinitionNode; use GraphQL\Language\AST\EnumValueDefinitionNode;
/**
* Class EnumValueDefinition
*/
class EnumValueDefinition class EnumValueDefinition
{ {
/** @var string */ /** @var string */

View File

@ -11,9 +11,6 @@ use function is_array;
use function is_string; use function is_string;
use function sprintf; use function sprintf;
/**
* Class FieldArgument
*/
class FieldArgument class FieldArgument
{ {
/** @var string */ /** @var string */

View File

@ -81,7 +81,7 @@ class FieldDefinition
$this->config = $config; $this->config = $config;
$this->complexityFn = $config['complexity'] ?? static::DEFAULT_COMPLEXITY_FN; $this->complexityFn = $config['complexity'] ?? self::DEFAULT_COMPLEXITY_FN;
} }
public static function defineFieldMap(Type $type, $fields) public static function defineFieldMap(Type $type, $fields)

View File

@ -12,9 +12,6 @@ use GraphQL\Language\AST\Node;
use GraphQL\Utils\Utils; use GraphQL\Utils\Utils;
use function is_numeric; use function is_numeric;
/**
* Class FloatType
*/
class FloatType extends ScalarType class FloatType extends ScalarType
{ {
/** @var string */ /** @var string */

View File

@ -15,9 +15,6 @@ use function is_callable;
use function is_string; use function is_string;
use function sprintf; use function sprintf;
/**
* Class InputObjectType
*/
class InputObjectType extends Type implements InputType, NullableType, NamedType class InputObjectType extends Type implements InputType, NullableType, NamedType
{ {
/** @var InputObjectTypeDefinitionNode|null */ /** @var InputObjectTypeDefinitionNode|null */

View File

@ -14,9 +14,6 @@ use function intval;
use function is_bool; use function is_bool;
use function is_numeric; use function is_numeric;
/**
* Class IntType
*/
class IntType extends ScalarType class IntType extends ScalarType
{ {
// As per the GraphQL Spec, Integers are only treated as valid when a valid // As per the GraphQL Spec, Integers are only treated as valid when a valid

View File

@ -12,9 +12,6 @@ use function is_callable;
use function is_string; use function is_string;
use function sprintf; use function sprintf;
/**
* Class InterfaceType
*/
class InterfaceType extends Type implements AbstractType, OutputType, CompositeType, NullableType, NamedType class InterfaceType extends Type implements AbstractType, OutputType, CompositeType, NullableType, NamedType
{ {
/** @var InterfaceTypeDefinitionNode|null */ /** @var InterfaceTypeDefinitionNode|null */

View File

@ -4,9 +4,6 @@ declare(strict_types=1);
namespace GraphQL\Type\Definition; namespace GraphQL\Type\Definition;
/**
* Class ListOfType
*/
class ListOfType extends Type implements WrappingType, OutputType, NullableType, InputType class ListOfType extends Type implements WrappingType, OutputType, NullableType, InputType
{ {
/** @var ObjectType|InterfaceType|UnionType|ScalarType|InputObjectType|EnumType */ /** @var ObjectType|InterfaceType|UnionType|ScalarType|InputObjectType|EnumType */

View File

@ -6,9 +6,6 @@ namespace GraphQL\Type\Definition;
use GraphQL\Utils\Utils; use GraphQL\Utils\Utils;
/**
* Class NonNull
*/
class NonNull extends Type implements WrappingType, OutputType, InputType class NonNull extends Type implements WrappingType, OutputType, InputType
{ {
/** @var NullableType */ /** @var NullableType */

View File

@ -183,6 +183,7 @@ class QueryPlan
); );
} }
} }
return $fields; return $fields;
} }

View File

@ -226,6 +226,7 @@ class ResolveInfo
); );
} }
} }
return $fields; return $fields;
} }
} }

View File

@ -14,9 +14,6 @@ use function is_object;
use function is_scalar; use function is_scalar;
use function method_exists; use function method_exists;
/**
* Class StringType
*/
class StringType extends ScalarType class StringType extends ScalarType
{ {
/** @var string */ /** @var string */

View File

@ -194,6 +194,7 @@ abstract class Type implements JsonSerializable
public static function getInternalTypes() public static function getInternalTypes()
{ {
trigger_error(__METHOD__ . ' is deprecated. Use Type::getStandardTypes() instead', E_USER_DEPRECATED); trigger_error(__METHOD__ . ' is deprecated. Use Type::getStandardTypes() instead', E_USER_DEPRECATED);
return self::getStandardTypes(); return self::getStandardTypes();
} }

View File

@ -14,9 +14,6 @@ use function is_callable;
use function is_string; use function is_string;
use function sprintf; use function sprintf;
/**
* Class UnionType
*/
class UnionType extends Type implements AbstractType, OutputType, CompositeType, NullableType, NamedType class UnionType extends Type implements AbstractType, OutputType, CompositeType, NullableType, NamedType
{ {
/** @var UnionTypeDefinitionNode */ /** @var UnionTypeDefinitionNode */

View File

@ -353,6 +353,7 @@ class AST
// No valid return value. // No valid return value.
return $undefined; return $undefined;
} }
// Note: we're not doing any checking that this variable is correct. We're // Note: we're not doing any checking that this variable is correct. We're
// assuming that this query has been validated and the variable usage here // assuming that this query has been validated and the variable usage here
// is of the correct type. // is of the correct type.

View File

@ -144,7 +144,8 @@ class ASTDefinitionBuilder
// Note: While this could make assertions to get the correctly typed // Note: While this could make assertions to get the correctly typed
// value, that would throw immediately while type system validation // value, that would throw immediately while type system validation
// with validateSchema() will produce more actionable results. // with validateSchema() will produce more actionable results.
$type = $this->internalBuildWrappedType($value->type); $type = $this->internalBuildWrappedType($value->type);
$config = [ $config = [
'name' => $value->name->value, 'name' => $value->name->value,
'type' => $type, 'type' => $type,

View File

@ -22,8 +22,6 @@ use function is_string;
* *
* Note: unfortunately when storing array as key - access and modification is O(N) * Note: unfortunately when storing array as key - access and modification is O(N)
* (yet this should be really rare case and should be avoided when possible) * (yet this should be really rare case and should be avoided when possible)
*
* Class MixedStore
*/ */
class MixedStore implements ArrayAccess class MixedStore implements ArrayAccess
{ {

View File

@ -66,6 +66,7 @@ class SchemaExtender
return $type->extensionASTNodes; return $type->extensionASTNodes;
} }
return static::$typeExtensionsMap[$name] ?? null; return static::$typeExtensionsMap[$name] ?? null;
} }
@ -284,6 +285,7 @@ class SchemaExtender
} }
} }
} }
return $interfaces; return $interfaces;
} }

View File

@ -153,11 +153,8 @@ class SchemaPrinter
} }
$subscriptionType = $schema->getSubscriptionType(); $subscriptionType = $schema->getSubscriptionType();
if ($subscriptionType && $subscriptionType->name !== 'Subscription') {
return false;
}
return true; return ! $subscriptionType || $subscriptionType->name === 'Subscription';
} }
private static function printDirective($directive, $options) : string private static function printDirective($directive, $options) : string

View File

@ -86,18 +86,12 @@ class TypeComparators
// If superType type is an abstract type, maybeSubType type may be a currently // If superType type is an abstract type, maybeSubType type may be a currently
// possible object type. // possible object type.
if (Type::isAbstractType($superType) && return Type::isAbstractType($superType) &&
$maybeSubType instanceof ObjectType && $maybeSubType instanceof ObjectType &&
$schema->isPossibleType( $schema->isPossibleType(
$superType, $superType,
$maybeSubType $maybeSubType
) );
) {
return true;
}
// Otherwise, the child type is not a valid subtype of the parent type.
return false;
} }
/** /**
@ -131,13 +125,11 @@ class TypeComparators
return false; return false;
} }
/** @var $typeB ObjectType */
// Determine if the latter type is a possible concrete type of the former. // Determine if the latter type is a possible concrete type of the former.
return $schema->isPossibleType($typeA, $typeB); return $schema->isPossibleType($typeA, $typeB);
} }
if ($typeB instanceof AbstractType) { if ($typeB instanceof AbstractType) {
/** @var $typeA ObjectType */
// Determine if the former type is a possible concrete type of the latter. // Determine if the former type is a possible concrete type of the latter.
return $schema->isPossibleType($typeB, $typeA); return $schema->isPossibleType($typeB, $typeA);
} }

View File

@ -28,6 +28,7 @@ use GraphQL\Type\Definition\UnionType;
use GraphQL\Type\Definition\WrappingType; use GraphQL\Type\Definition\WrappingType;
use GraphQL\Type\Introspection; use GraphQL\Type\Introspection;
use GraphQL\Type\Schema; use GraphQL\Type\Schema;
use SplStack;
use function array_map; use function array_map;
use function array_merge; use function array_merge;
use function array_pop; use function array_pop;
@ -35,24 +36,21 @@ use function count;
use function is_array; use function is_array;
use function sprintf; use function sprintf;
/**
* Class TypeInfo
*/
class TypeInfo class TypeInfo
{ {
/** @var Schema */ /** @var Schema */
private $schema; private $schema;
/** @var \SplStack<OutputType> */ /** @var SplStack<OutputType> */
private $typeStack; private $typeStack;
/** @var \SplStack<CompositeType> */ /** @var SplStack<CompositeType> */
private $parentTypeStack; private $parentTypeStack;
/** @var \SplStack<InputType> */ /** @var SplStack<InputType> */
private $inputTypeStack; private $inputTypeStack;
/** @var \SplStack<FieldDefinition> */ /** @var SplStack<FieldDefinition> */
private $fieldDefStack; private $fieldDefStack;
/** @var Directive */ /** @var Directive */
@ -155,6 +153,7 @@ class TypeInfo
if (! $alreadyInMap) { if (! $alreadyInMap) {
$typeMap[$i] = $type; $typeMap[$i] = $type;
} }
return $typeMap; return $typeMap;
} }

View File

@ -52,6 +52,6 @@ class DisableIntrospection extends QuerySecurityRule
protected function isEnabled() protected function isEnabled()
{ {
return $this->isEnabled !== static::DISABLED; return $this->isEnabled !== self::DISABLED;
} }
} }

View File

@ -32,6 +32,7 @@ class LoneSchemaDefinition extends ValidationRule
NodeKind::SCHEMA_DEFINITION => static function (SchemaDefinitionNode $node) use ($alreadyDefined, $context, &$schemaDefinitionsCount) { NodeKind::SCHEMA_DEFINITION => static function (SchemaDefinitionNode $node) use ($alreadyDefined, $context, &$schemaDefinitionsCount) {
if ($alreadyDefined !== false) { if ($alreadyDefined !== false) {
$context->reportError(new Error('Cannot define a new schema within a schema extension.', $node)); $context->reportError(new Error('Cannot define a new schema within a schema extension.', $node));
return; return;
} }

View File

@ -12,8 +12,6 @@ use GraphQL\Validator\ValidationContext;
use function sprintf; use function sprintf;
/** /**
* Class NoUndefinedVariables
*
* A GraphQL operation is only valid if all variables encountered, both directly * A GraphQL operation is only valid if all variables encountered, both directly
* and via fragment spreads, are defined by that operation. * and via fragment spreads, are defined by that operation.
*/ */

View File

@ -206,10 +206,12 @@ class QueryComplexity extends QuerySecurityRule
$directive = Directive::includeDirective(); $directive = Directive::includeDirective();
/** @var bool $directiveArgsIf */ /** @var bool $directiveArgsIf */
$directiveArgsIf = Values::getArgumentValues($directive, $directiveNode, $variableValues)['if']; $directiveArgsIf = Values::getArgumentValues($directive, $directiveNode, $variableValues)['if'];
return ! $directiveArgsIf; return ! $directiveArgsIf;
} }
$directive = Directive::skipDirective(); $directive = Directive::skipDirective();
$directiveArgsIf = Values::getArgumentValues($directive, $directiveNode, $variableValues); $directiveArgsIf = Values::getArgumentValues($directive, $directiveNode, $variableValues);
return $directiveArgsIf['if']; return $directiveArgsIf['if'];
} }
} }
@ -282,6 +284,6 @@ class QueryComplexity extends QuerySecurityRule
protected function isEnabled() protected function isEnabled()
{ {
return $this->getMaxQueryComplexity() !== static::DISABLED; return $this->getMaxQueryComplexity() !== self::DISABLED;
} }
} }

View File

@ -113,6 +113,6 @@ class QueryDepth extends QuerySecurityRule
protected function isEnabled() protected function isEnabled()
{ {
return $this->getMaxQueryDepth() !== static::DISABLED; return $this->getMaxQueryDepth() !== self::DISABLED;
} }
} }

View File

@ -49,6 +49,7 @@ class ValuesOfCorrectType extends ValidationRule
public function getVisitor(ValidationContext $context) public function getVisitor(ValidationContext $context)
{ {
$fieldName = ''; $fieldName = '';
return [ return [
NodeKind::FIELD => [ NodeKind::FIELD => [
'enter' => static function (FieldNode $node) use (&$fieldName) { 'enter' => static function (FieldNode $node) use (&$fieldName) {
@ -281,6 +282,7 @@ class ValuesOfCorrectType extends ValidationRule
return self::badArgumentValueMessage($typeName, $valueName, $fieldName, $arg->name, $message); return self::badArgumentValueMessage($typeName, $valueName, $fieldName, $arg->name, $message);
} }
} }
return self::badValueMessage($typeName, $valueName, $message); return self::badValueMessage($typeName, $valueName, $message);
} }
} }

View File

@ -59,6 +59,7 @@ class MutationsTest extends TestCase
], ],
'name' => 'NumberHolder', 'name' => 'NumberHolder',
]); ]);
return new Schema([ return new Schema([
'query' => new ObjectType([ 'query' => new ObjectType([
'fields' => [ 'fields' => [

View File

@ -16,7 +16,6 @@ use function uniqid;
class ResolveTest extends TestCase class ResolveTest extends TestCase
{ {
// Execute: resolve function // Execute: resolve function
/** /**
* @see it('default function accesses properties') * @see it('default function accesses properties')
*/ */

View File

@ -355,7 +355,6 @@ class VariablesTest extends TestCase
self::assertEquals($expected, $result->toArray()); self::assertEquals($expected, $result->toArray());
} }
// Describe: Handles non-nullable scalars // Describe: Handles non-nullable scalars
/** /**

View File

@ -11,7 +11,6 @@ class StarWarsIntrospectionTest extends TestCase
{ {
// Star Wars Introspection Tests // Star Wars Introspection Tests
// Basic Introspection // Basic Introspection
/** /**
* @see it('Allows querying the schema for types') * @see it('Allows querying the schema for types')
*/ */

View File

@ -12,7 +12,6 @@ class StarWarsValidationTest extends TestCase
{ {
// Star Wars Validation Tests // Star Wars Validation Tests
// Basic Queries // Basic Queries
/** /**
* @see it('Validates a complex but valid query') * @see it('Validates a complex but valid query')
*/ */

View File

@ -24,7 +24,6 @@ use function count;
class BuildSchemaTest extends TestCase class BuildSchemaTest extends TestCase
{ {
// Describe: Schema Builder // Describe: Schema Builder
/** /**
* @see it('can use built schema for limited execution') * @see it('can use built schema for limited execution')
*/ */

View File

@ -198,6 +198,7 @@ class SchemaExtenderTest extends TestCase
preg_match('/^[ \t]*/', $trimmedStr, $indentMatch); preg_match('/^[ \t]*/', $trimmedStr, $indentMatch);
$indent = $indentMatch[0]; $indent = $indentMatch[0];
return preg_replace('/^' . $indent . '/m', '', $trimmedStr); return preg_replace('/^' . $indent . '/m', '', $trimmedStr);
} }
@ -210,6 +211,7 @@ class SchemaExtenderTest extends TestCase
$ast = Parser::parse($sdl); $ast = Parser::parse($sdl);
$extendedSchema = SchemaExtender::extend($this->testSchema, $ast, $options); $extendedSchema = SchemaExtender::extend($this->testSchema, $ast, $options);
self::assertEquals(SchemaPrinter::doPrint($this->testSchema), $originalPrint); self::assertEquals(SchemaPrinter::doPrint($this->testSchema), $originalPrint);
return $extendedSchema; return $extendedSchema;
} }
@ -1250,7 +1252,6 @@ class SchemaExtenderTest extends TestCase
self::assertEquals('new directive', $newDirective->description); self::assertEquals('new directive', $newDirective->description);
} }
/** /**
* @see it('may extend directives with new complex directive') * @see it('may extend directives with new complex directive')
*/ */
@ -1735,7 +1736,6 @@ class SchemaExtenderTest extends TestCase
self::assertEquals($queryType->name, 'Foo'); self::assertEquals($queryType->name, 'Foo');
} }
/** /**
* @see it('adds new root types via schema extension') * @see it('adds new root types via schema extension')
*/ */
@ -1875,7 +1875,6 @@ class SchemaExtenderTest extends TestCase
} }
} }
/** /**
* @see it('does not allow defining a root operation type twice') * @see it('does not allow defining a root operation type twice')
*/ */
@ -1964,7 +1963,6 @@ extend type Query {
self::assertSame(['data' => ['hello' => 'Hello World!']], $result->toArray()); self::assertSame(['data' => ['hello' => 'Hello World!']], $result->toArray());
} }
/** /**
* @see https://github.com/webonyx/graphql-php/issues/180 * @see https://github.com/webonyx/graphql-php/issues/180
*/ */

View File

@ -21,7 +21,6 @@ use PHPUnit\Framework\TestCase;
class SchemaPrinterTest extends TestCase class SchemaPrinterTest extends TestCase
{ {
// Describe: Type System Printer // Describe: Type System Printer
/** /**
* @see it('Prints String Field') * @see it('Prints String Field')
*/ */

View File

@ -1135,7 +1135,6 @@ class ValuesOfCorrectTypeTest extends ValidatorTestCase
); );
} }
// DESCRIBE: Valid input object value // DESCRIBE: Valid input object value
/** /**