/** * {@inheritdoc} */ public function fix(\SplFileInfo $file, Tokens $tokensOrg) { $content = $tokensOrg->generateCode(); // replace all <? with <?php to replace all short open tags even without short_open_tag option enabled $newContent = preg_replace('/<\\?(\\s|$)/', '<?php$1', $content, -1, $count); if (!$count) { return; } /* the following code is magic to revert previous replacements which should NOT be replaced, for example incorrectly replacing * > echo '<? '; * with * > echo '<?php '; */ $tokens = Tokens::fromCode($newContent); $tokensOldContent = ''; $tokensOldContentLength = 0; foreach ($tokens as $token) { if ($token->isGivenKind(T_OPEN_TAG)) { $tokenContent = $token->getContent(); if ('<?php' !== substr($content, $tokensOldContentLength, 5)) { $tokenContent = '<? '; } $tokensOldContent .= $tokenContent; $tokensOldContentLength += strlen($tokenContent); continue; } if ($token->isGivenKind(array(T_COMMENT, T_DOC_COMMENT, T_CONSTANT_ENCAPSED_STRING, T_ENCAPSED_AND_WHITESPACE, T_STRING))) { $tokenContent = ''; $tokenContentLength = 0; $parts = explode('<?php', $token->getContent()); $iLast = count($parts) - 1; foreach ($parts as $i => $part) { $tokenContent .= $part; $tokenContentLength += strlen($part); if ($i !== $iLast) { if ('<?php' === substr($content, $tokensOldContentLength + $tokenContentLength, 5)) { $tokenContent .= '<?php'; $tokenContentLength += 5; } else { $tokenContent .= '<?'; $tokenContentLength += 2; } } } $token->setContent($tokenContent); } $tokensOldContent .= $token->getContent(); $tokensOldContentLength += strlen($token->getContent()); } $tokensOrg->overrideRange(0, $tokensOrg->count() - 1, $tokens); }
/** * Apply token attributes. * * Token at given index is prepended by attributes. * * @param Tokens $tokens Tokens collection * @param int $memberIndex token index * @param array $attribs map of grabbed attributes, key is attribute name and value is array of index and clone of Token */ private function overrideAttribs(Tokens $tokens, $memberIndex, array $attribs) { $toOverride = array(); $firstAttribIndex = $memberIndex; foreach ($attribs as $attrib) { if (null === $attrib) { continue; } if (null !== $attrib['index']) { $firstAttribIndex = min($firstAttribIndex, $attrib['index']); } if (!$attrib['token']->isGivenKind(T_VAR) && '' !== $attrib['token']->getContent()) { $toOverride[] = $attrib['token']; $toOverride[] = new Token(array(T_WHITESPACE, ' ')); } } if (!empty($toOverride)) { $tokens->overrideRange($firstAttribIndex, $memberIndex - 1, $toOverride); } }