* Dariusz RumiƄski * * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace PhpCsFixer\Fixer\StringNotation; use PhpCsFixer\AbstractFixer; use PhpCsFixer\FixerDefinition\CodeSample; use PhpCsFixer\FixerDefinition\FixerDefinition; use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; use PhpCsFixer\Tokenizer\CT; use PhpCsFixer\Tokenizer\Token; use PhpCsFixer\Tokenizer\Tokens; /** * @author Dave van der Brugge */ final class SimpleToComplexStringVariableFixer extends AbstractFixer { public function getDefinition(): FixerDefinitionInterface { return new FixerDefinition( 'Converts explicit variables in double-quoted strings and heredoc syntax from simple to complex format (`${` to `{$`).', [ new CodeSample( <<<'EOT' isTokenKindFound(T_DOLLAR_OPEN_CURLY_BRACES); } protected function applyFix(\SplFileInfo $file, Tokens $tokens): void { for ($index = \count($tokens) - 3; $index > 0; --$index) { $token = $tokens[$index]; if (!$token->isGivenKind(T_DOLLAR_OPEN_CURLY_BRACES)) { continue; } $varnameToken = $tokens[$index + 1]; if (!$varnameToken->isGivenKind(T_STRING_VARNAME)) { continue; } $dollarCloseToken = $tokens[$index + 2]; if (!$dollarCloseToken->isGivenKind(CT::T_DOLLAR_CLOSE_CURLY_BRACES)) { continue; } $tokenOfStringBeforeToken = $tokens[$index - 1]; $stringContent = $tokenOfStringBeforeToken->getContent(); if (str_ends_with($stringContent, '$') && !str_ends_with($stringContent, '\\$')) { $newContent = substr($stringContent, 0, -1).'\\$'; $tokenOfStringBeforeToken = new Token([T_ENCAPSED_AND_WHITESPACE, $newContent]); } $tokens->overrideRange($index - 1, $index + 2, [ $tokenOfStringBeforeToken, new Token([T_CURLY_OPEN, '{']), new Token([T_VARIABLE, '$'.$varnameToken->getContent()]), new Token([CT::T_CURLY_CLOSE, '}']), ]); } } }