/** * @param Lexer $lexer * @return bool */ public function supports(Lexer $lexer) { if ($lexer->current() !== '(') { return false; } if ($lexer->key() > 0) { $whiteSpaceOrOpeningParenthesis = new MatchingIterator($lexer, '/\\s|\\(/', MatchingIterator::DIRECTION_DOWN); for ($i = 0, $j = 2; $i < $j; $i++) { if ($whiteSpaceOrOpeningParenthesis->valid() === false) { return false; } if ($whiteSpaceOrOpeningParenthesis->key() < $lexer->key() - $i) { return false; } $whiteSpaceOrOpeningParenthesis->next(); } } $key = $lexer->key() + 1; $commaFound = false; while ($nextToken = $lexer->peek($key)) { if ($nextToken === '(') { return false; } if ($nextToken === ',') { $commaFound = true; } if ($nextToken === ')') { return $commaFound; } $key++; } return false; }
public function testOtherSeekPosition() { $lexer = new Lexer(['/', '/', '*']); $lexer->seek(1); $iterator = new MatchingIterator($lexer, '/\\//'); $results = [1]; $index = 0; while ($iterator->valid()) { $this->assertEquals('/', $iterator->current()); $this->assertEquals($results[$index], $iterator->key()); $index++; $iterator->next(); } $this->assertEquals(1, iterator_count($iterator)); }