Skip to content

Commit

Permalink
Merge branch '1.5.x' into 1.6.x
Browse files Browse the repository at this point in the history
  • Loading branch information
ondrejmirtes committed Apr 17, 2022
2 parents 8ff36f5 + 8084ab3 commit 0bbc591
Show file tree
Hide file tree
Showing 5 changed files with 42 additions and 5 deletions.
Expand Up @@ -11,6 +11,7 @@
use PHPStan\Type\ArrayType;
use PHPStan\Type\Constant\ConstantArrayType;
use PHPStan\Type\Constant\ConstantArrayTypeBuilder;
use PHPStan\Type\Constant\ConstantIntegerType;
use PHPStan\Type\DynamicFunctionReturnTypeExtension;
use PHPStan\Type\NeverType;
use PHPStan\Type\Type;
Expand Down Expand Up @@ -64,7 +65,7 @@ public function getTypeFromFunctionCall(FunctionReflection $functionReflection,
$isOptional = in_array($k, $optionalKeys, true);

$newArrayBuilder->setOffsetValueType(
$keyType,
$keyType instanceof ConstantIntegerType ? null : $keyType,
$valueTypes[$k],
$isOptional,
);
Expand Down
8 changes: 4 additions & 4 deletions tests/PHPStan/Analyser/LegacyNodeScopeResolverTest.php
Expand Up @@ -4727,7 +4727,7 @@ public function dataArrayFunctions(): array
'array_values($generalStringKeys)',
],
[
'array{foo: stdClass, 1: stdClass}',
'array{foo: stdClass, 0: stdClass}',
'array_merge($stringOrIntegerKeys)',
],
[
Expand All @@ -4743,15 +4743,15 @@ public function dataArrayFunctions(): array
'array_merge($stringOrIntegerKeys, $generalStringKeys)',
],
[
'array{foo: stdClass, bar: stdClass, 1: stdClass}',
'array{foo: stdClass, bar: stdClass, 0: stdClass}',
'array_merge($stringKeys, $stringOrIntegerKeys)',
],
[
"array{foo: 'foo', 1: stdClass, bar: stdClass}",
"array{foo: 'foo', 0: stdClass, bar: stdClass}",
'array_merge($stringOrIntegerKeys, $stringKeys)',
],
[
"array{color: 'green', 0: 'a', 1: 'b', shape: 'trapezoid', 2: 4}",
"array{color: 'green', 0: 2, 1: 4, 2: 'a', 3: 'b', shape: 'trapezoid', 4: 4}",
'array_merge(array("color" => "red", 2, 4), array("a", "b", "color" => "green", "shape" => "trapezoid", 4))',
],
[
Expand Down
1 change: 1 addition & 0 deletions tests/PHPStan/Analyser/NodeScopeResolverTest.php
Expand Up @@ -309,6 +309,7 @@ public function dataFileAsserts(): iterable
yield from $this->gatherAssertTypes(__DIR__ . '/data/array-flip.php');
yield from $this->gatherAssertTypes(__DIR__ . '/data/array-map.php');
yield from $this->gatherAssertTypes(__DIR__ . '/data/array-map-closure.php');
yield from $this->gatherAssertTypes(__DIR__ . '/data/array-merge.php');
yield from $this->gatherAssertTypes(__DIR__ . '/data/array-sum.php');
yield from $this->gatherAssertTypes(__DIR__ . '/data/array-plus.php');
yield from $this->gatherAssertTypes(__DIR__ . '/data/bug-4573.php');
Expand Down
15 changes: 15 additions & 0 deletions tests/PHPStan/Analyser/data/array-merge.php
@@ -0,0 +1,15 @@
<?php

namespace ArrayMerge;

use function array_merge;
use function PHPStan\Testing\assertType;

function foo(): void
{
$foo = ['foo' => 17, 'a', 'bar' => 18, 'b'];
$bar = [99 => 'b', 'bar' => 19, 98 => 'c'];
$baz = array_merge($foo, $bar);

assertType('array{foo: 17, 0: \'a\', bar: 19, 1: \'b\', 2: \'b\', 3: \'c\'}', $baz);
}
20 changes: 20 additions & 0 deletions tests/PHPStan/Analyser/data/strval.php
Expand Up @@ -91,3 +91,23 @@ function nonEmptyArrayTest(array $a): void
assertType('1.0', floatval($a));
assertType('true', boolval($a));
}

/**
* @param array{} $a
* @param array{foo: mixed, bar?: mixed} $b
* @param array{foo?: mixed, bar?: mixed} $c
*/
function constantArrayTest(array $a, array $b, array $c): void
{
assertType('0', intval($a));
assertType('0.0', floatval($a));
assertType('false', boolval($a));

assertType('1', intval($b));
assertType('1.0', floatval($b));
assertType('true', boolval($b));

assertType('0|1', intval($c));
assertType('0.0|1.0', floatval($c));
assertType('bool', boolval($c));
}

0 comments on commit 0bbc591

Please sign in to comment.