Skip to content

Commit f0e82fe

Browse files
committed
[console] [7.3] Add implicit boolean type
1 parent 664dd13 commit f0e82fe

File tree

10 files changed

+43
-10
lines changed

10 files changed

+43
-10
lines changed

rules-tests/Symfony73/Rector/Class_/InvokableCommandInputAttributeRector/Fixture/some_command.php.inc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ final class SomeCommand
4747
{
4848
public function __invoke(#[\Symfony\Component\Console\Attribute\Argument(name: 'argument', description: 'Argument description')]
4949
string $argument, #[\Symfony\Component\Console\Attribute\Option(name: 'option', shortcut: 'o', mode: InputOption::VALUE_NONE, description: 'Option description')]
50-
$option): int
50+
bool $option = false): int
5151
{
5252
$someArgument = $argument;
5353
$someOption = $option;

rules-tests/Symfony73/Rector/Class_/InvokableCommandInputAttributeRector/Fixture/some_command_with_method_chaining.php.inc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ final class SomeCommandWithMethodChaining
4848
{
4949
public function __invoke(#[\Symfony\Component\Console\Attribute\Argument(name: 'argument', description: 'Argument description')]
5050
string $argument, #[\Symfony\Component\Console\Attribute\Option(name: 'option', shortcut: 'o', mode: InputOption::VALUE_NONE, description: 'Option description')]
51-
$option): int
51+
bool $option = false): int
5252
{
5353
$someArgument = $argument;
5454
$someOption = $option;

rules-tests/Symfony73/Rector/Class_/InvokableCommandInputAttributeRector/Fixture/some_command_with_set_help.php.inc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ final class SomeCommandWithSetHelp
5353

5454
public function __invoke(#[\Symfony\Component\Console\Attribute\Argument(name: 'argument', description: 'Argument description')]
5555
string $argument, #[\Symfony\Component\Console\Attribute\Option(name: 'option', shortcut: 'o', mode: InputOption::VALUE_NONE, description: 'Option description')]
56-
$option): int
56+
bool $option = false): int
5757
{
5858
$someArgument = $argument;
5959
$someOption = $option;

rules-tests/Symfony73/Rector/Class_/InvokableCommandInputAttributeRector/Fixture/with_multiple_arguments_options_fluent.php.inc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,9 @@ final class WithMultipleArgumentsOptionsFluent
5757
#[\Symfony\Component\Console\Attribute\Argument(name: 'argument2', description: 'Argument2 description')]
5858
string $argument2,
5959
#[\Symfony\Component\Console\Attribute\Option(name: 'option1', shortcut: 'o', mode: InputOption::VALUE_NONE, description: 'Option1 description')]
60-
$option1,
60+
bool $option1 = false,
6161
#[\Symfony\Component\Console\Attribute\Option(name: 'option2', shortcut: 'p', mode: InputOption::VALUE_NONE, description: 'Option2 description')]
62-
$option2
62+
bool $option2 = false
6363
): int
6464
{
6565
$arg1 = $argument1;

rules-tests/Symfony73/Rector/Class_/InvokableCommandInputAttributeRector/Fixture/with_multiple_arguments_options_no_fluent.php.inc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,9 +62,9 @@ final class WithMultipleArgumentsOptionsNotFluent
6262
#[\Symfony\Component\Console\Attribute\Argument(name: 'argument2', description: 'Argument2 description')]
6363
string $argument2,
6464
#[\Symfony\Component\Console\Attribute\Option(name: 'option1', shortcut: 'o', mode: InputOption::VALUE_NONE, description: 'Option1 description')]
65-
$option1,
65+
bool $option1 = false,
6666
#[\Symfony\Component\Console\Attribute\Option(name: 'option2', shortcut: 'p', mode: InputOption::VALUE_NONE, description: 'Option2 description')]
67-
$option2
67+
bool $option2 = false
6868
): int
6969
{
7070
$arg1 = $argument1;

rules-tests/Symfony73/Rector/Class_/InvokableCommandInputAttributeRector/Fixture/with_optional_argument.php.inc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ final class WithOptionalArgument
4747
{
4848
public function __invoke(#[\Symfony\Component\Console\Attribute\Argument(name: 'argument', description: 'Argument description')]
4949
?string $argument, #[\Symfony\Component\Console\Attribute\Option(name: 'option', shortcut: 'o', mode: InputOption::VALUE_NONE, description: 'Option description')]
50-
$option): int
50+
bool $option = false): int
5151
{
5252
$someArgument = $argument;
5353
$someOption = $option;

rules-tests/Symfony73/Rector/Class_/InvokableCommandInputAttributeRector/Fixture/with_override.php.inc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ final class WithOverride
5151
#[\Symfony\Component\Console\Attribute\Argument(name: 'argument', description: 'Argument description')]
5252
string $argument,
5353
#[\Symfony\Component\Console\Attribute\Option(name: 'option', shortcut: 'o', mode: InputOption::VALUE_NONE, description: 'Option description')]
54-
$option
54+
bool $option = false
5555
): int
5656
{
5757
$someArgument = $argument;

rules/Symfony73/NodeAnalyzer/CommandOptionsResolver.php

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ public function resolve(ClassMethod $configureClassMethod): array
3636

3737
$optionName = $this->valueResolver->getValue($addOptionArgs[0]->value);
3838

39+
$isImplicitBoolean = $this->isImplicitBoolean($addOptionArgs);
40+
3941
$commandOptions[] = new CommandOption(
4042
$optionName,
4143
$addOptionArgs[0]->value,
@@ -44,6 +46,7 @@ public function resolve(ClassMethod $configureClassMethod): array
4446
$addOptionArgs[3]->value ?? null,
4547
$addOptionArgs[4]->value ?? null,
4648
$this->isArrayMode($addOptionArgs),
49+
$isImplicitBoolean,
4750
$this->resolveDefaultType($addOptionArgs)
4851
);
4952
}
@@ -75,7 +78,22 @@ private function isArrayMode(array $args): bool
7578
}
7679

7780
$modeValue = $this->valueResolver->getValue($modeExpr);
78-
// binary check for InputOptions::VALUE_IS_ARRAY
81+
// binary check for InputOption::VALUE_IS_ARRAY
7982
return (bool) ($modeValue & 8);
8083
}
84+
85+
/**
86+
* @param Arg[] $args
87+
*/
88+
private function isImplicitBoolean(array $args): bool
89+
{
90+
$modeExpr = $args[2]->value ?? null;
91+
if (! $modeExpr instanceof Expr) {
92+
return false;
93+
}
94+
95+
$modeValue = $this->valueResolver->getValue($modeExpr);
96+
// binary check for InputOption::VALUE_NONE
97+
return (bool) ($modeValue & 1);
98+
}
8199
}

rules/Symfony73/NodeFactory/CommandInvokeParamsFactory.php

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44

55
namespace Rector\Symfony\Symfony73\NodeFactory;
66

7+
use PhpParser\Node\Expr\ConstFetch;
8+
use PhpParser\Node\Name;
79
use PhpParser\Node;
810
use PhpParser\Node\Arg;
911
use PhpParser\Node\Attribute;
@@ -99,6 +101,8 @@ private function createOptionParams(array $commandOptions): array
99101

100102
if ($commandOption->getDefault() instanceof Expr) {
101103
$optionParam->default = $commandOption->getDefault();
104+
} elseif ($commandOption->isImplicitBoolean()) {
105+
$optionParam->default = new ConstFetch(new Name('false'));
102106
}
103107

104108
$this->decorateParamType($optionParam, $commandOption);
@@ -165,6 +169,11 @@ private function decorateParamType(
165169
Param $argumentParam,
166170
CommandArgument|CommandOption $commandArgumentOrOption
167171
): void {
172+
if ($commandArgumentOrOption instanceof CommandOption && $commandArgumentOrOption->isImplicitBoolean()) {
173+
$argumentParam->type = new Identifier('bool');
174+
return;
175+
}
176+
168177
if ($commandArgumentOrOption->isArray()) {
169178
$argumentParam->type = new Identifier('array');
170179
return;

rules/Symfony73/ValueObject/CommandOption.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ public function __construct(
1717
private ?Expr $description,
1818
private ?Expr $default,
1919
private bool $isArray,
20+
private bool $isImplicitBoolean,
2021
private ?Type $defaultType
2122
) {
2223
}
@@ -60,4 +61,9 @@ public function isArray(): bool
6061
{
6162
return $this->isArray;
6263
}
64+
65+
public function isImplicitBoolean(): bool
66+
{
67+
return $this->isImplicitBoolean;
68+
}
6369
}

0 commit comments

Comments
 (0)