/** * {@inheritdoc} */ public function process(Tokens $tokens, Token $token, $index) { if (!$token->isComment()) { return; } $content = $token->getContent(); $trimmedContent = rtrim($content); // nothing trimmed, nothing to do if ($content === $trimmedContent) { return; } $whitespaces = substr($content, strlen($trimmedContent)); $token->setContent($trimmedContent); if (isset($tokens[$index + 1]) && $tokens[$index + 1]->isGivenKind(T_WHITESPACE)) { $tokens[$index + 1]->setContent($whitespaces . $tokens[$index + 1]->getContent()); } else { $tokens->insertAt($index + 1, new Token(array(T_WHITESPACE, $whitespaces))); } }
/** * Find a sequence of meaningful tokens and returns the array of their locations. * * @param array $sequence an array of tokens (same format used by getNextTokenOfKind) * @param int $start start index, defaulting to the start of the file * @param int $end end index, defaulting to the end of the file * @param bool|array $caseSensitive global case sensitiveness or an array of booleans, whose keys should match * the ones used in $others. If any is missing, the default case-sensitive * comparison is used. * * @return array|null an array containing the tokens matching the sequence elements, indexed by their position */ public function findSequence(array $sequence, $start = 0, $end = null, $caseSensitive = true) { // $end defaults to the end of the collection if (null === $end) { $end = count($this) - 1; } if (!count($sequence)) { throw new \InvalidArgumentException('Invalid sequence'); } // make sure the sequence content is "meaningful" foreach ($sequence as $key => $token) { // if not a Token instance already, we convert it to verify the meaningfulness if (!$token instanceof Token) { if (is_array($token) && !isset($token[1])) { // fake some content as it is required by the Token constructor, // although optional for search purposes $token[1] = ''; } $token = new Token($token); } if ($token->isWhitespace() || $token->isComment() || $token->isEmpty()) { throw new \InvalidArgumentException(sprintf('Non-meaningful token at position: %s', $key)); } } // remove the first token from the sequence, so we can freely iterate through the sequence after a match to // the first one is found $key = key($sequence); $firstCs = Token::isKeyCaseSensitive($caseSensitive, $key); $firstToken = $sequence[$key]; unset($sequence[$key]); // begin searching for the first token in the sequence (start included) $index = $start - 1; while (null !== $index && $index <= $end) { $index = $this->getNextTokenOfKind($index, array($firstToken), $firstCs); // ensure we found a match and didn't get past the end index if (null === $index || $index > $end) { return; } // initialise the result array with the current index $result = array($index => $this[$index]); // advance cursor to the current position $currIdx = $index; // iterate through the remaining tokens in the sequence foreach ($sequence as $key => $token) { $currIdx = $this->getNextMeaningfulToken($currIdx); // ensure we didn't go too far if (null === $currIdx || $currIdx > $end) { return; } if (!$this[$currIdx]->equals($token, Token::isKeyCaseSensitive($caseSensitive, $key))) { // not a match, restart the outer loop continue 2; } // append index to the result array $result[$currIdx] = $this[$currIdx]; } // do we have a complete match? // hint: $result is bigger than $sequence since the first token has been removed from the latter if (count($sequence) < count($result)) { return $result; } } }
public function findSequence(array $sequence, $start = 0, $end = null, $caseSensitive = true) { if (null === $end) { $end = count($this) - 1; } if (!count($sequence)) { throw new \InvalidArgumentException('Invalid sequence'); } foreach ($sequence as $key => $token) { if (!$token instanceof Token) { if (is_array($token) && !isset($token[1])) { $token[1] = ''; } $token = new Token($token); } if ($token->isWhitespace() || $token->isComment() || $token->isEmpty()) { throw new \InvalidArgumentException(sprintf('Non-meaningful token at position: %s', $key)); } } $key = key($sequence); $firstCs = Token::isKeyCaseSensitive($caseSensitive, $key); $firstToken = $sequence[$key]; unset($sequence[$key]); $index = $start - 1; while (null !== $index && $index <= $end) { $index = $this->getNextTokenOfKind($index, array($firstToken), $firstCs); if (null === $index || $index > $end) { return; } $result = array($index => $this[$index]); $currIdx = $index; foreach ($sequence as $key => $token) { $currIdx = $this->getNextMeaningfulToken($currIdx); if (null === $currIdx || $currIdx > $end) { return; } if (!$this[$currIdx]->equals($token, Token::isKeyCaseSensitive($caseSensitive, $key))) { continue 2; } $result[$currIdx] = $this[$currIdx]; } if (count($sequence) < count($result)) { return $result; } } }