Skip to content

Commit 4418d52

Browse files
committed
Describe array shape key in quotes unless valid identifier
1 parent c0f2e9e commit 4418d52

File tree

10 files changed

+16
-14
lines changed

10 files changed

+16
-14
lines changed

src/Type/Constant/ConstantArrayType.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1348,6 +1348,8 @@ public function describe(VerbosityLevel $level): string
13481348
$keyDescription = sprintf('\'%s\'', $keyDescription);
13491349
} elseif (str_contains($keyDescription, '\'')) {
13501350
$keyDescription = sprintf('"%s"', $keyDescription);
1351+
} elseif (!self::isValidIdentifier($keyDescription)) {
1352+
$keyDescription = sprintf('\'%s\'', $keyDescription);
13511353
}
13521354
}
13531355

tests/PHPStan/Analyser/LegacyNodeScopeResolverTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1538,7 +1538,7 @@ public static function dataCasts(): array
15381538
'(float) $str',
15391539
],
15401540
[
1541-
"array{\0TypesNamespaceCasts\\Foo\0foo: TypesNamespaceCasts\\Foo, \0TypesNamespaceCasts\\Foo\0int: int, \0*\0protectedInt: int, publicInt: int, \0TypesNamespaceCasts\\Bar\0barProperty: TypesNamespaceCasts\\Bar}",
1541+
"array{'\0TypesNamespaceCasts\\Foo\0foo': TypesNamespaceCasts\\Foo, '\0TypesNamespaceCasts\\Foo\0int': int, '\0*\0protectedInt': int, publicInt: int, '\0TypesNamespaceCasts\\Bar\0barProperty': TypesNamespaceCasts\\Bar}",
15421542
'(array) $foo',
15431543
],
15441544
[

tests/PHPStan/Analyser/nsrt/array-combine-php8.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,15 +33,15 @@ function withBoolKey(): void
3333
$c = [false, 'red', 'yellow'];
3434
$d = ['avocado', 'apple', 'banana'];
3535

36-
assertType("array{: 'avocado', red: 'apple', yellow: 'banana'}", array_combine($c, $d));
36+
assertType("array{'': 'avocado', red: 'apple', yellow: 'banana'}", array_combine($c, $d));
3737
}
3838

3939
function withFloatKey(): void
4040
{
4141
$a = [1.5, 'red', 'yellow'];
4242
$b = ['avocado', 'apple', 'banana'];
4343

44-
assertType("array{1.5: 'avocado', red: 'apple', yellow: 'banana'}", array_combine($a, $b));
44+
assertType("array{'1.5': 'avocado', red: 'apple', yellow: 'banana'}", array_combine($a, $b));
4545
}
4646

4747
function withIntegerKey(): void

tests/PHPStan/Analyser/nsrt/array-fill-keys.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,12 @@ class Baz {}
2626
function withBoolKey() : array
2727
{
2828
assertType("array{1: 'b'}", array_fill_keys([true], 'b'));
29-
assertType("array{: 'b'}", array_fill_keys([false], 'b'));
29+
assertType("array{'': 'b'}", array_fill_keys([false], 'b'));
3030
}
3131

3232
function withFloatKey() : array
3333
{
34-
assertType("array{1.5: 'b'}", array_fill_keys([1.5], 'b'));
34+
assertType("array{'1.5': 'b'}", array_fill_keys([1.5], 'b'));
3535
}
3636

3737
function withIntegerKey() : array

tests/PHPStan/Analyser/nsrt/array-shapes-keys-strings.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ class Foo
1717
*/
1818
public function doFoo(array $slash, array $dollar): void
1919
{
20-
assertType('array{namespace/key: string}', $slash);
21-
assertType('array<int, array{$ref: string}>', $dollar);
20+
assertType("array{'namespace/key': string}", $slash);
21+
assertType('array<int, array{\'$ref\': string}>', $dollar);
2222
}
2323

2424
}

tests/PHPStan/Analyser/nsrt/bug-11716.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ public function parse(string $glue): string
1313
{
1414
$seenGlues = ['|' => false, '&' => false];
1515

16-
assertType("array{|: false, &: false}", $seenGlues);
16+
assertType("array{'|': false, '&': false}", $seenGlues);
1717

1818
if ($glue !== '') {
1919
assertType('non-empty-string', $glue);
@@ -22,13 +22,13 @@ public function parse(string $glue): string
2222
$seenGlues[$glue] = true;
2323

2424
assertType("'&'|'|'", $glue);
25-
assertType('array{|: bool, &: bool}', $seenGlues);
25+
assertType("array{'|': bool, '&': bool}", $seenGlues);
2626
} else {
2727
assertType("''", $glue);
2828
}
2929

3030
assertType("''|'&'|'|'", $glue);
31-
assertType("array{|: bool, &: bool}", $seenGlues);
31+
assertType("array{'|': bool, '&': bool}", $seenGlues);
3232

3333
return array_key_first($seenGlues);
3434
}

tests/PHPStan/Analyser/nsrt/bug-5219.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,6 @@ protected function bar(string $message): void
2020
$header = sprintf('%s-%s', '', '');
2121

2222
assertType('\'-\'', $header);
23-
assertType('array{-: string}', [$header => $message]);
23+
assertType('array{\'-\': string}', [$header => $message]);
2424
}
2525
}

tests/PHPStan/Analyser/nsrt/bug-7621-1.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ public function unpackShortcut(string $shortcut, array $supportedGroups): array
134134
!array_key_exists($groupOrShortcut, self::SHORTCUTS)
135135
) {
136136
// Nothing
137-
assertType("array{constants: array{'public constants', 'protected constants', 'private constants'}, static properties: array{'public static properties', 'protected static properties', 'private static properties'}, properties: array{'static properties', 'public properties', 'protected properties', 'private properties'}, all public methods: array{'public final methods', 'public static final methods', 'public abstract methods', 'public static abstract methods', 'public static methods', 'public methods'}, all protected methods: array{'protected final methods', 'protected static final methods', 'protected abstract methods', 'protected static abstract methods', 'protected static methods', 'protected methods'}, all private methods: array{'private static methods', 'private methods'}, final methods: array{'public final methods', 'protected final methods', 'public static final methods', 'protected static final methods'}, abstract methods: array{'public abstract methods', 'protected abstract methods', 'public static abstract methods', 'protected static abstract methods'}, static methods: array{'static constructors', 'public static final methods', 'protected static final methods', 'public static abstract methods', 'protected static abstract methods', 'public static methods', 'protected static methods', 'private static methods'}, methods: array{'final methods', 'abstract methods', 'static methods', 'constructor', 'destructor', 'public methods', 'protected methods', 'private methods', 'magic methods'}}", self::SHORTCUTS);
137+
assertType("array{constants: array{'public constants', 'protected constants', 'private constants'}, 'static properties': array{'public static properties', 'protected static properties', 'private static properties'}, properties: array{'static properties', 'public properties', 'protected properties', 'private properties'}, 'all public methods': array{'public final methods', 'public static final methods', 'public abstract methods', 'public static abstract methods', 'public static methods', 'public methods'}, 'all protected methods': array{'protected final methods', 'protected static final methods', 'protected abstract methods', 'protected static abstract methods', 'protected static methods', 'protected methods'}, 'all private methods': array{'private static methods', 'private methods'}, 'final methods': array{'public final methods', 'protected final methods', 'public static final methods', 'protected static final methods'}, 'abstract methods': array{'public abstract methods', 'protected abstract methods', 'public static abstract methods', 'protected static abstract methods'}, 'static methods': array{'static constructors', 'public static final methods', 'protected static final methods', 'public static abstract methods', 'protected static abstract methods', 'public static methods', 'protected static methods', 'private static methods'}, methods: array{'final methods', 'abstract methods', 'static methods', 'constructor', 'destructor', 'public methods', 'protected methods', 'private methods', 'magic methods'}}", self::SHORTCUTS);
138138
assertType("array{'public final methods', 'protected final methods', 'public static final methods', 'protected static final methods'}", self::SHORTCUTS[self::GROUP_SHORTCUT_FINAL_METHODS]);
139139
} else {
140140
$groups = array_merge($groups, $this->unpackShortcut($groupOrShortcut, $supportedGroups));

tests/PHPStan/Analyser/nsrt/count-const-array.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ public function sayHello(): void
6565
];
6666
$actualEnabledDays = $this->getEnabledDays();
6767
assert(count($expectedDaysResult) === count($actualEnabledDays));
68-
assertType("array{2019-01-04: array{'17:00', 'evening'}, 2019-01-05: array{'07:00', 'morning'}, 2019-01-06: array{'12:00', 'afternoon'}, 2019-01-07: array{'10:00', '11:00', '12:00', '13:00', '14:00', '15:00', '16:00', '17:00', 'morning', 'afternoon', 'evening'}, 2019-01-08: array{'07:00', '08:00', '13:00', '19:00', 'morning', 'afternoon', 'evening'}, anyDay: array{'07:00', '08:00', '10:00', '11:00', '12:00', '13:00', '14:00', '15:00', '16:00', '17:00', '19:00', 'morning', 'afternoon', 'evening'}}", $expectedDaysResult);
68+
assertType("array{'2019-01-04': array{'17:00', 'evening'}, '2019-01-05': array{'07:00', 'morning'}, '2019-01-06': array{'12:00', 'afternoon'}, '2019-01-07': array{'10:00', '11:00', '12:00', '13:00', '14:00', '15:00', '16:00', '17:00', 'morning', 'afternoon', 'evening'}, '2019-01-08': array{'07:00', '08:00', '13:00', '19:00', 'morning', 'afternoon', 'evening'}, anyDay: array{'07:00', '08:00', '10:00', '11:00', '12:00', '13:00', '14:00', '15:00', '16:00', '17:00', '19:00', 'morning', 'afternoon', 'evening'}}", $expectedDaysResult);
6969
}
7070

7171
/**

0 commit comments

Comments
 (0)