Merge branch '1.x'

Conflicts:
	grammar/rebuildParsers.php
	lib/PhpParser/Parser.php
This commit is contained in:
Nikita Popov 2015-09-19 22:07:29 +08:00
commit eecaf1e93b
5 changed files with 62 additions and 4 deletions

View File

@ -165,7 +165,7 @@ function resolveMacros($code) {
return 'foreach (' . $args[0] . ' as &$s) { if (is_string($s)) {' return 'foreach (' . $args[0] . ' as &$s) { if (is_string($s)) {'
. ' $s = Node\Scalar\String_::parseEscapeSequences($s, null, ' . $args[1] . '); } }' . ' $s = Node\Scalar\String_::parseEscapeSequences($s, null, ' . $args[1] . '); } }'
. ' $s = preg_replace(\'~(\r\n|\n|\r)$~\', \'\', $s);' . ' $s = preg_replace(\'~(\r\n|\n|\r)\z~\', \'\', $s);'
. ' if (\'\' === $s) array_pop(' . $args[0] . ');'; . ' if (\'\' === $s) array_pop(' . $args[0] . ');';
} }

View File

@ -135,7 +135,7 @@ class String_ extends Scalar
*/ */
public static function parseDocString($startToken, $str, $parseUnicodeEscape = true) { public static function parseDocString($startToken, $str, $parseUnicodeEscape = true) {
// strip last newline (thanks tokenizer for sticking it into the string!) // strip last newline (thanks tokenizer for sticking it into the string!)
$str = preg_replace('~(\r\n|\n|\r)$~', '', $str); $str = preg_replace('~(\r\n|\n|\r)\z~', '', $str);
// nowdoc string // nowdoc string
if (false !== strpos($startToken, '\'')) { if (false !== strpos($startToken, '\'')) {

View File

@ -2818,7 +2818,7 @@ class Php5 extends \PhpParser\ParserAbstract
} }
protected function reduceRule463() { protected function reduceRule463() {
foreach ($this->semStack[$this->stackPos-(3-2)] as &$s) { if (is_string($s)) { $s = Node\Scalar\String_::parseEscapeSequences($s, null, false); } } $s = preg_replace('~(\r\n|\n|\r)$~', '', $s); if ('' === $s) array_pop($this->semStack[$this->stackPos-(3-2)]);; $this->semValue = new Scalar\Encapsed($this->semStack[$this->stackPos-(3-2)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes); foreach ($this->semStack[$this->stackPos-(3-2)] as &$s) { if (is_string($s)) { $s = Node\Scalar\String_::parseEscapeSequences($s, null, false); } } $s = preg_replace('~(\r\n|\n|\r)\z~', '', $s); if ('' === $s) array_pop($this->semStack[$this->stackPos-(3-2)]);; $this->semValue = new Scalar\Encapsed($this->semStack[$this->stackPos-(3-2)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
} }
protected function reduceRule464() { protected function reduceRule464() {

View File

@ -2406,7 +2406,7 @@ class Php7 extends \PhpParser\ParserAbstract
} }
protected function reduceRule398() { protected function reduceRule398() {
foreach ($this->semStack[$this->stackPos-(3-2)] as &$s) { if (is_string($s)) { $s = Node\Scalar\String_::parseEscapeSequences($s, null, true); } } $s = preg_replace('~(\r\n|\n|\r)$~', '', $s); if ('' === $s) array_pop($this->semStack[$this->stackPos-(3-2)]);; $this->semValue = new Scalar\Encapsed($this->semStack[$this->stackPos-(3-2)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes); foreach ($this->semStack[$this->stackPos-(3-2)] as &$s) { if (is_string($s)) { $s = Node\Scalar\String_::parseEscapeSequences($s, null, true); } } $s = preg_replace('~(\r\n|\n|\r)\z~', '', $s); if ('' === $s) array_pop($this->semStack[$this->stackPos-(3-2)]);; $this->semValue = new Scalar\Encapsed($this->semStack[$this->stackPos-(3-2)], $this->startAttributeStack[$this->stackPos-(3-1)] + $this->endAttributes);
} }
protected function reduceRule399() { protected function reduceRule399() {

View File

@ -0,0 +1,58 @@
Trailing newlines in doc strings
-----
<?php
<<<'EOF'@@{ "\n\n" }@@EOF;
<<<'EOF'@@{ "\n\n\n" }@@EOF;
<<<'EOF'@@{ "\nFoo\n\n" }@@EOF;
<<<EOF@@{ "\n\$var\n\n" }@@EOF;
<<<'EOF'@@{ "\r\n\r\n" }@@EOF;
<<<'EOF'@@{ "\r\n\r\n\r\n" }@@EOF;
<<<'EOF'@@{ "\r\nFoo\r\n\r\n" }@@EOF;
<<<EOF@@{ "\r\n\$var\r\n\r\n" }@@EOF;
// comment to force line break before EOF
-----
array(
0: Scalar_String(
value:
)
1: Scalar_String(
value:
)
2: Scalar_String(
value: Foo
)
3: Scalar_Encapsed(
parts: array(
0: Expr_Variable(
name: var
)
1:
)
)
4: Scalar_String(
value:
)
5: Scalar_String(
value:
)
6: Scalar_String(
value: Foo
)
7: Scalar_Encapsed(
parts: array(
0: Expr_Variable(
name: var
)
1:
)
)
)