diff --git a/src/Type/Symfony/GetOptionTypeHelper.php b/src/Type/Symfony/GetOptionTypeHelper.php index a67606e1..9406698e 100644 --- a/src/Type/Symfony/GetOptionTypeHelper.php +++ b/src/Type/Symfony/GetOptionTypeHelper.php @@ -10,6 +10,7 @@ use PHPStan\Type\StringType; use PHPStan\Type\Type; use PHPStan\Type\TypeCombinator; +use PHPStan\Type\UnionType; use Symfony\Component\Console\Input\InputOption; class GetOptionTypeHelper @@ -18,6 +19,10 @@ class GetOptionTypeHelper public function getOptionType(Scope $scope, InputOption $option): Type { if (!$option->acceptValue()) { + if ($option->isNegatable()) { + return new UnionType([new BooleanType(), new NullType()]); + } + return new BooleanType(); } diff --git a/tests/Type/Symfony/data/ExampleOptionCommand.php b/tests/Type/Symfony/data/ExampleOptionCommand.php index 00c35894..b880173d 100644 --- a/tests/Type/Symfony/data/ExampleOptionCommand.php +++ b/tests/Type/Symfony/data/ExampleOptionCommand.php @@ -21,6 +21,7 @@ protected function configure(): void $this->addOption('c', null, InputOption::VALUE_REQUIRED); $this->addOption('d', null, InputOption::VALUE_IS_ARRAY | InputOption::VALUE_OPTIONAL); $this->addOption('e', null, InputOption::VALUE_IS_ARRAY | InputOption::VALUE_REQUIRED); + $this->addOption('f', null, InputOption::VALUE_NEGATABLE); $this->addOption('bb', null, InputOption::VALUE_OPTIONAL, '', 1); $this->addOption('cc', null, InputOption::VALUE_REQUIRED, '', 1); @@ -35,13 +36,14 @@ protected function execute(InputInterface $input, OutputInterface $output): int assertType('string|null', $input->getOption('c')); assertType('array', $input->getOption('d')); assertType('array', $input->getOption('e')); + assertType('bool|null', $input->getOption('f')); assertType('1|string|null', $input->getOption('bb')); assertType('1|string', $input->getOption('cc')); assertType('array', $input->getOption('dd')); assertType('array', $input->getOption('ee')); - assertType('array{a: bool, b: string|null, c: string|null, d: array, e: array, bb: 1|string|null, cc: 1|string, dd: array, ee: array, help: bool, quiet: bool, verbose: bool, version: bool, ansi: bool, no-interaction: bool}', $input->getOptions()); + assertType('array{a: bool, b: string|null, c: string|null, d: array, e: array, f: bool|null, bb: 1|string|null, cc: 1|string, dd: array, ee: array, help: bool, quiet: bool, verbose: bool, version: bool, ansi: bool|null, no-interaction: bool}', $input->getOptions()); } } diff --git a/tests/Type/Symfony/data/ExampleOptionLazyCommand.php b/tests/Type/Symfony/data/ExampleOptionLazyCommand.php index 1aaebf20..433e1cfe 100644 --- a/tests/Type/Symfony/data/ExampleOptionLazyCommand.php +++ b/tests/Type/Symfony/data/ExampleOptionLazyCommand.php @@ -23,6 +23,7 @@ protected function configure(): void $this->addOption('c', null, InputOption::VALUE_REQUIRED); $this->addOption('d', null, InputOption::VALUE_IS_ARRAY | InputOption::VALUE_OPTIONAL); $this->addOption('e', null, InputOption::VALUE_IS_ARRAY | InputOption::VALUE_REQUIRED); + $this->addOption('f', null, InputOption::VALUE_NEGATABLE); $this->addOption('bb', null, InputOption::VALUE_OPTIONAL, '', 1); $this->addOption('cc', null, InputOption::VALUE_REQUIRED, '', 1); @@ -37,13 +38,14 @@ protected function execute(InputInterface $input, OutputInterface $output): int assertType('string|null', $input->getOption('c')); assertType('array', $input->getOption('d')); assertType('array', $input->getOption('e')); + assertType('bool|null', $input->getOption('f')); assertType('1|string|null', $input->getOption('bb')); assertType('1|string', $input->getOption('cc')); assertType('array', $input->getOption('dd')); assertType('array', $input->getOption('ee')); - assertType('array{a: bool, b: string|null, c: string|null, d: array, e: array, bb: 1|string|null, cc: 1|string, dd: array, ee: array, help: bool, quiet: bool, verbose: bool, version: bool, ansi: bool, no-interaction: bool}', $input->getOptions()); + assertType('array{a: bool, b: string|null, c: string|null, d: array, e: array, f: bool|null, bb: 1|string|null, cc: 1|string, dd: array, ee: array, help: bool, quiet: bool, verbose: bool, version: bool, ansi: bool|null, no-interaction: bool}', $input->getOptions()); } }