symfonyStyle = $symfonyStyle; $this->skippedClassResolver = $skippedClassResolver; $this->rectors = $rectors; parent::__construct(); } protected function configure() : void { $this->setName('list-rules'); $this->setDescription('Show loaded Rectors'); $this->setAliases(['show-rules']); $this->addOption(Option::OUTPUT_FORMAT, null, InputOption::VALUE_REQUIRED, 'Select output format', ConsoleOutputFormatter::NAME); } protected function execute(InputInterface $input, OutputInterface $output) : int { $rectorClasses = $this->resolveRectorClasses(); $skippedClasses = $this->getSkippedCheckers(); $outputFormat = $input->getOption(Option::OUTPUT_FORMAT); if ($outputFormat === 'json') { $data = ['rectors' => $rectorClasses, 'skipped-rectors' => $skippedClasses]; echo Json::encode($data, \true) . \PHP_EOL; return Command::SUCCESS; } $this->symfonyStyle->title('Loaded Rector rules'); $this->symfonyStyle->listing($rectorClasses); if ($skippedClasses !== []) { $this->symfonyStyle->title('Skipped Rector rules'); $this->symfonyStyle->listing($skippedClasses); } $this->symfonyStyle->newLine(); $this->symfonyStyle->note(\sprintf('Loaded %d rules', \count($rectorClasses))); return Command::SUCCESS; } /** * @return array> */ private function resolveRectorClasses() : array { $customRectors = \array_filter($this->rectors, static function (RectorInterface $rector) : bool { return !$rector instanceof PostRectorInterface; }); $rectorClasses = \array_map(static function (RectorInterface $rector) : string { return \get_class($rector); }, $customRectors); \sort($rectorClasses); return \array_unique($rectorClasses); } /** * @return string[] */ private function getSkippedCheckers() : array { $skippedCheckers = []; foreach ($this->skippedClassResolver->resolve() as $checkerClass => $fileList) { // ignore specific skips if ($fileList !== null) { continue; } $skippedCheckers[] = $checkerClass; } return $skippedCheckers; } }