2017-11-02 18:56:01 +01:00
|
|
|
<?php declare(strict_types=1);
|
2015-07-12 22:00:02 +02:00
|
|
|
|
|
|
|
namespace PhpParser\Parser;
|
|
|
|
|
|
|
|
use PhpParser\Error;
|
2020-08-08 11:01:56 +02:00
|
|
|
use PhpParser\ErrorHandler;
|
2015-07-12 22:00:02 +02:00
|
|
|
use PhpParser\Lexer;
|
|
|
|
use PhpParser\Node\Expr;
|
2016-11-23 22:58:18 +01:00
|
|
|
use PhpParser\Node\Scalar\LNumber;
|
2015-07-12 22:00:02 +02:00
|
|
|
use PhpParser\Node\Stmt;
|
2020-08-08 11:01:56 +02:00
|
|
|
use PhpParser\ParserAbstract;
|
2016-11-23 22:58:18 +01:00
|
|
|
use PhpParser\ParserTest;
|
2015-07-12 22:00:02 +02:00
|
|
|
|
2018-01-10 17:24:26 +01:00
|
|
|
class MultipleTest extends ParserTest
|
|
|
|
{
|
2015-07-12 22:00:02 +02:00
|
|
|
// This provider is for the generic parser tests, just pick an arbitrary order here
|
|
|
|
protected function getParser(Lexer $lexer) {
|
|
|
|
return new Multiple([new Php5($lexer), new Php7($lexer)]);
|
|
|
|
}
|
|
|
|
|
|
|
|
private function getPrefer7() {
|
|
|
|
$lexer = new Lexer(['usedAttributes' => []]);
|
|
|
|
return new Multiple([new Php7($lexer), new Php5($lexer)]);
|
|
|
|
}
|
|
|
|
|
|
|
|
private function getPrefer5() {
|
|
|
|
$lexer = new Lexer(['usedAttributes' => []]);
|
|
|
|
return new Multiple([new Php5($lexer), new Php7($lexer)]);
|
|
|
|
}
|
|
|
|
|
|
|
|
/** @dataProvider provideTestParse */
|
|
|
|
public function testParse($code, Multiple $parser, $expected) {
|
|
|
|
$this->assertEquals($expected, $parser->parse($code));
|
|
|
|
}
|
|
|
|
|
|
|
|
public function provideTestParse() {
|
|
|
|
return [
|
|
|
|
[
|
|
|
|
// PHP 7 only code
|
|
|
|
'<?php class Test { function function() {} }',
|
|
|
|
$this->getPrefer5(),
|
|
|
|
[
|
|
|
|
new Stmt\Class_('Test', ['stmts' => [
|
|
|
|
new Stmt\ClassMethod('function')
|
|
|
|
]]),
|
|
|
|
]
|
|
|
|
],
|
|
|
|
[
|
|
|
|
// PHP 5 only code
|
|
|
|
'<?php global $$a->b;',
|
|
|
|
$this->getPrefer7(),
|
|
|
|
[
|
|
|
|
new Stmt\Global_([
|
|
|
|
new Expr\Variable(new Expr\PropertyFetch(new Expr\Variable('a'), 'b'))
|
|
|
|
])
|
|
|
|
]
|
|
|
|
],
|
|
|
|
[
|
|
|
|
// Different meaning (PHP 5)
|
|
|
|
'<?php $$a[0];',
|
|
|
|
$this->getPrefer5(),
|
|
|
|
[
|
2017-01-19 21:15:26 +01:00
|
|
|
new Stmt\Expression(new Expr\Variable(
|
2016-03-10 12:51:47 +01:00
|
|
|
new Expr\ArrayDimFetch(new Expr\Variable('a'), LNumber::fromString('0'))
|
2017-01-19 21:15:26 +01:00
|
|
|
))
|
2015-07-12 22:00:02 +02:00
|
|
|
]
|
|
|
|
],
|
|
|
|
[
|
|
|
|
// Different meaning (PHP 7)
|
|
|
|
'<?php $$a[0];',
|
|
|
|
$this->getPrefer7(),
|
|
|
|
[
|
2017-01-19 21:15:26 +01:00
|
|
|
new Stmt\Expression(new Expr\ArrayDimFetch(
|
2016-03-10 12:51:47 +01:00
|
|
|
new Expr\Variable(new Expr\Variable('a')), LNumber::fromString('0')
|
2017-01-19 21:15:26 +01:00
|
|
|
))
|
2015-07-12 22:00:02 +02:00
|
|
|
]
|
|
|
|
],
|
|
|
|
];
|
|
|
|
}
|
|
|
|
|
|
|
|
public function testThrownError() {
|
2018-01-13 16:08:17 +01:00
|
|
|
$this->expectException(Error::class);
|
2017-04-27 18:14:07 +02:00
|
|
|
$this->expectExceptionMessage('FAIL A');
|
2015-07-12 22:00:02 +02:00
|
|
|
|
2020-08-08 11:01:56 +02:00
|
|
|
$parserA = new class implements \PhpParser\Parser {
|
|
|
|
public function parse(string $code, ErrorHandler $errorHandler = null) {
|
|
|
|
throw new Error('FAIL A');
|
|
|
|
}
|
|
|
|
};
|
|
|
|
$parserB = new class implements \PhpParser\Parser {
|
|
|
|
public function parse(string $code, ErrorHandler $errorHandler = null) {
|
|
|
|
throw new Error('FAIL B');
|
|
|
|
}
|
|
|
|
};
|
2015-07-12 22:00:02 +02:00
|
|
|
|
|
|
|
$parser = new Multiple([$parserA, $parserB]);
|
|
|
|
$parser->parse('dummy');
|
|
|
|
}
|
2017-04-27 18:14:07 +02:00
|
|
|
}
|