Skip to content

Commit 9b27b84

Browse files
arnaud-lbondrejmirtes
authored andcommitted
Allow only identifiers and integers in keys
1 parent 12324c4 commit 9b27b84

File tree

3 files changed

+44
-39
lines changed

3 files changed

+44
-39
lines changed

src/Ast/Type/ArrayShapeItemNode.php

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,11 @@
33
namespace PHPStan\PhpDocParser\Ast\Type;
44

55
use PHPStan\PhpDocParser\Ast\ConstExpr\ConstExprIntegerNode;
6-
use PHPStan\PhpDocParser\Ast\ConstExpr\ConstExprStringNode;
76

87
class ArrayShapeItemNode implements TypeNode
98
{
109

11-
/** @var ConstExprStringNode|ConstExprIntegerNode|IdentifierTypeNode|null */
10+
/** @var ConstExprIntegerNode|IdentifierTypeNode|null */
1211
public $keyName;
1312

1413
/** @var bool */
@@ -18,7 +17,7 @@ class ArrayShapeItemNode implements TypeNode
1817
public $valueType;
1918

2019
/**
21-
* @param ConstExprStringNode|ConstExprIntegerNode|IdentifierTypeNode|null $keyName
20+
* @param ConstExprIntegerNode|IdentifierTypeNode|null $keyName
2221
*/
2322
public function __construct($keyName, bool $optional, TypeNode $valueType)
2423
{

src/Parser/TypeParser.php

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -253,19 +253,11 @@ private function parseArrayShapeItem(TokenIterator $tokens): Ast\Type\ArrayShape
253253
}
254254

255255
/**
256-
* @return Ast\ConstExpr\ConstExprStringNode|Ast\ConstExpr\ConstExprIntegerNode|Ast\Type\IdentifierTypeNode
256+
* @return Ast\ConstExpr\ConstExprIntegerNode|Ast\Type\IdentifierTypeNode
257257
*/
258258
private function parseArrayShapeKey(TokenIterator $tokens)
259259
{
260-
if ($tokens->isCurrentTokenType(Lexer::TOKEN_SINGLE_QUOTED_STRING)) {
261-
$key = new Ast\ConstExpr\ConstExprStringNode($tokens->currentTokenValue());
262-
$tokens->next();
263-
264-
} elseif ($tokens->isCurrentTokenType(Lexer::TOKEN_DOUBLE_QUOTED_STRING)) {
265-
$key = new Ast\ConstExpr\ConstExprStringNode($tokens->currentTokenValue());
266-
$tokens->next();
267-
268-
} elseif ($tokens->isCurrentTokenType(Lexer::TOKEN_INTEGER)) {
260+
if ($tokens->isCurrentTokenType(Lexer::TOKEN_INTEGER)) {
269261
$key = new Ast\ConstExpr\ConstExprIntegerNode($tokens->currentTokenValue());
270262
$tokens->next();
271263

tests/PHPStan/Parser/TypeParserTest.php

Lines changed: 40 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
namespace PHPStan\PhpDocParser\Parser;
44

55
use PHPStan\PhpDocParser\Ast\ConstExpr\ConstExprIntegerNode;
6-
use PHPStan\PhpDocParser\Ast\ConstExpr\ConstExprStringNode;
76
use PHPStan\PhpDocParser\Ast\Type\ArrayShapeItemNode;
87
use PHPStan\PhpDocParser\Ast\Type\ArrayShapeNode;
98
use PHPStan\PhpDocParser\Ast\Type\ArrayTypeNode;
@@ -280,20 +279,20 @@ public function provideParseData(): array
280279
],
281280

282281
[
283-
'array{\'a\': int}',
282+
'array{a: int}',
284283
new ArrayShapeNode([
285284
new ArrayShapeItemNode(
286-
new ConstExprStringNode('\'a\''),
285+
new IdentifierTypeNode('a'),
287286
false,
288287
new IdentifierTypeNode('int')
289288
),
290289
]),
291290
],
292291
[
293-
'array{\'a\': ?int}',
292+
'array{a: ?int}',
294293
new ArrayShapeNode([
295294
new ArrayShapeItemNode(
296-
new ConstExprStringNode('\'a\''),
295+
new IdentifierTypeNode('a'),
297296
false,
298297
new NullableTypeNode(
299298
new IdentifierTypeNode('int')
@@ -302,10 +301,10 @@ public function provideParseData(): array
302301
]),
303302
],
304303
[
305-
'array{\'a\'?: ?int}',
304+
'array{a?: ?int}',
306305
new ArrayShapeNode([
307306
new ArrayShapeItemNode(
308-
new ConstExprStringNode('\'a\''),
307+
new IdentifierTypeNode('a'),
309308
true,
310309
new NullableTypeNode(
311310
new IdentifierTypeNode('int')
@@ -314,22 +313,27 @@ public function provideParseData(): array
314313
]),
315314
],
316315
[
317-
'array{\'a\': int, \'b\': string}',
316+
'array{0: int}',
318317
new ArrayShapeNode([
319318
new ArrayShapeItemNode(
320-
new ConstExprStringNode('\'a\''),
319+
new ConstExprIntegerNode('0'),
321320
false,
322321
new IdentifierTypeNode('int')
323322
),
323+
]),
324+
],
325+
[
326+
'array{0?: int}',
327+
new ArrayShapeNode([
324328
new ArrayShapeItemNode(
325-
new ConstExprStringNode('\'b\''),
326-
false,
327-
new IdentifierTypeNode('string')
329+
new ConstExprIntegerNode('0'),
330+
true,
331+
new IdentifierTypeNode('int')
328332
),
329333
]),
330334
],
331335
[
332-
'array{int, string, "a": string}',
336+
'array{int, int}',
333337
new ArrayShapeNode([
334338
new ArrayShapeItemNode(
335339
null,
@@ -339,25 +343,35 @@ public function provideParseData(): array
339343
new ArrayShapeItemNode(
340344
null,
341345
false,
342-
new IdentifierTypeNode('string')
346+
new IdentifierTypeNode('int')
347+
),
348+
]),
349+
],
350+
[
351+
'array{a: int, b: string}',
352+
new ArrayShapeNode([
353+
new ArrayShapeItemNode(
354+
new IdentifierTypeNode('a'),
355+
false,
356+
new IdentifierTypeNode('int')
343357
),
344358
new ArrayShapeItemNode(
345-
new ConstExprStringNode('"a"'),
359+
new IdentifierTypeNode('b'),
346360
false,
347361
new IdentifierTypeNode('string')
348362
),
349363
]),
350364
],
351365
[
352-
'array{"a"?: int, \'b\': string, 0: int, 1?: DateTime, hello: string}',
366+
'array{a?: int, b: string, 0: int, 1?: DateTime, hello: string}',
353367
new ArrayShapeNode([
354368
new ArrayShapeItemNode(
355-
new ConstExprStringNode('"a"'),
369+
new IdentifierTypeNode('a'),
356370
true,
357371
new IdentifierTypeNode('int')
358372
),
359373
new ArrayShapeItemNode(
360-
new ConstExprStringNode('\'b\''),
374+
new IdentifierTypeNode('b'),
361375
false,
362376
new IdentifierTypeNode('string')
363377
),
@@ -379,19 +393,19 @@ public function provideParseData(): array
379393
]),
380394
],
381395
[
382-
'array{\'a\': int, \'b\': array{\'c\': callable(): int}}',
396+
'array{a: int, b: array{c: callable(): int}}',
383397
new ArrayShapeNode([
384398
new ArrayShapeItemNode(
385-
new ConstExprStringNode('\'a\''),
399+
new IdentifierTypeNode('a'),
386400
false,
387401
new IdentifierTypeNode('int')
388402
),
389403
new ArrayShapeItemNode(
390-
new ConstExprStringNode('\'b\''),
404+
new IdentifierTypeNode('b'),
391405
false,
392406
new ArrayShapeNode([
393407
new ArrayShapeItemNode(
394-
new ConstExprStringNode('\'c\''),
408+
new IdentifierTypeNode('c'),
395409
false,
396410
new CallableTypeNode(
397411
new IdentifierTypeNode('callable'),
@@ -404,11 +418,11 @@ public function provideParseData(): array
404418
]),
405419
],
406420
[
407-
'?array{\'a\': int}',
421+
'?array{a: int}',
408422
new NullableTypeNode(
409423
new ArrayShapeNode([
410424
new ArrayShapeItemNode(
411-
new ConstExprStringNode('\'a\''),
425+
new IdentifierTypeNode('a'),
412426
false,
413427
new IdentifierTypeNode('int')
414428
),
@@ -509,13 +523,13 @@ public function provideParseData(): array
509523
),
510524
],
511525
[
512-
'callable(): array{\'a\': int}',
526+
'callable(): array{a: int}',
513527
new CallableTypeNode(
514528
new IdentifierTypeNode('callable'),
515529
[],
516530
new ArrayShapeNode([
517531
new ArrayShapeItemNode(
518-
new ConstExprStringNode('\'a\''),
532+
new IdentifierTypeNode('a'),
519533
false,
520534
new IdentifierTypeNode('int')
521535
),

0 commit comments

Comments
 (0)