namespace PhpParser\Lexer;
+use PhpParser\ErrorHandler;
use PhpParser\LexerTest;
use PhpParser\Parser\Tokens;
$lexer = $this->getLexer();
$lexer->startLexing('<?php ' . $code);
- foreach ($expectedTokens as $expectedToken) {
- list($expectedTokenType, $expectedTokenText) = $expectedToken;
- $this->assertSame($expectedTokenType, $lexer->getNextToken($text));
- $this->assertSame($expectedTokenText, $text);
+ $tokens = [];
+ while (0 !== $token = $lexer->getNextToken($text)) {
+ $tokens[] = [$token, $text];
}
- $this->assertSame(0, $lexer->getNextToken());
+ $this->assertSame($expectedTokens, $tokens);
}
/**
$this->assertSame(0, $lexer->getNextToken());
}
+ /**
+ * @dataProvider provideTestLexNewFeatures
+ */
+ public function testErrorAfterEmulation($code) {
+ $errorHandler = new ErrorHandler\Collecting;
+ $lexer = $this->getLexer([]);
+ $lexer->startLexing('<?php ' . $code . "\0", $errorHandler);
+
+ $errors = $errorHandler->getErrors();
+ $this->assertCount(1, $errors);
+
+ $error = $errors[0];
+ $this->assertSame('Unexpected null byte', $error->getRawMessage());
+
+ $attrs = $error->getAttributes();
+ $expPos = strlen('<?php ' . $code);
+ $expLine = 1 + substr_count('<?php ' . $code, "\n");
+ $this->assertSame($expPos, $attrs['startFilePos']);
+ $this->assertSame($expPos, $attrs['endFilePos']);
+ $this->assertSame($expLine, $attrs['startLine']);
+ $this->assertSame($expLine, $attrs['endLine']);
+ }
+
public function provideTestLexNewFeatures() {
return [
['yield from', [
[Tokens::T_END_HEREDOC, 'NOWDOC'],
[ord(';'), ';'],
]],
+
+ // Flexible heredoc/nowdoc
+ ["<<<LABEL\nLABEL,", [
+ [Tokens::T_START_HEREDOC, "<<<LABEL\n"],
+ [Tokens::T_END_HEREDOC, "LABEL"],
+ [ord(','), ','],
+ ]],
+ ["<<<LABEL\n LABEL,", [
+ [Tokens::T_START_HEREDOC, "<<<LABEL\n"],
+ [Tokens::T_END_HEREDOC, " LABEL"],
+ [ord(','), ','],
+ ]],
+ ["<<<LABEL\n Foo\n LABEL;", [
+ [Tokens::T_START_HEREDOC, "<<<LABEL\n"],
+ [Tokens::T_ENCAPSED_AND_WHITESPACE, " Foo\n"],
+ [Tokens::T_END_HEREDOC, " LABEL"],
+ [ord(';'), ';'],
+ ]],
+ ["<<<A\n A,<<<A\n A,", [
+ [Tokens::T_START_HEREDOC, "<<<A\n"],
+ [Tokens::T_END_HEREDOC, " A"],
+ [ord(','), ','],
+ [Tokens::T_START_HEREDOC, "<<<A\n"],
+ [Tokens::T_END_HEREDOC, " A"],
+ [ord(','), ','],
+ ]],
+ ["<<<LABEL\nLABELNOPE\nLABEL\n", [
+ [Tokens::T_START_HEREDOC, "<<<LABEL\n"],
+ [Tokens::T_ENCAPSED_AND_WHITESPACE, "LABELNOPE\n"],
+ [Tokens::T_END_HEREDOC, "LABEL"],
+ ]],
+ // Interpretation changed
+ ["<<<LABEL\n LABEL\nLABEL\n", [
+ [Tokens::T_START_HEREDOC, "<<<LABEL\n"],
+ [Tokens::T_END_HEREDOC, " LABEL"],
+ [Tokens::T_STRING, "LABEL"],
+ ]],
];
}
}