Skip to content
Open
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
2 changes: 1 addition & 1 deletion src/Analyser/MutatingScope.php
Original file line number Diff line number Diff line change
Expand Up @@ -2240,7 +2240,7 @@

$nativeParameterType = $parameter->getNativeType();
if ($parameter->isVariadic()) {
if (!$this->getPhpVersion()->supportsNamedArguments()->no() && $functionReflection->acceptsNamedArguments()->yes()) {
if (!$this->getPhpVersion()->supportsNamedArguments()->no()) {

Check warning on line 2243 in src/Analyser/MutatingScope.php

View workflow job for this annotation

GitHub Actions / Mutation Testing (8.3, ubuntu-latest)

Escaped Mutant for Mutator "PHPStan\Infection\TrinaryLogicMutator": @@ @@ $nativeParameterType = $parameter->getNativeType(); if ($parameter->isVariadic()) { - if (!$this->getPhpVersion()->supportsNamedArguments()->no()) { + if ($this->getPhpVersion()->supportsNamedArguments()->yes()) { $nativeParameterType = new ArrayType(new UnionType([IntegerRangeType::createAllGreaterThanOrEqualTo(0), new StringType()]), $nativeParameterType); } else { $nativeParameterType = new IntersectionType([new ArrayType(IntegerRangeType::createAllGreaterThanOrEqualTo(0), $nativeParameterType), new AccessoryArrayListType()]);

Check warning on line 2243 in src/Analyser/MutatingScope.php

View workflow job for this annotation

GitHub Actions / Mutation Testing (8.4, ubuntu-latest)

Escaped Mutant for Mutator "PHPStan\Infection\TrinaryLogicMutator": @@ @@ $nativeParameterType = $parameter->getNativeType(); if ($parameter->isVariadic()) { - if (!$this->getPhpVersion()->supportsNamedArguments()->no()) { + if ($this->getPhpVersion()->supportsNamedArguments()->yes()) { $nativeParameterType = new ArrayType(new UnionType([IntegerRangeType::createAllGreaterThanOrEqualTo(0), new StringType()]), $nativeParameterType); } else { $nativeParameterType = new IntersectionType([new ArrayType(IntegerRangeType::createAllGreaterThanOrEqualTo(0), $nativeParameterType), new AccessoryArrayListType()]);
$nativeParameterType = new ArrayType(new UnionType([IntegerRangeType::createAllGreaterThanOrEqualTo(0), new StringType()]), $nativeParameterType);
} else {
$nativeParameterType = new IntersectionType([new ArrayType(IntegerRangeType::createAllGreaterThanOrEqualTo(0), $nativeParameterType), new AccessoryArrayListType()]);
Expand Down
8 changes: 4 additions & 4 deletions tests/PHPStan/Analyser/nsrt/no-named-arguments.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
function noNamedArgumentsInFunction(float ...$args)
{
assertType('list<float>', $args);
assertNativeType('list<float>', $args);
assertNativeType('array<int<0, max>|string, float>', $args);
}

class Baz extends Foo implements Bar
Expand All @@ -22,19 +22,19 @@ class Baz extends Foo implements Bar
public function noNamedArgumentsInMethod(float ...$args)
{
assertType('list<float>', $args);
assertNativeType('list<float>', $args);
assertNativeType('array<int<0, max>|string, float>', $args);
}

public function noNamedArgumentsInParent(float ...$args)
{
assertType('list<float>', $args);
assertNativeType('list<float>', $args);
assertNativeType('array<int<0, max>|string, float>', $args);
}

public function noNamedArgumentsInInterface(float ...$args)
{
assertType('list<float>', $args);
assertNativeType('list<float>', $args);
assertNativeType('array<int<0, max>|string, float>', $args);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -207,6 +207,13 @@ public function testInTrait(): void
]);
}

#[RequiresPhp('>= 8.0.0')]
public function testNoNamedArgumentsNativeTypeWithUncertainPhpDocTypes(): void
{
$this->treatPhpDocTypesAsCertain = false;
$this->analyse([__DIR__ . '/data/no-named-arguments-native-type.php'], []);
}

public static function getAdditionalConfigFiles(): array
{
return [
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
<?php // lint >= 8.0
declare(strict_types = 1);

namespace NoNamedArgumentsNativeType;

final class QueryBuilder
{

/**
* @no-named-arguments
*/
public function groupBy(string ...$groupBy): void
{
self::validateVariadicParameter($groupBy);
}

/**
* @template TItem
* @param TItem[] $parameter
* @phpstan-assert list<TItem> $parameter
*/
private static function validateVariadicParameter(array $parameter): void
{
if (array_is_list($parameter)) {
return;
}

throw new \InvalidArgumentException();
}

}
2 changes: 1 addition & 1 deletion turbo-ext/src/MutatingScope.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4513,7 +4513,7 @@ class MutatingScope
if (UNEXPECTED(nativeParameterType.isUndef())) return zv::Val();
if (zend_is_true(isVariadic.raw())) {
bool named;
if (UNEXPECTED(!acceptsNamedArgumentsHere(reflection, named))) return zv::Val();
if (UNEXPECTED(!phpVersionSupportsNamedArguments(named))) return zv::Val();
zv::Val wrapped = variadicArrayType(nativeParameterType.raw(), named);
if (UNEXPECTED(wrapped.isUndef())) return zv::Val();
nativeParameterType = std::move(wrapped);
Expand Down
Loading