Skip to content

Commit

Permalink
Make LinefeedFixer a safe fixer.
Browse files Browse the repository at this point in the history
  • Loading branch information
SpacePossum committed Sep 27, 2016
1 parent 6613c42 commit 4c2da37
Show file tree
Hide file tree
Showing 2 changed files with 65 additions and 4 deletions.
22 changes: 20 additions & 2 deletions Symfony/CS/Fixer/PSR2/LinefeedFixer.php
Expand Up @@ -13,11 +13,13 @@
namespace Symfony\CS\Fixer\PSR2;

use Symfony\CS\AbstractFixer;
use Symfony\CS\Tokenizer\Tokens;

/**
* Fixer for rules defined in PSR2 ¶2.2.
*
* @author Fabien Potencier <fabien@symfony.com>
* @author SpacePossum
*/
class LinefeedFixer extends AbstractFixer
{
Expand All @@ -26,8 +28,24 @@ class LinefeedFixer extends AbstractFixer
*/
public function fix(\SplFileInfo $file, $content)
{
// [Structure] Use the linefeed character (0x0A) to end lines
return str_replace("\r\n", "\n", $content);
$tokens = Tokens::fromCode($content);
for ($index = 0, $count = count($tokens); $index < $count; ++$index) {
if ($tokens[$index]->isGivenKind(T_ENCAPSED_AND_WHITESPACE)) {
if ("\r\n" === substr($tokens[$index]->getContent(), -2) && $tokens[$tokens->getNextMeaningfulToken($index)]->isGivenKind(T_END_HEREDOC)) {
$tokens[$index]->setContent(substr($tokens[$index]->getContent(), 0, -2)."\n");
}

continue;
}

if (!$tokens[$index]->isGivenKind(array(T_OPEN_TAG, T_WHITESPACE, T_COMMENT, T_DOC_COMMENT, T_START_HEREDOC))) {
continue;
}

$tokens[$index]->setContent(str_replace("\r\n", "\n", $tokens[$index]->getContent()));
}

return $tokens->generateCode();
}

/**
Expand Down
47 changes: 45 additions & 2 deletions Symfony/CS/Tests/Fixer/PSR2/LinefeedFixerTest.php
Expand Up @@ -16,6 +16,7 @@

/**
* @author Dariusz Rumiński <dariusz.ruminski@gmail.com>
* @author SpacePossum
*/
class LinefeedFixerTest extends AbstractFixerTestBase
{
Expand All @@ -30,9 +31,51 @@ public function testFix($expected, $input = null)
public function provideCases()
{
return array(
// T_OPEN_TAG
array(
"<?php \n \$a = 1;",
"<?php \r\n \$a = 1;",
"<?php\n \$a = 1;",
"<?php\r\n \$a = 1;",
),
// T_WHITESPACE
array(
"<?php \n \$a\n= 1;\n",
"<?php \r\n \$a\r\n= 1;\r\n",
),
// T_COMMENT
array(
"<?php /*\n*/",
"<?php /*\r\n*/",
),
// T_DOC_COMMENT
array(
"<?php /**\n*/",
"<?php /**\r\n*/",
),
// T_START_HEREDOC
array(
"<?php \$a = <<<'TEST'\nAA\nTEST;\n",
"<?php \$a = <<<'TEST'\r\nAA\nTEST;\n",
),
array(
"<?php \$a = <<<TEST\nAA\nTEST;\n",
"<?php \$a = <<<TEST\r\nAA\nTEST;\n",
),
// T_ENCAPSED_AND_WHITESPACE
array(
"<?php \$a = <<<'TEST'\nAA 1\r\n \$b\nTEST;\n",
"<?php \$a = <<<'TEST'\r\nAA 1\r\n \$b\r\nTEST;\n",
),
array(
"<?php \$b = \" \$a \r\n 123\"; \$a = <<<TEST\nAA \r\n |\nTEST;\n",
"<?php \$b = \" \$a \r\n 123\"; \$a = <<<TEST\nAA \r\n |\r\nTEST;\n",
),
// !T_INLINE_HTML
array(
"<?php ?>\r\n<?php ?>\r\n",
),
// !T_CONSTANT_ENCAPSED_STRING
array(
"<?php \$a=\"a\r\n\";",
),
);
}
Expand Down

0 comments on commit 4c2da37

Please sign in to comment.