/** * {@inheritdoc} */ protected function execute(InputInterface $input, OutputInterface $output) { $output->writeln(''); if (extension_loaded('xdebug')) { /** * This will disable only showing stack traces on error conditions. */ if (function_exists('xdebug_disable')) { xdebug_disable(); } $output->writeln('<error>It is highly recommended to disable the XDebug extension before invoking this command.</error>'); } $parser = (new ParserFactory())->create(ParserFactory::PREFER_PHP7, new \PhpParser\Lexer\Emulative(['usedAttributes' => ['comments', 'startLine', 'endLine', 'startTokenPos', 'endTokenPos']])); /** @var Application $application */ $application = $this->getApplication(); $application->compiler = new Compiler(); $em = EventManager::getInstance(); $context = new Context($output, $application, $em); $fileParser = new FileParser($parser, $this->getCompiler()); $path = $input->getArgument('path'); if (is_dir($path)) { $directoryIterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path, FilesystemIterator::SKIP_DOTS)); $output->writeln('Scanning directory <info>' . $path . '</info>'); $count = 0; /** @var SplFileInfo $file */ foreach ($directoryIterator as $file) { if ($file->getExtension() !== 'php') { continue; } $context->debug($file->getPathname()); $count++; } $output->writeln("Found <info>{$count} files</info>"); if ($count > 100) { $output->writeln('<comment>Caution: You are trying to scan a lot of files; this might be slow. For bigger libraries, consider setting up a dedicated platform or using ci.lowl.io.</comment>'); } $output->writeln(''); /** @var SplFileInfo $file */ foreach ($directoryIterator as $file) { if ($file->getExtension() !== 'php') { continue; } $fileParser->parserFile($file->getPathname(), $context); } } elseif (is_file($path)) { $fileParser->parserFile($path, $context); } /** * Step 2 Recursive check ... */ $application->compiler->compile($context); }
/** * @dataProvider provideTestParseAndDump * * @param $file * @param string $analyzer * @param string $expectedDump * @throws \PHPSA\Exception\RuntimeException * @throws \Webiny\Component\EventManager\EventManagerException */ public function testParseAndDump($file, $analyzer, $expectedDump) { $compiler = new Compiler(); $fileParser = new FileParser((new ParserFactory())->create(ParserFactory::PREFER_PHP7, new \PhpParser\Lexer\Emulative(array('usedAttributes' => array('comments', 'startLine', 'endLine', 'startTokenPos', 'endTokenPos')))), $compiler); $context = new Context(new \Symfony\Component\Console\Output\NullOutput(), $application = new Application(), $this->getEventManager($analyzer)); $application->compiler = $compiler; $fileParser->parserFile($file, $context); $compiler->compile($context); $expectedArray = json_decode($expectedDump, true); $expectedType = $expectedArray[0]["type"]; $issues = array_map(function (Issue $issue) { $location = $issue->getLocation(); return ['type' => $issue->getCheckName(), 'message' => $issue->getDescription(), 'file' => $location->getFileName(), 'line' => $location->getLineStart()]; }, $application->getIssuesCollector()->getIssues()); foreach ($expectedArray as $check) { self::assertContains($check, $issues, $file); // every expected Issue is in the collector } foreach ($issues as $check) { if ($check["type"] == $expectedType) { self::assertContains($check, $expectedArray, $file); // there is no other issue in the collector with the same type } } }