showHelp('Test type must be one of: PHP5, PHP7 or Symfony');
}
-require_once dirname(__FILE__) . '/../lib/PhpParser/Autoloader.php';
-PhpParser\Autoloader::register();
-
-$parserName = 'PhpParser\Parser\\' . $version;
-$parser = new $parserName(new PhpParser\Lexer\Emulative);
+require_once __DIR__ . '/../vendor/autoload.php';
+
+$lexer = new PhpParser\Lexer\Emulative(['usedAttributes' => [
+ 'comments', 'startLine', 'endLine', 'startTokenPos', 'endTokenPos',
+]]);
+$parserName = 'PhpParser\Parser\\' . $version;
+/** @var PhpParser\Parser $parser */
+$parser = new $parserName($lexer);
$prettyPrinter = new PhpParser\PrettyPrinter\Standard;
-$nodeDumper = new PhpParser\NodeDumper;
+$nodeDumper = new PhpParser\NodeDumper;
+
+$cloningTraverser = new PhpParser\NodeTraverser;
+$cloningTraverser->addVisitor(new PhpParser\NodeVisitor\CloningVisitor);
-$parseFail = $ppFail = $compareFail = $count = 0;
+$parseFail = $fpppFail = $ppFail = $compareFail = $count = 0;
-$readTime = $parseTime = $ppTime = $reparseTime = $compareTime = 0;
+$readTime = $parseTime = $cloneTime = 0;
+$fpppTime = $ppTime = $reparseTime = $compareTime = 0;
$totalStartTime = microtime(true);
foreach (new RecursiveIteratorIterator(
}
$startTime = microtime(true);
- $code = file_get_contents($file);
+ $origCode = file_get_contents($file);
$readTime += microtime(true) - $startTime;
- if (null === $code = $codeExtractor($file, $code)) {
+ if (null === $origCode = $codeExtractor($file, $origCode)) {
continue;
}
try {
$startTime = microtime(true);
- $stmts = $parser->parse($code);
+ $origStmts = $parser->parse($origCode);
$parseTime += microtime(true) - $startTime;
+ $origTokens = $lexer->getTokens();
+
$startTime = microtime(true);
- $code = '<?php' . "\n" . $prettyPrinter->prettyPrint($stmts);
+ $stmts = $cloningTraverser->traverse($origStmts);
+ $cloneTime += microtime(true) - $startTime;
+
+ $startTime = microtime(true);
+ $code = $prettyPrinter->printFormatPreserving($stmts, $origStmts, $origTokens);
+ $fpppTime += microtime(true) - $startTime;
+
+ if ($code !== $origCode) {
+ echo $file, ":\n Result of format-preserving pretty-print differs\n";
+ if ($verbose) {
+ echo "FPPP output:\n=====\n$code\n=====\n\n";
+ }
+
+ ++$fpppFail;
+ }
+
+ $startTime = microtime(true);
+ $code = "<?php\n" . $prettyPrinter->prettyPrint($stmts);
$ppTime += microtime(true) - $startTime;
try {
if (0 !== $ppFail) {
echo ' ', $ppFail, ' pretty print failures.', "\n";
}
+ if (0 !== $fpppFail) {
+ echo ' ', $fpppFail, ' FPPP failures.', "\n";
+ }
if (0 !== $compareFail) {
echo ' ', $compareFail, ' compare failures.', "\n";
}
"\n",
'Reading files took: ', $readTime, "\n",
'Parsing took: ', $parseTime, "\n",
+ 'Cloning took: ', $cloneTime, "\n",
+ 'FPPP took: ', $fpppTime, "\n",
'Pretty printing took: ', $ppTime, "\n",
'Reparsing took: ', $reparseTime, "\n",
'Comparing took: ', $compareTime, "\n",