Skip to content

Commit 9e0ffdd

Browse files
takaramondrejmirtes
authored andcommitted
Detect duplicated args passed to a variadic parameter
Closes phpstan/phpstan#13710
1 parent 8b57d0c commit 9e0ffdd

File tree

3 files changed

+18
-0
lines changed

3 files changed

+18
-0
lines changed

src/Rules/FunctionCallParametersCheck.php

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -578,6 +578,7 @@ private function processArguments(
578578
$newArguments = [];
579579

580580
$namedArgumentAlreadyOccurred = false;
581+
$namedArgumentsForVariadicParameter = [];
581582
foreach ($arguments as $i => [$argumentValue, $argumentValueType, $unpack, $argumentName, $argumentLine]) {
582583
if ($argumentName === null) {
583584
if (!isset($parameters[$i])) {
@@ -615,6 +616,14 @@ private function processArguments(
615616
$parametersCount = count($parameters);
616617
$parameter = $parameters[$parametersCount - 1];
617618
$originalParameter = $originalParameters[$parametersCount - 1];
619+
620+
if (isset($namedArgumentsForVariadicParameter[$argumentName])) {
621+
$errors[] = RuleErrorBuilder::message(sprintf('Named parameter $%s overwrites previous argument.', $argumentName))
622+
->identifier('argument.duplicate')
623+
->line($argumentLine)
624+
->build();
625+
}
626+
$namedArgumentsForVariadicParameter[$argumentName] = true;
618627
}
619628

620629
if ($namedArgumentAlreadyOccurred && $argumentName === null && !$unpack) {

tests/PHPStan/Rules/Functions/CallToFunctionParametersRuleTest.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -512,6 +512,10 @@ public function testNamedArguments(): void
512512
'Unknown parameter $a in call to function array_merge.',
513513
14,
514514
],
515+
[
516+
'Named parameter $var overwrites previous argument.',
517+
19,
518+
],
515519
];
516520

517521
require_once __DIR__ . '/data/named-arguments-define.php';

tests/PHPStan/Rules/Functions/data/named-arguments.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,8 @@ function baz(): void
1313
variadicFunction(...['a' => ['b', 'c']]); // works - userland
1414
array_merge(...['a' => ['b', 'c']]); // doesn't work - internal
1515
}
16+
17+
function bug13710(): void
18+
{
19+
variadicFunction(var: 1, var: 2);
20+
}

0 commit comments

Comments
 (0)