Skip to content

Commit 57519cc

Browse files
committed
Merge remote-tracking branch 'origin/1.12.x' into 2.0.x
2 parents b37d269 + 2e65472 commit 57519cc

File tree

4 files changed

+33
-8
lines changed

4 files changed

+33
-8
lines changed

src/Type/Constant/ConstantArrayType.php

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,6 @@
5252
use function array_merge;
5353
use function array_pop;
5454
use function array_push;
55-
use function array_reverse;
5655
use function array_slice;
5756
use function array_unique;
5857
use function array_values;
@@ -858,14 +857,16 @@ public function popArray(): Type
858857

859858
public function reverseArray(TrinaryLogic $preserveKeys): Type
860859
{
861-
$keyTypesReversed = array_reverse($this->keyTypes, true);
862-
$keyTypes = array_values($keyTypesReversed);
863-
$keyTypesReversedKeys = array_keys($keyTypesReversed);
864-
$optionalKeys = array_map(static fn (int $optionalKey): int => $keyTypesReversedKeys[$optionalKey], $this->optionalKeys);
860+
$builder = ConstantArrayTypeBuilder::createEmpty();
865861

866-
$reversed = new self($keyTypes, array_reverse($this->valueTypes), $this->nextAutoIndexes, $optionalKeys, TrinaryLogic::createNo());
862+
for ($i = count($this->keyTypes) - 1; $i >= 0; $i--) {
863+
$offsetType = $preserveKeys->yes() || $this->keyTypes[$i]->isInteger()->no()
864+
? $this->keyTypes[$i]
865+
: null;
866+
$builder->setOffsetValueType($offsetType, $this->valueTypes[$i], $this->isOptionalKey($i));
867+
}
867868

868-
return $preserveKeys->yes() ? $reversed : $reversed->reindex();
869+
return $builder->getArray();
869870
}
870871

871872
public function searchArray(Type $needleType): Type

tests/PHPStan/Analyser/nsrt/array-reverse.php

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,9 @@ public function normalArrays(array $a, array $b): void
2424
/**
2525
* @param array{a: 'foo', b: 'bar', c?: 'baz'} $a
2626
* @param array{17: 'foo', 19: 'bar'}|array{foo: 17, bar: 19} $b
27+
* @param array{0: 'A', 1?: 'B', 2?: 'C'} $c
2728
*/
28-
public function constantArrays(array $a, array $b): void
29+
public function constantArrays(array $a, array $b, array $c): void
2930
{
3031
assertType('array{}', array_reverse([]));
3132
assertType('array{}', array_reverse([], true));
@@ -47,6 +48,9 @@ public function constantArrays(array $a, array $b): void
4748

4849
assertType('array{\'bar\', \'foo\'}|array{bar: 19, foo: 17}', array_reverse($b));
4950
assertType('array{19: \'bar\', 17: \'foo\'}|array{bar: 19, foo: 17}', array_reverse($b, true));
51+
52+
assertType("array{0: 'A'|'B'|'C', 1?: 'A'|'B', 2?: 'A'}", array_reverse($c));
53+
assertType("array{2?: 'C', 1?: 'B', 0: 'A'}", array_reverse($c, true));
5054
}
5155

5256
/**

tests/PHPStan/Rules/Functions/ReturnTypeRuleTest.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -315,4 +315,11 @@ public function testBug11032(): void
315315
$this->analyse([__DIR__ . '/data/bug-11032.php'], []);
316316
}
317317

318+
public function testBug11549(): void
319+
{
320+
$this->checkExplicitMixed = true;
321+
$this->checkNullables = true;
322+
$this->analyse([__DIR__ . '/data/bug-11549.php'], []);
323+
}
324+
318325
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?php
2+
declare(strict_types = 1);
3+
4+
namespace Bug11549;
5+
6+
/**
7+
* @param array{0: string, 1?: string} $a
8+
* @return array{0: string, 1?: string}
9+
*/
10+
function rrr(array $a): array
11+
{
12+
return array_reverse($a);
13+
}

0 commit comments

Comments
 (0)