Skip to content

Commit 87a8d25

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

File tree

10 files changed

+38
-10
lines changed

10 files changed

+38
-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: 16 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,19 @@ 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+
private function isImplicitBoolean(array $args): bool
86+
{
87+
$modeExpr = $args[2]->value ?? null;
88+
if (! $modeExpr instanceof Expr) {
89+
return false;
90+
}
91+
92+
$modeValue = $this->valueResolver->getValue($modeExpr);
93+
// binary check for InputOption::VALUE_NONE
94+
return (bool) ($modeValue & 1);
95+
}
8196
}

rules/Symfony73/NodeFactory/CommandInvokeParamsFactory.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,8 @@ private function createOptionParams(array $commandOptions): array
9999

100100
if ($commandOption->getDefault() instanceof Expr) {
101101
$optionParam->default = $commandOption->getDefault();
102+
} elseif ($commandOption->isImplicitBoolean()) {
103+
$optionParam->default = new Expr\ConstFetch(new Node\Name('false'));
102104
}
103105

104106
$this->decorateParamType($optionParam, $commandOption);
@@ -165,6 +167,11 @@ private function decorateParamType(
165167
Param $argumentParam,
166168
CommandArgument|CommandOption $commandArgumentOrOption
167169
): void {
170+
if ($commandArgumentOrOption instanceof CommandOption && $commandArgumentOrOption->isImplicitBoolean()) {
171+
$argumentParam->type = new Identifier('bool');
172+
return;
173+
}
174+
168175
if ($commandArgumentOrOption->isArray()) {
169176
$argumentParam->type = new Identifier('array');
170177
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)