Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
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
4 changes: 4 additions & 0 deletions src/Type/ArrayType.php
Original file line number Diff line number Diff line change
Expand Up @@ -609,6 +609,10 @@ public function tryRemove(Type $typeToRemove): ?Type
return TypeCombinator::intersect($this, new NonEmptyArrayType());
}

if ($typeToRemove->isSuperTypeOf(new ConstantArrayType([], []))->yes()) {
return TypeCombinator::intersect($this, new NonEmptyArrayType());
}

if ($typeToRemove instanceof NonEmptyArrayType) {
return new ConstantArrayType([], []);
}
Expand Down
4 changes: 2 additions & 2 deletions tests/PHPStan/Analyser/nsrt/array-is-list-type-specifying.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ function foo(array $foo) {
if (array_is_list($foo)) {
assertType('list', $foo);
} else {
assertType('array', $foo);
assertType('non-empty-array', $foo);
}
}

Expand Down Expand Up @@ -51,7 +51,7 @@ function foo4(array $foo) {
if (array_is_list($foo)) {
assertType('list', $foo);
} else {
assertType('array<int|string, mixed>', $foo);
assertType('non-empty-array<int|string, mixed>', $foo);
}

$baz = [];
Expand Down
8 changes: 4 additions & 4 deletions tests/PHPStan/Analyser/nsrt/assert-docblock.php
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ function takesArrayIfTrue(array $arr) : void {
if (validateStringArrayIfTrue($arr)) {
assertType('array<string>', $arr);
} else {
assertType('array<mixed>', $arr);
assertType('non-empty-array<mixed>', $arr);
}
}
/**
Expand All @@ -81,7 +81,7 @@ function takesArrayIfTrue1(array $arr) : void {
assertType('array<mixed>', $arr);

if (!validateStringArrayIfTrue($arr)) {
assertType('array<mixed>', $arr);
assertType('non-empty-array<mixed>', $arr);
} else {
assertType('array<string>', $arr);
}
Expand All @@ -96,7 +96,7 @@ function takesArrayIfFalse(array $arr) : void {
if (!validateStringArrayIfFalse($arr)) {
assertType('array<string>', $arr);
} else {
assertType('array<mixed>', $arr);
assertType('non-empty-array<mixed>', $arr);
}
}

Expand All @@ -107,7 +107,7 @@ function takesArrayIfFalse1(array $arr) : void {
assertType('array<mixed>', $arr);

if (validateStringArrayIfFalse($arr)) {
assertType('array<mixed>', $arr);
assertType('non-empty-array<mixed>', $arr);
} else {
assertType('array<string>', $arr);
}
Expand Down
89 changes: 88 additions & 1 deletion tests/PHPStan/Analyser/nsrt/bug-9734.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ public function doFoo(array $a): void
if (array_is_list($a)) {
assertType('list', $a);
} else {
assertType('array<mixed>', $a); // could be non-empty-array
assertType('non-empty-array<mixed>', $a);
}
}

Expand Down Expand Up @@ -45,3 +45,90 @@ public function doFoo3(array $a): void
}

}

class Bar
{
/**
* @param array<array-key, mixed> $value
* @return ($value is non-empty-list ? true : false)
*/
public function assertIsNonEmptyList($value): bool
{
return false;
}

/**
* @param array<array-key, mixed> $value
* @return ($value is list<string> ? true : false)
*/
public function assertIsStringList($value): bool
{
return false;
}

/**
* @param array<array-key, mixed> $value
* @return ($value is list{string, string} ? true : false)
*/
public function assertIsConstantList($value): bool
{
return false;
}

/**
* @param array<array-key, mixed> $value
* @return ($value is list{0?: string, 1?: string} ? true : false)
*/
public function assertIsOptionalConstantList($value): bool
{
return false;
}

/**
* @param array<array-key, mixed> $value
* @return ($value is array<string> ? true : false)
*/
public function assertIsStringArray($value): bool
{
return false;
}

/**
* @param array<mixed> $a
* @return void
*/
public function doFoo(array $a): void
{
if ($this->assertIsNonEmptyList($a)) {
assertType('non-empty-list', $a);
} else {
assertType('array<mixed>', $a);
}

if ($this->assertIsStringList($a)) {
assertType('list<string>', $a);
} else {
assertType('non-empty-array', $a);
}

if ($this->assertIsConstantList($a)) {
assertType('array{string, string}', $a);
} else {
assertType('array', $a);
}

if ($this->assertIsOptionalConstantList($a)) {
assertType('list{0?: string, 1?: string}', $a);
} else {
assertType('non-empty-array', $a);
}

if ($this->assertIsStringArray($a)) {
assertType('array<string>', $a);
} else {
assertType('non-empty-array', $a);
}
}


}
Loading