Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 36 additions & 0 deletions tests/PHPStan/Analyser/nsrt/bug-10025.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
<?php declare(strict_types=1);

namespace Bug10025;

use function PHPStan\Testing\assertType;

class MyClass
{
public int $groupId;
}

/**
* @param list<MyClass> $foos
* @param list<MyClass> $bars
*/
function x(array $foos, array $bars): void
{
$arr = [];
foreach ($foos as $foo) {
$arr[$foo->groupId]['foo'][] = $foo;
}
foreach ($bars as $bar) {
$arr[$bar->groupId]['bar'][] = $bar;
}

assertType('array<int, non-empty-array{foo?: non-empty-list<Bug10025\MyClass>, bar?: non-empty-list<Bug10025\MyClass>}>', $arr);
foreach ($arr as $groupId => $group) {
if (isset($group['foo'])) {
}
if (isset($group['bar'])) {
}
}

assertType('array<int, non-empty-array{foo?: non-empty-list<Bug10025\MyClass>, bar?: non-empty-list<Bug10025\MyClass>}>', $arr);
}

31 changes: 31 additions & 0 deletions tests/PHPStan/Analyser/nsrt/bug-10640.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
<?php declare(strict_types=1);

namespace Bug10640;

use function PHPStan\Testing\assertType;

$changes = [];
foreach (toAdd() as $add) {
$changes[$add['id']]['add'][] = doSomething($add);
}
assertType('array<array{add: non-empty-list}>', $changes);

foreach (toRem() as $del) {
$changes[$add['id']]['del'][] = doSomething($del);
}
assertType('array<non-empty-array{add?: non-empty-list, del?: non-empty-list}>', $changes);

foreach ($changes as $changeSet) {
if (isset($changeSet['del'])) {
doDel($changeSet['del']);
}
if (isset($changeSet['add'])) {
doAdd($changeSet['add']);
}
}

function doSomething($s) {}
function toAdd($s) {}
function toRem($s) {}
function doDel($s) {}
function doAdd($s) {}
67 changes: 67 additions & 0 deletions tests/PHPStan/Analyser/nsrt/bug-12078.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
<?php declare(strict_types=1);

namespace Bug12078;

use function PHPStan\Testing\assertType;

/**
* @return array <string,string>
*/
function returnsData6M(): array
{
return ["A" => 'data A', "B" => 'Data B'];
}

/**
* @return array <string,string>
*/
function returnsData3M(): array
{
return ["A" => 'data A', "C" => 'Data C'];
}

function main()
{
$arrDataByKey = [];

$arrData6M = returnsData6M();
if ([] === $arrData6M) {
echo "No data for 6M\n";
} else {
foreach ($arrData6M as $key => $data) {
$arrDataByKey[$key]['6M'][] = $data;
}
}

$arrData3M = returnsData3M();
if ([] === $arrData3M) {
echo "No data for 3M\n";
} else {
foreach ($arrData3M as $key => $data) {
$arrDataByKey[$key]['3M'][] = $data;
}
}
/*
So $arrDataByKey looks like
[
'A'=>[
'6M'=>['data A'],
'3M'=>['data A']
],
'B'=>[
'6M'=>['data B']
],
'C'=>[
'3M'=>['data C']
]
]
*/

assertType("array<string, non-empty-array{'6M'?: non-empty-list<string>, '3M'?: non-empty-list<string>}>", $arrDataByKey);
foreach ($arrDataByKey as $key => $arrDataByKeyForKey) {
assertType("non-empty-array{'6M'?: non-empty-list<string>, '3M'?: non-empty-list<string>}", $arrDataByKeyForKey);
echo [] === ($arrDataByKeyForKey['6M'] ?? []) ? 'No 6M data for key ' . $key . "\n" : 'We got 6M data for key ' . $key . "\n";
echo [] === ($arrDataByKeyForKey['3M'] ?? []) ? 'No 3M data for key ' . $key . "\n" : 'We got 3M data for key ' . $key . "\n";
assertType("non-empty-array{'6M'?: non-empty-list<string>, '3M'?: non-empty-list<string>}", $arrDataByKeyForKey);
}
}
32 changes: 32 additions & 0 deletions tests/PHPStan/Analyser/nsrt/bug-6173.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
<?php declare(strict_types=1);

namespace Bug6173;

use function PHPStan\Testing\assertType;

class HelloWorld
{
/**
* @param int[] $ids1
* @param int[] $ids2
*/
public function sayHello(array $ids1, array $ids2): bool
{
$res = [];
foreach ($ids1 as $id) {
$res[$id]['foo'] = $id;
}

foreach ($ids2 as $id) {
$res[$id]['bar'] = $id;
}

assertType('array<int, non-empty-array{foo?: int, bar?: int}>', $res);
foreach ($res as $id => $r) {
assertType('non-empty-array{foo?: int, bar?: int}', $r);
return isset($r['foo']);
}

return false;
}
}
7 changes: 7 additions & 0 deletions tests/PHPStan/Rules/Variables/IssetRuleTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -504,4 +504,11 @@ public function testPr4374(): void
]);
}

public function testBug10640(): void
{
$this->treatPhpDocTypesAsCertain = true;

$this->analyse([__DIR__ . '/../../Analyser/nsrt/bug-10640.php'], []);
}

}
Loading