forked from phpstan/phpstan-src
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbug-14551.php
More file actions
99 lines (83 loc) · 1.95 KB
/
bug-14551.php
File metadata and controls
99 lines (83 loc) · 1.95 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
<?php declare(strict_types = 1);
namespace Bug14551;
use function PHPStan\Testing\assertType;
/**
* @param non-empty-list<'a'|'b'> $keys
*/
function foreachTwoKeys(array $keys): void
{
$result = [];
foreach ($keys as $k) {
$result[$k]['x'] = 1;
$result[$k]['y'] = 2;
}
assertType("array{a?: array{x: 1, y: 2}, b?: array{x: 1, y: 2}}", $result);
}
/**
* @param non-empty-list<'a'|'b'> $keys
*/
function foreachThreeKeys(array $keys): void
{
$result = [];
foreach ($keys as $k) {
$result[$k]['x'] = 1;
$result[$k]['y'] = 2;
$result[$k]['z'] = 3;
}
assertType("array{a?: array{x: 1, y: 2, z: 3}, b?: array{x: 1, y: 2, z: 3}}", $result);
}
/**
* Test without foreach: union-key nested assignment
* @param 'a'|'b' $k
*/
function withoutForeach(string $k): void
{
$result = [];
$result[$k]['x'] = 1;
$result[$k]['y'] = 2;
assertType("array{a?: array{x: 1, y: 2}, b?: array{x: 1, y: 2}}", $result);
}
/**
* Test with integer union keys
* @param 0|1 $k
*/
function integerKeys(int $k): void
{
$result = [];
$result[$k]['x'] = 1;
$result[$k]['y'] = 2;
assertType("array{0?: array{x: 1, y: 2}, 1?: array{x: 1, y: 2}}", $result);
}
/**
* Test three-way union key
* @param 'a'|'b'|'c' $k
*/
function threeWayUnion(string $k): void
{
$result = [];
$result[$k]['x'] = 1;
$result[$k]['y'] = 2;
assertType("array{a?: array{x: 1, y: 2}, b?: array{x: 1, y: 2}, c?: array{x: 1, y: 2}}", $result);
}
/**
* Required keys should still union (not replace) — existing behavior must be preserved
*/
function requiredKeysStillUnion(): void
{
$result = ['a' => ['x' => 1], 'b' => ['x' => 1]];
/** @var 'a'|'b' $k */
$k = 'a';
$result[$k]['y'] = 2;
assertType("array{a: array{x: 1, y?: 2}, b: array{x: 1, y?: 2}}", $result);
}
/**
* Non-nested union-key overwrites with optional keys
* @param 'a'|'b' $k
*/
function nonNested(string $k): void
{
$result = [];
$result[$k] = 1;
$result[$k] = 2;
assertType("non-empty-array{a?: 2, b?: 2}", $result);
}