From 9b27b84656e7f39a8bd912b05b771ddad823a2d0 Mon Sep 17 00:00:00 2001 From: Arnaud Le Blanc Date: Tue, 4 Jun 2019 14:28:08 +0200 Subject: [PATCH] Allow only identifiers and integers in keys --- src/Ast/Type/ArrayShapeItemNode.php | 5 +- src/Parser/TypeParser.php | 12 +---- tests/PHPStan/Parser/TypeParserTest.php | 66 +++++++++++++++---------- 3 files changed, 44 insertions(+), 39 deletions(-) diff --git a/src/Ast/Type/ArrayShapeItemNode.php b/src/Ast/Type/ArrayShapeItemNode.php index 9d842a1f..ccbab377 100644 --- a/src/Ast/Type/ArrayShapeItemNode.php +++ b/src/Ast/Type/ArrayShapeItemNode.php @@ -3,12 +3,11 @@ namespace PHPStan\PhpDocParser\Ast\Type; use PHPStan\PhpDocParser\Ast\ConstExpr\ConstExprIntegerNode; -use PHPStan\PhpDocParser\Ast\ConstExpr\ConstExprStringNode; class ArrayShapeItemNode implements TypeNode { - /** @var ConstExprStringNode|ConstExprIntegerNode|IdentifierTypeNode|null */ + /** @var ConstExprIntegerNode|IdentifierTypeNode|null */ public $keyName; /** @var bool */ @@ -18,7 +17,7 @@ class ArrayShapeItemNode implements TypeNode public $valueType; /** - * @param ConstExprStringNode|ConstExprIntegerNode|IdentifierTypeNode|null $keyName + * @param ConstExprIntegerNode|IdentifierTypeNode|null $keyName */ public function __construct($keyName, bool $optional, TypeNode $valueType) { diff --git a/src/Parser/TypeParser.php b/src/Parser/TypeParser.php index 905c9fdd..58345175 100644 --- a/src/Parser/TypeParser.php +++ b/src/Parser/TypeParser.php @@ -253,19 +253,11 @@ private function parseArrayShapeItem(TokenIterator $tokens): Ast\Type\ArrayShape } /** - * @return Ast\ConstExpr\ConstExprStringNode|Ast\ConstExpr\ConstExprIntegerNode|Ast\Type\IdentifierTypeNode + * @return Ast\ConstExpr\ConstExprIntegerNode|Ast\Type\IdentifierTypeNode */ private function parseArrayShapeKey(TokenIterator $tokens) { - if ($tokens->isCurrentTokenType(Lexer::TOKEN_SINGLE_QUOTED_STRING)) { - $key = new Ast\ConstExpr\ConstExprStringNode($tokens->currentTokenValue()); - $tokens->next(); - - } elseif ($tokens->isCurrentTokenType(Lexer::TOKEN_DOUBLE_QUOTED_STRING)) { - $key = new Ast\ConstExpr\ConstExprStringNode($tokens->currentTokenValue()); - $tokens->next(); - - } elseif ($tokens->isCurrentTokenType(Lexer::TOKEN_INTEGER)) { + if ($tokens->isCurrentTokenType(Lexer::TOKEN_INTEGER)) { $key = new Ast\ConstExpr\ConstExprIntegerNode($tokens->currentTokenValue()); $tokens->next(); diff --git a/tests/PHPStan/Parser/TypeParserTest.php b/tests/PHPStan/Parser/TypeParserTest.php index 219ff558..d09e73e4 100644 --- a/tests/PHPStan/Parser/TypeParserTest.php +++ b/tests/PHPStan/Parser/TypeParserTest.php @@ -3,7 +3,6 @@ namespace PHPStan\PhpDocParser\Parser; use PHPStan\PhpDocParser\Ast\ConstExpr\ConstExprIntegerNode; -use PHPStan\PhpDocParser\Ast\ConstExpr\ConstExprStringNode; use PHPStan\PhpDocParser\Ast\Type\ArrayShapeItemNode; use PHPStan\PhpDocParser\Ast\Type\ArrayShapeNode; use PHPStan\PhpDocParser\Ast\Type\ArrayTypeNode; @@ -280,20 +279,20 @@ public function provideParseData(): array ], [ - 'array{\'a\': int}', + 'array{a: int}', new ArrayShapeNode([ new ArrayShapeItemNode( - new ConstExprStringNode('\'a\''), + new IdentifierTypeNode('a'), false, new IdentifierTypeNode('int') ), ]), ], [ - 'array{\'a\': ?int}', + 'array{a: ?int}', new ArrayShapeNode([ new ArrayShapeItemNode( - new ConstExprStringNode('\'a\''), + new IdentifierTypeNode('a'), false, new NullableTypeNode( new IdentifierTypeNode('int') @@ -302,10 +301,10 @@ public function provideParseData(): array ]), ], [ - 'array{\'a\'?: ?int}', + 'array{a?: ?int}', new ArrayShapeNode([ new ArrayShapeItemNode( - new ConstExprStringNode('\'a\''), + new IdentifierTypeNode('a'), true, new NullableTypeNode( new IdentifierTypeNode('int') @@ -314,22 +313,27 @@ public function provideParseData(): array ]), ], [ - 'array{\'a\': int, \'b\': string}', + 'array{0: int}', new ArrayShapeNode([ new ArrayShapeItemNode( - new ConstExprStringNode('\'a\''), + new ConstExprIntegerNode('0'), false, new IdentifierTypeNode('int') ), + ]), + ], + [ + 'array{0?: int}', + new ArrayShapeNode([ new ArrayShapeItemNode( - new ConstExprStringNode('\'b\''), - false, - new IdentifierTypeNode('string') + new ConstExprIntegerNode('0'), + true, + new IdentifierTypeNode('int') ), ]), ], [ - 'array{int, string, "a": string}', + 'array{int, int}', new ArrayShapeNode([ new ArrayShapeItemNode( null, @@ -339,25 +343,35 @@ public function provideParseData(): array new ArrayShapeItemNode( null, false, - new IdentifierTypeNode('string') + new IdentifierTypeNode('int') + ), + ]), + ], + [ + 'array{a: int, b: string}', + new ArrayShapeNode([ + new ArrayShapeItemNode( + new IdentifierTypeNode('a'), + false, + new IdentifierTypeNode('int') ), new ArrayShapeItemNode( - new ConstExprStringNode('"a"'), + new IdentifierTypeNode('b'), false, new IdentifierTypeNode('string') ), ]), ], [ - 'array{"a"?: int, \'b\': string, 0: int, 1?: DateTime, hello: string}', + 'array{a?: int, b: string, 0: int, 1?: DateTime, hello: string}', new ArrayShapeNode([ new ArrayShapeItemNode( - new ConstExprStringNode('"a"'), + new IdentifierTypeNode('a'), true, new IdentifierTypeNode('int') ), new ArrayShapeItemNode( - new ConstExprStringNode('\'b\''), + new IdentifierTypeNode('b'), false, new IdentifierTypeNode('string') ), @@ -379,19 +393,19 @@ public function provideParseData(): array ]), ], [ - 'array{\'a\': int, \'b\': array{\'c\': callable(): int}}', + 'array{a: int, b: array{c: callable(): int}}', new ArrayShapeNode([ new ArrayShapeItemNode( - new ConstExprStringNode('\'a\''), + new IdentifierTypeNode('a'), false, new IdentifierTypeNode('int') ), new ArrayShapeItemNode( - new ConstExprStringNode('\'b\''), + new IdentifierTypeNode('b'), false, new ArrayShapeNode([ new ArrayShapeItemNode( - new ConstExprStringNode('\'c\''), + new IdentifierTypeNode('c'), false, new CallableTypeNode( new IdentifierTypeNode('callable'), @@ -404,11 +418,11 @@ public function provideParseData(): array ]), ], [ - '?array{\'a\': int}', + '?array{a: int}', new NullableTypeNode( new ArrayShapeNode([ new ArrayShapeItemNode( - new ConstExprStringNode('\'a\''), + new IdentifierTypeNode('a'), false, new IdentifierTypeNode('int') ), @@ -509,13 +523,13 @@ public function provideParseData(): array ), ], [ - 'callable(): array{\'a\': int}', + 'callable(): array{a: int}', new CallableTypeNode( new IdentifierTypeNode('callable'), [], new ArrayShapeNode([ new ArrayShapeItemNode( - new ConstExprStringNode('\'a\''), + new IdentifierTypeNode('a'), false, new IdentifierTypeNode('int') ),