-
Notifications
You must be signed in to change notification settings - Fork 574
Expand file tree
/
Copy pathbug-12653b.php
More file actions
111 lines (97 loc) · 1.99 KB
/
bug-12653b.php
File metadata and controls
111 lines (97 loc) · 1.99 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
100
101
102
103
104
105
106
107
108
109
110
111
<?php declare(strict_types = 1);
namespace Bug12653b;
use function PHPStan\Testing\assertType;
class WhileLoopTest
{
const TYPE_XXX = 'xxx';
const TYPE_YYY = 'yyy';
const TYPE_ZZZ = 'zzz';
/**
* @return array<'a'|'b'|'c'|'d', self::TYPE_*>
*/
public function whileLoop(): array
{
$list = [
'a' => self::TYPE_XXX,
'b' => self::TYPE_YYY,
'c' => self::TYPE_ZZZ,
'd' => self::TYPE_XXX,
];
$keys = ['a', 'b', 'c', 'd'];
$found = false;
$i = 0;
while ($i < count($keys)) {
$key = $keys[$i];
if ($list[$key] === self::TYPE_XXX) {
if (!$found) {
$found = true;
} else {
$list[$key] = self::TYPE_ZZZ;
}
}
$i++;
}
assertType("array{a: 'xxx'|'zzz', b: 'yyy'|'zzz', c: 'zzz', d: 'xxx'|'zzz'}", $list);
return $list;
}
}
class ForLoopTest
{
const TYPE_XXX = 'xxx';
const TYPE_YYY = 'yyy';
const TYPE_ZZZ = 'zzz';
/**
* @return array<'a'|'b'|'c'|'d', self::TYPE_*>
*/
public function forLoop(): array
{
$list = [
'a' => self::TYPE_XXX,
'b' => self::TYPE_YYY,
'c' => self::TYPE_ZZZ,
'd' => self::TYPE_XXX,
];
$keys = ['a', 'b', 'c', 'd'];
$found = false;
for ($i = 0; $i < count($keys); $i++) {
$key = $keys[$i];
if ($list[$key] === self::TYPE_XXX) {
if (!$found) {
$found = true;
} else {
$list[$key] = self::TYPE_ZZZ;
}
}
}
assertType("array{a: 'xxx'|'zzz', b: 'yyy'|'zzz', c: 'zzz', d: 'xxx'|'zzz'}", $list);
return $list;
}
}
class FloatConstantArrayTest
{
const RATE_LOW = 0.5;
const RATE_MED = 1.0;
const RATE_HIGH = 1.5;
/**
* @param list<'x'|'y'|'z'> $keys
*/
public function floatConstantsInArray(array $keys): void
{
$rates = [
'x' => self::RATE_LOW,
'y' => self::RATE_MED,
'z' => self::RATE_HIGH,
];
$found = false;
foreach ($keys as $key) {
if ($rates[$key] === self::RATE_LOW) {
if (!$found) {
$found = true;
} else {
$rates[$key] = self::RATE_HIGH;
}
}
}
assertType("array{x: 0.5|1.5, y: 1.0|1.5, z: 1.5}", $rates);
}
}