From 7d7625e7f61760c5c32a82877fab7c4a108062b3 Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Wed, 10 Sep 2025 12:57:32 +0200 Subject: [PATCH 1/2] misc --- .../argument_with_default_value.php.inc | 4 +- .../iterable_type_with_default_value.php.inc | 51 +++++++++++++++++++ .../CommandInvokeParamsFactory.php | 35 ++++++------- 3 files changed, 68 insertions(+), 22 deletions(-) rename rules-tests/Symfony73/Rector/Class_/InvokableCommandInputAttributeRector/Fixture/{ => DefaultValue}/argument_with_default_value.php.inc (94%) create mode 100644 rules-tests/Symfony73/Rector/Class_/InvokableCommandInputAttributeRector/Fixture/DefaultValue/iterable_type_with_default_value.php.inc diff --git a/rules-tests/Symfony73/Rector/Class_/InvokableCommandInputAttributeRector/Fixture/argument_with_default_value.php.inc b/rules-tests/Symfony73/Rector/Class_/InvokableCommandInputAttributeRector/Fixture/DefaultValue/argument_with_default_value.php.inc similarity index 94% rename from rules-tests/Symfony73/Rector/Class_/InvokableCommandInputAttributeRector/Fixture/argument_with_default_value.php.inc rename to rules-tests/Symfony73/Rector/Class_/InvokableCommandInputAttributeRector/Fixture/DefaultValue/argument_with_default_value.php.inc index ed9cf0f71..ab6d3ec19 100644 --- a/rules-tests/Symfony73/Rector/Class_/InvokableCommandInputAttributeRector/Fixture/argument_with_default_value.php.inc +++ b/rules-tests/Symfony73/Rector/Class_/InvokableCommandInputAttributeRector/Fixture/DefaultValue/argument_with_default_value.php.inc @@ -1,6 +1,6 @@ addArgument('iterable', InputArgument::REQUIRED | InputArgument::IS_ARRAY, null, ['many values']); + } + + protected function execute(InputInterface $input, OutputInterface $output): int + { + } +} + +?> +----- + diff --git a/rules/Symfony73/NodeFactory/CommandInvokeParamsFactory.php b/rules/Symfony73/NodeFactory/CommandInvokeParamsFactory.php index bc3e9308f..289245c83 100644 --- a/rules/Symfony73/NodeFactory/CommandInvokeParamsFactory.php +++ b/rules/Symfony73/NodeFactory/CommandInvokeParamsFactory.php @@ -63,7 +63,7 @@ private function createArgumentParams(array $commandArguments): array $argumentArgs = [new Arg(value: $commandArgument->getName(), name: new Identifier('name'))]; - if ($this->hasUsefulDescription($commandArgument)) { + if ($this->isNonEmptyExpr($commandArgument->getDescription())) { $argumentArgs[] = new Arg(value: $commandArgument->getDescription(), name: new Identifier( 'description' )); @@ -97,19 +97,15 @@ private function createOptionParams(array $commandOptions): array $optionArgs = [new Arg(value: $commandOption->getName(), name: new Identifier('name'))]; - if ($commandOption->getShortcut() instanceof Expr && ! $this->valueResolver->isNull( - $commandOption->getShortcut() - )) { + if ($this->isNonEmptyExpr($commandOption->getShortcut())) { $optionArgs[] = new Arg(value: $commandOption->getShortcut(), name: new Identifier('shortcut')); } - if ($commandOption->getMode() instanceof Expr && ! $this->valueResolver->isNull( - $commandOption->getMode() - )) { + if ($this->isNonEmptyExpr($commandOption->getMode())) { $optionArgs[] = new Arg(value: $commandOption->getMode(), name: new Identifier('mode')); } - if ($this->hasUsefulDescription($commandOption)) { + if ($this->isNonEmptyExpr($commandOption->getDescription())) { $optionArgs[] = new Arg(value: $commandOption->getDescription(), name: new Identifier('description')); } @@ -135,26 +131,25 @@ private function createCamelCase(string $value): string return lcfirst($value); } - private function hasUsefulDescription(CommandArgument|CommandOption $commandArgumentOrOption): bool + private function isOptionalArgument(CommandArgument $commandArgument): bool + { + if (! $commandArgument->getMode() instanceof Expr) { + return true; + } + + return $this->valueResolver->isValue($commandArgument->getMode(), 2); + } + + private function isNonEmptyExpr(?Expr $expr): bool { - if (! $commandArgumentOrOption->getDescription() instanceof Expr) { + if (! $expr instanceof Expr) { return false; } - $expr = $commandArgumentOrOption->getDescription(); if ($this->valueResolver->isNull($expr)) { return false; } return ! $this->valueResolver->isValue($expr, ''); } - - private function isOptionalArgument(CommandArgument $commandArgument): bool - { - if (! $commandArgument->getMode() instanceof Expr) { - return true; - } - - return $this->valueResolver->isValue($commandArgument->getMode(), 2); - } } From 7c1496b8b2cab75c89fcbc8750e64c41387f8465 Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Wed, 10 Sep 2025 13:05:18 +0200 Subject: [PATCH 2/2] [console] [7.3] add array argument support to /InvokableCommandInputAttributeRector --- .../NodeAnalyzer/CommandArgumentsResolver.php | 11 +++++++++++ .../NodeFactory/CommandInvokeParamsFactory.php | 7 ++++++- rules/Symfony73/ValueObject/CommandArgument.php | 6 ++++++ 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/rules/Symfony73/NodeAnalyzer/CommandArgumentsResolver.php b/rules/Symfony73/NodeAnalyzer/CommandArgumentsResolver.php index e9f8bcf12..cb33d8c2b 100644 --- a/rules/Symfony73/NodeAnalyzer/CommandArgumentsResolver.php +++ b/rules/Symfony73/NodeAnalyzer/CommandArgumentsResolver.php @@ -4,6 +4,7 @@ namespace Rector\Symfony\Symfony73\NodeAnalyzer; +use PhpParser\Node\Expr; use PhpParser\Node\Stmt\ClassMethod; use Rector\PhpParser\Node\Value\ValueResolver; use Rector\Symfony\Symfony73\NodeFinder\MethodCallFinder; @@ -30,12 +31,22 @@ public function resolve(ClassMethod $configureClassMethod): array $argumentName = $this->valueResolver->getValue($addArgumentArgs[0]->value); + $modeExpr = $addArgumentArgs[1]->value ?? null; + + $isArray = false; + if ($modeExpr instanceof Expr) { + $modeValue = $this->valueResolver->getValue($modeExpr); + // binary check for InputArgument::IS_ARRAY + $isArray = (bool) ($modeValue & 4); + } + $commandArguments[] = new CommandArgument( $argumentName, $addArgumentArgs[0]->value, $addArgumentArgs[1]->value ?? null, $addArgumentArgs[2]->value ?? null, $addArgumentArgs[3]->value ?? null, + $isArray ); } diff --git a/rules/Symfony73/NodeFactory/CommandInvokeParamsFactory.php b/rules/Symfony73/NodeFactory/CommandInvokeParamsFactory.php index 289245c83..f9036a8db 100644 --- a/rules/Symfony73/NodeFactory/CommandInvokeParamsFactory.php +++ b/rules/Symfony73/NodeFactory/CommandInvokeParamsFactory.php @@ -49,7 +49,12 @@ private function createArgumentParams(array $commandArguments): array foreach ($commandArguments as $commandArgument) { $variableName = $this->createCamelCase($commandArgument->getNameValue()); $argumentParam = new Param(new Variable($variableName)); - $argumentParam->type = new Identifier('string'); + + if ($commandArgument->isArray()) { + $argumentParam->type = new Identifier('array'); + } else { + $argumentParam->type = new Identifier('string'); + } if ($commandArgument->getDefault() instanceof Expr) { $argumentParam->default = $commandArgument->getDefault(); diff --git a/rules/Symfony73/ValueObject/CommandArgument.php b/rules/Symfony73/ValueObject/CommandArgument.php index 10bcfb3f2..6e9b39d43 100644 --- a/rules/Symfony73/ValueObject/CommandArgument.php +++ b/rules/Symfony73/ValueObject/CommandArgument.php @@ -14,6 +14,7 @@ public function __construct( private ?Expr $mode, private ?Expr $description, private ?Expr $default, + private bool $isArray ) { } @@ -41,4 +42,9 @@ public function getDefault(): ?Expr { return $this->default; } + + public function isArray(): bool + { + return $this->isArray; + } }