-<?php
+<?php declare(strict_types=1);
namespace PhpParser;
-use PhpParser\Comment;
use PhpParser\Node\Expr;
use PhpParser\Node\Scalar;
use PhpParser\Node\Scalar\String_;
+use PhpParser\Node\Stmt;
+use PHPUnit\Framework\TestCase;
-abstract class ParserTest extends \PHPUnit_Framework_TestCase
+abstract class ParserTest extends TestCase
{
/** @returns Parser */
abstract protected function getParser(Lexer $lexer);
}
public function testAttributeAssignment() {
- $lexer = new Lexer(array(
- 'usedAttributes' => array(
+ $lexer = new Lexer([
+ 'usedAttributes' => [
'comments', 'startLine', 'endLine',
'startTokenPos', 'endTokenPos',
- )
- ));
+ ]
+ ]);
$code = <<<'EOC'
<?php
$parser = $this->getParser($lexer);
$stmts = $parser->parse($code);
- /** @var \PhpParser\Node\Stmt\Function_ $fn */
+ /** @var Stmt\Function_ $fn */
$fn = $stmts[0];
- $this->assertInstanceOf('PhpParser\Node\Stmt\Function_', $fn);
- $this->assertEquals(array(
- 'comments' => array(
- new Comment\Doc('/** Doc comment */', 2, 6),
- ),
+ $this->assertInstanceOf(Stmt\Function_::class, $fn);
+ $this->assertEquals([
+ 'comments' => [
+ new Comment\Doc('/** Doc comment */', 2, 6, 1),
+ ],
'startLine' => 3,
'endLine' => 7,
'startTokenPos' => 3,
'endTokenPos' => 21,
- ), $fn->getAttributes());
+ ], $fn->getAttributes());
$param = $fn->params[0];
- $this->assertInstanceOf('PhpParser\Node\Param', $param);
- $this->assertEquals(array(
+ $this->assertInstanceOf(Node\Param::class, $param);
+ $this->assertEquals([
'startLine' => 3,
'endLine' => 3,
'startTokenPos' => 7,
'endTokenPos' => 7,
- ), $param->getAttributes());
+ ], $param->getAttributes());
- /** @var \PhpParser\Node\Stmt\Echo_ $echo */
+ /** @var Stmt\Echo_ $echo */
$echo = $fn->stmts[0];
- $this->assertInstanceOf('PhpParser\Node\Stmt\Echo_', $echo);
- $this->assertEquals(array(
- 'comments' => array(
- new Comment("// Line\n", 4, 49),
- new Comment("// Comments\n", 5, 61),
- ),
+ $this->assertInstanceOf(Stmt\Echo_::class, $echo);
+ $this->assertEquals([
+ 'comments' => [
+ new Comment("// Line\n", 4, 49, 12),
+ new Comment("// Comments\n", 5, 61, 14),
+ ],
'startLine' => 6,
'endLine' => 6,
'startTokenPos' => 16,
'endTokenPos' => 19,
- ), $echo->getAttributes());
+ ], $echo->getAttributes());
/** @var \PhpParser\Node\Expr\Variable $var */
$var = $echo->exprs[0];
- $this->assertInstanceOf('PhpParser\Node\Expr\Variable', $var);
- $this->assertEquals(array(
+ $this->assertInstanceOf(Expr\Variable::class, $var);
+ $this->assertEquals([
'startLine' => 6,
'endLine' => 6,
'startTokenPos' => 18,
'endTokenPos' => 18,
- ), $var->getAttributes());
+ ], $var->getAttributes());
}
/**
public function testExtraAttributes($code, $expectedAttributes) {
$parser = $this->getParser(new Lexer);
$stmts = $parser->parse("<?php $code;");
- $attributes = $stmts[0]->getAttributes();
+ $node = $stmts[0] instanceof Stmt\Expression ? $stmts[0]->expr : $stmts[0];
+ $attributes = $node->getAttributes();
foreach ($expectedAttributes as $name => $value) {
$this->assertSame($value, $attributes[$name]);
}
}
public function provideTestExtraAttributes() {
- return array(
- array('0', ['kind' => Scalar\LNumber::KIND_DEC]),
- array('9', ['kind' => Scalar\LNumber::KIND_DEC]),
- array('07', ['kind' => Scalar\LNumber::KIND_OCT]),
- array('0xf', ['kind' => Scalar\LNumber::KIND_HEX]),
- array('0XF', ['kind' => Scalar\LNumber::KIND_HEX]),
- array('0b1', ['kind' => Scalar\LNumber::KIND_BIN]),
- array('0B1', ['kind' => Scalar\LNumber::KIND_BIN]),
- array('[]', ['kind' => Expr\Array_::KIND_SHORT]),
- array('array()', ['kind' => Expr\Array_::KIND_LONG]),
- array("'foo'", ['kind' => String_::KIND_SINGLE_QUOTED]),
- array("b'foo'", ['kind' => String_::KIND_SINGLE_QUOTED]),
- array("B'foo'", ['kind' => String_::KIND_SINGLE_QUOTED]),
- array('"foo"', ['kind' => String_::KIND_DOUBLE_QUOTED]),
- array('b"foo"', ['kind' => String_::KIND_DOUBLE_QUOTED]),
- array('B"foo"', ['kind' => String_::KIND_DOUBLE_QUOTED]),
- array('"foo$bar"', ['kind' => String_::KIND_DOUBLE_QUOTED]),
- array('b"foo$bar"', ['kind' => String_::KIND_DOUBLE_QUOTED]),
- array('B"foo$bar"', ['kind' => String_::KIND_DOUBLE_QUOTED]),
- array("<<<'STR'\nSTR\n", ['kind' => String_::KIND_NOWDOC, 'docLabel' => 'STR']),
- array("<<<STR\nSTR\n", ['kind' => String_::KIND_HEREDOC, 'docLabel' => 'STR']),
- array("<<<\"STR\"\nSTR\n", ['kind' => String_::KIND_HEREDOC, 'docLabel' => 'STR']),
- array("b<<<'STR'\nSTR\n", ['kind' => String_::KIND_NOWDOC, 'docLabel' => 'STR']),
- array("B<<<'STR'\nSTR\n", ['kind' => String_::KIND_NOWDOC, 'docLabel' => 'STR']),
- array("<<< \t 'STR'\nSTR\n", ['kind' => String_::KIND_NOWDOC, 'docLabel' => 'STR']),
- // HHVM doesn't support this due to a lexer bug
- // (https://github.com/facebook/hhvm/issues/6970)
- // array("<<<'\xff'\n\xff\n", ['kind' => String_::KIND_NOWDOC, 'docLabel' => "\xff"]),
- array("<<<\"STR\"\n\$a\nSTR\n", ['kind' => String_::KIND_HEREDOC, 'docLabel' => 'STR']),
- array("b<<<\"STR\"\n\$a\nSTR\n", ['kind' => String_::KIND_HEREDOC, 'docLabel' => 'STR']),
- array("B<<<\"STR\"\n\$a\nSTR\n", ['kind' => String_::KIND_HEREDOC, 'docLabel' => 'STR']),
- array("<<< \t \"STR\"\n\$a\nSTR\n", ['kind' => String_::KIND_HEREDOC, 'docLabel' => 'STR']),
- array("die", ['kind' => Expr\Exit_::KIND_DIE]),
- array("die('done')", ['kind' => Expr\Exit_::KIND_DIE]),
- array("exit", ['kind' => Expr\Exit_::KIND_EXIT]),
- array("exit(1)", ['kind' => Expr\Exit_::KIND_EXIT]),
- array("?>Foo", ['hasLeadingNewline' => false]),
- array("?>\nFoo", ['hasLeadingNewline' => true]),
- array("namespace Foo;", ['kind' => Node\Stmt\Namespace_::KIND_SEMICOLON]),
- array("namespace Foo {}", ['kind' => Node\Stmt\Namespace_::KIND_BRACED]),
- array("namespace {}", ['kind' => Node\Stmt\Namespace_::KIND_BRACED]),
- );
+ return [
+ ['0', ['kind' => Scalar\LNumber::KIND_DEC]],
+ ['9', ['kind' => Scalar\LNumber::KIND_DEC]],
+ ['07', ['kind' => Scalar\LNumber::KIND_OCT]],
+ ['0xf', ['kind' => Scalar\LNumber::KIND_HEX]],
+ ['0XF', ['kind' => Scalar\LNumber::KIND_HEX]],
+ ['0b1', ['kind' => Scalar\LNumber::KIND_BIN]],
+ ['0B1', ['kind' => Scalar\LNumber::KIND_BIN]],
+ ['[]', ['kind' => Expr\Array_::KIND_SHORT]],
+ ['array()', ['kind' => Expr\Array_::KIND_LONG]],
+ ["'foo'", ['kind' => String_::KIND_SINGLE_QUOTED]],
+ ["b'foo'", ['kind' => String_::KIND_SINGLE_QUOTED]],
+ ["B'foo'", ['kind' => String_::KIND_SINGLE_QUOTED]],
+ ['"foo"', ['kind' => String_::KIND_DOUBLE_QUOTED]],
+ ['b"foo"', ['kind' => String_::KIND_DOUBLE_QUOTED]],
+ ['B"foo"', ['kind' => String_::KIND_DOUBLE_QUOTED]],
+ ['"foo$bar"', ['kind' => String_::KIND_DOUBLE_QUOTED]],
+ ['b"foo$bar"', ['kind' => String_::KIND_DOUBLE_QUOTED]],
+ ['B"foo$bar"', ['kind' => String_::KIND_DOUBLE_QUOTED]],
+ ["<<<'STR'\nSTR\n", ['kind' => String_::KIND_NOWDOC, 'docLabel' => 'STR']],
+ ["<<<STR\nSTR\n", ['kind' => String_::KIND_HEREDOC, 'docLabel' => 'STR']],
+ ["<<<\"STR\"\nSTR\n", ['kind' => String_::KIND_HEREDOC, 'docLabel' => 'STR']],
+ ["b<<<'STR'\nSTR\n", ['kind' => String_::KIND_NOWDOC, 'docLabel' => 'STR']],
+ ["B<<<'STR'\nSTR\n", ['kind' => String_::KIND_NOWDOC, 'docLabel' => 'STR']],
+ ["<<< \t 'STR'\nSTR\n", ['kind' => String_::KIND_NOWDOC, 'docLabel' => 'STR']],
+ ["<<<'\xff'\n\xff\n", ['kind' => String_::KIND_NOWDOC, 'docLabel' => "\xff"]],
+ ["<<<\"STR\"\n\$a\nSTR\n", ['kind' => String_::KIND_HEREDOC, 'docLabel' => 'STR']],
+ ["b<<<\"STR\"\n\$a\nSTR\n", ['kind' => String_::KIND_HEREDOC, 'docLabel' => 'STR']],
+ ["B<<<\"STR\"\n\$a\nSTR\n", ['kind' => String_::KIND_HEREDOC, 'docLabel' => 'STR']],
+ ["<<< \t \"STR\"\n\$a\nSTR\n", ['kind' => String_::KIND_HEREDOC, 'docLabel' => 'STR']],
+ ["die", ['kind' => Expr\Exit_::KIND_DIE]],
+ ["die('done')", ['kind' => Expr\Exit_::KIND_DIE]],
+ ["exit", ['kind' => Expr\Exit_::KIND_EXIT]],
+ ["exit(1)", ['kind' => Expr\Exit_::KIND_EXIT]],
+ ["?>Foo", ['hasLeadingNewline' => false]],
+ ["?>\nFoo", ['hasLeadingNewline' => true]],
+ ["namespace Foo;", ['kind' => Stmt\Namespace_::KIND_SEMICOLON]],
+ ["namespace Foo {}", ['kind' => Stmt\Namespace_::KIND_BRACED]],
+ ["namespace {}", ['kind' => Stmt\Namespace_::KIND_BRACED]],
+ ];
}
}
-class InvalidTokenLexer extends Lexer {
- public function getNextToken(&$value = null, &$startAttributes = null, &$endAttributes = null) {
+class InvalidTokenLexer extends Lexer
+{
+ public function getNextToken(&$value = null, &$startAttributes = null, &$endAttributes = null) : int {
$value = 'foobar';
return 999;
}