diff --git a/src/Language/AST/Node.php b/src/Language/AST/Node.php index 76a5b3b80..931bdc2c2 100644 --- a/src/Language/AST/Node.php +++ b/src/Language/AST/Node.php @@ -31,6 +31,7 @@ abstract class Node // Values + const NULL = 'NullValue'; const INT = 'IntValue'; const FLOAT = 'FloatValue'; const STRING = 'StringValue'; diff --git a/src/Language/AST/NullValue.php b/src/Language/AST/NullValue.php new file mode 100644 index 000000000..b18d8bcc4 --- /dev/null +++ b/src/Language/AST/NullValue.php @@ -0,0 +1,32 @@ +loc = $loc; + } + + /** + * @return null + */ + public function getValue() + { + return $this->value; + } +} diff --git a/src/Language/AST/Value.php b/src/Language/AST/Value.php index dd83bf4dd..e9127e52e 100644 --- a/src/Language/AST/Value.php +++ b/src/Language/AST/Value.php @@ -10,6 +10,7 @@ | EnumValue | ListValue | ObjectValue +| NullValue */ interface Value { diff --git a/src/Language/Parser.php b/src/Language/Parser.php index 795d9ea33..d72910cde 100644 --- a/src/Language/Parser.php +++ b/src/Language/Parser.php @@ -27,6 +27,7 @@ use GraphQL\Language\AST\Name; use GraphQL\Language\AST\NamedType; use GraphQL\Language\AST\NonNullType; +use GraphQL\Language\AST\NullValue; use GraphQL\Language\AST\ObjectField; use GraphQL\Language\AST\ObjectTypeDefinition; use GraphQL\Language\AST\ObjectValue; @@ -655,14 +656,18 @@ function parseValueLiteral($isConst) 'value' => $token->value === 'true', 'loc' => $this->loc($token) ]); - } else if ($token->value !== 'null') { + } else if ($token->value === 'null') { + $this->lexer->advance(); + return new NullValue( + $this->loc($token) + ); + } else { $this->lexer->advance(); return new EnumValue([ 'value' => $token->value, 'loc' => $this->loc($token) ]); } - break; case Token::DOLLAR: if (!$isConst) { diff --git a/tests/Language/ParserTest.php b/tests/Language/ParserTest.php index fbc93b397..bd178fb8b 100644 --- a/tests/Language/ParserTest.php +++ b/tests/Language/ParserTest.php @@ -9,6 +9,7 @@ use GraphQL\Language\AST\Name; use GraphQL\Language\AST\Node; use GraphQL\Language\AST\OperationDefinition; +use GraphQL\Language\AST\NullValue; use GraphQL\Language\AST\SelectionSet; use GraphQL\Language\AST\StringValue; use GraphQL\Language\Parser; @@ -112,10 +113,26 @@ public function testDoesNotAcceptFragmentSpreadOfOn() /** * @it does not allow null as value */ - public function testDoesNotAllowNullAsValue() + public function testAllowsNullAsValue() { - $this->setExpectedException('GraphQL\Error\SyntaxError', 'Syntax Error GraphQL (1:39) Unexpected Name "null"'); - Parser::parse('{ fieldWithNullableStringInput(input: null) }'); + $expected = new SelectionSet([ + 'selections' => [ + new Field([ + 'name' => new Name(['value' => 'fieldWithNullableStringInput']), + 'arguments' => [ + new Argument([ + 'name' => new Name(['value' => 'input']), + 'value' => new NullValue() + ]) + ], + 'directives' => [] + ]) + ] + ]); + + $result = Parser::parse('{ fieldWithNullableStringInput(input: null) }', ['noLocation' => true]); + + $this->assertEquals($expected, $result->definitions[0]->selectionSet); } /**