mirror of
https://github.com/danog/PHP-Parser.git
synced 2024-12-11 17:09:41 +01:00
a947e731c3
The parameter case is a bit weird, because the subnode is called "name" here, rather than "var". Nothing we can do about that in this version though. The two parser options might be merged. I've kept it separate, because I think this variable representation should become the default (or even only representation) in the future, while I'm less sure about the Identifier thing.
75 lines
2.4 KiB
PHP
75 lines
2.4 KiB
PHP
<?php
|
|
|
|
namespace PhpParser;
|
|
|
|
require_once __DIR__ . '/CodeTestAbstract.php';
|
|
|
|
class CodeParsingTest extends CodeTestAbstract
|
|
{
|
|
/**
|
|
* @dataProvider provideTestParse
|
|
*/
|
|
public function testParse($name, $code, $expected, $modeLine) {
|
|
if (null !== $modeLine) {
|
|
$modes = array_fill_keys(explode(',', $modeLine), true);
|
|
} else {
|
|
$modes = [];
|
|
}
|
|
|
|
$parserOptions = [
|
|
'useIdentifierNodes' => isset($modes['ident']),
|
|
'useConsistentVariableNodes' => isset($modes['consistentVars']),
|
|
];
|
|
|
|
$lexer = new Lexer\Emulative(array('usedAttributes' => array(
|
|
'startLine', 'endLine', 'startFilePos', 'endFilePos', 'comments'
|
|
)));
|
|
$parser5 = new Parser\Php5($lexer, $parserOptions);
|
|
$parser7 = new Parser\Php7($lexer, $parserOptions);
|
|
|
|
$dumpPositions = isset($modes['positions']);
|
|
$output5 = $this->getParseOutput($parser5, $code, $dumpPositions);
|
|
$output7 = $this->getParseOutput($parser7, $code, $dumpPositions);
|
|
|
|
if (isset($modes['php5'])) {
|
|
$this->assertSame($expected, $output5, $name);
|
|
$this->assertNotSame($expected, $output7, $name);
|
|
} else if (isset($modes['php7'])) {
|
|
$this->assertNotSame($expected, $output5, $name);
|
|
$this->assertSame($expected, $output7, $name);
|
|
} else {
|
|
$this->assertSame($expected, $output5, $name);
|
|
$this->assertSame($expected, $output7, $name);
|
|
}
|
|
}
|
|
|
|
private function getParseOutput(Parser $parser, $code, $dumpPositions) {
|
|
$errors = new ErrorHandler\Collecting;
|
|
$stmts = $parser->parse($code, $errors);
|
|
|
|
$output = '';
|
|
foreach ($errors->getErrors() as $error) {
|
|
$output .= $this->formatErrorMessage($error, $code) . "\n";
|
|
}
|
|
|
|
if (null !== $stmts) {
|
|
$dumper = new NodeDumper(['dumpComments' => true, 'dumpPositions' => $dumpPositions]);
|
|
$output .= $dumper->dump($stmts, $code);
|
|
}
|
|
|
|
return canonicalize($output);
|
|
}
|
|
|
|
public function provideTestParse() {
|
|
return $this->getTests(__DIR__ . '/../code/parser', 'test');
|
|
}
|
|
|
|
private function formatErrorMessage(Error $e, $code) {
|
|
if ($e->hasColumnInfo()) {
|
|
return $e->getMessageWithColumnInfo($code);
|
|
} else {
|
|
return $e->getMessage();
|
|
}
|
|
}
|
|
}
|