Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

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)

AltStyle によって変換されたページ (->オリジナル) /