Chris@0: #!/usr/bin/env php Chris@0: [ Chris@0: 'startLine', 'endLine', 'startFilePos', 'endFilePos', 'comments' Chris@13: ]]); Chris@0: $parser = (new PhpParser\ParserFactory)->create( Chris@0: PhpParser\ParserFactory::PREFER_PHP7, Chris@0: $lexer Chris@0: ); Chris@0: $dumper = new PhpParser\NodeDumper([ Chris@0: 'dumpComments' => true, Chris@0: 'dumpPositions' => $attributes['with-positions'], Chris@0: ]); Chris@0: $prettyPrinter = new PhpParser\PrettyPrinter\Standard; Chris@0: Chris@0: $traverser = new PhpParser\NodeTraverser(); Chris@0: $traverser->addVisitor(new PhpParser\NodeVisitor\NameResolver); Chris@0: Chris@0: foreach ($files as $file) { Chris@0: if (strpos($file, ' Code $code\n"; Chris@0: } else { Chris@0: if (!file_exists($file)) { Chris@0: die("File $file does not exist.\n"); Chris@0: } Chris@0: Chris@0: $code = file_get_contents($file); Chris@0: echo "====> File $file:\n"; Chris@0: } Chris@0: Chris@0: if ($attributes['with-recovery']) { Chris@0: $errorHandler = new PhpParser\ErrorHandler\Collecting; Chris@0: $stmts = $parser->parse($code, $errorHandler); Chris@0: foreach ($errorHandler->getErrors() as $error) { Chris@0: $message = formatErrorMessage($error, $code, $attributes['with-column-info']); Chris@0: echo $message . "\n"; Chris@0: } Chris@0: if (null === $stmts) { Chris@0: continue; Chris@0: } Chris@0: } else { Chris@0: try { Chris@0: $stmts = $parser->parse($code); Chris@0: } catch (PhpParser\Error $error) { Chris@0: $message = formatErrorMessage($error, $code, $attributes['with-column-info']); Chris@0: die($message . "\n"); Chris@0: } Chris@0: } Chris@0: Chris@0: foreach ($operations as $operation) { Chris@0: if ('dump' === $operation) { Chris@0: echo "==> Node dump:\n"; Chris@0: echo $dumper->dump($stmts, $code), "\n"; Chris@0: } elseif ('pretty-print' === $operation) { Chris@0: echo "==> Pretty print:\n"; Chris@0: echo $prettyPrinter->prettyPrintFile($stmts), "\n"; Chris@13: } elseif ('json-dump' === $operation) { Chris@13: echo "==> JSON dump:\n"; Chris@13: echo json_encode($stmts, JSON_PRETTY_PRINT), "\n"; Chris@0: } elseif ('var-dump' === $operation) { Chris@0: echo "==> var_dump():\n"; Chris@0: var_dump($stmts); Chris@0: } elseif ('resolve-names' === $operation) { Chris@0: echo "==> Resolved names.\n"; Chris@0: $stmts = $traverser->traverse($stmts); Chris@0: } Chris@0: } Chris@0: } Chris@0: Chris@0: function formatErrorMessage(PhpParser\Error $e, $code, $withColumnInfo) { Chris@0: if ($withColumnInfo && $e->hasColumnInfo()) { Chris@0: return $e->getMessageWithColumnInfo($code); Chris@0: } else { Chris@0: return $e->getMessage(); Chris@0: } Chris@0: } Chris@0: Chris@0: function showHelp($error = '') { Chris@0: if ($error) { Chris@0: echo $error . "\n\n"; Chris@0: } Chris@0: die(<< false, Chris@0: 'with-positions' => false, Chris@0: 'with-recovery' => false, Chris@13: ]; Chris@0: Chris@0: array_shift($args); Chris@0: $parseOptions = true; Chris@0: foreach ($args as $arg) { Chris@0: if (!$parseOptions) { Chris@0: $files[] = $arg; Chris@0: continue; Chris@0: } Chris@0: Chris@0: switch ($arg) { Chris@0: case '--dump': Chris@0: case '-d': Chris@0: $operations[] = 'dump'; Chris@0: break; Chris@0: case '--pretty-print': Chris@0: case '-p': Chris@0: $operations[] = 'pretty-print'; Chris@0: break; Chris@13: case '--json-dump': Chris@13: case '-j': Chris@13: $operations[] = 'json-dump'; Chris@0: break; Chris@0: case '--var-dump': Chris@0: $operations[] = 'var-dump'; Chris@0: break; Chris@0: case '--resolve-names': Chris@0: case '-N'; Chris@0: $operations[] = 'resolve-names'; Chris@0: break; Chris@0: case '--with-column-info': Chris@0: case '-c'; Chris@0: $attributes['with-column-info'] = true; Chris@0: break; Chris@0: case '--with-positions': Chris@0: case '-P': Chris@0: $attributes['with-positions'] = true; Chris@0: break; Chris@0: case '--with-recovery': Chris@0: case '-r': Chris@0: $attributes['with-recovery'] = true; Chris@0: break; Chris@0: case '--help': Chris@0: case '-h'; Chris@0: showHelp(); Chris@0: break; Chris@0: case '--': Chris@0: $parseOptions = false; Chris@0: break; Chris@0: default: Chris@0: if ($arg[0] === '-') { Chris@0: showHelp("Invalid operation $arg."); Chris@0: } else { Chris@0: $files[] = $arg; Chris@0: } Chris@0: } Chris@0: } Chris@0: Chris@13: return [$operations, $files, $attributes]; Chris@0: }