public function transform(StreamMetaData $metadata)
{
if (strpos($metadata->source, 'include') === false && strpos($metadata->source, 'require') === false) {
return;
}
static $lookFor = array(T_INCLUDE => true, T_INCLUDE_ONCE => true, T_REQUIRE => true, T_REQUIRE_ONCE => true);
$tokenStream = token_get_all($metadata->source);
$transformedSource = '';
$isWaitingEnd = false;
$insideBracesCount = 0;
$isBracesFinished = false;
$isTernaryOperator = false;
foreach ($tokenStream as $token) {
if ($isWaitingEnd && $token === '(') {
if ($isWaitingEnd) {
$insideBracesCount++;
}
} elseif ($isWaitingEnd && $token === ')') {
if ($insideBracesCount > 0) {
$insideBracesCount--;
} else {
$isBracesFinished = true;
}
}
$lastBrace = $isBracesFinished && $token === ')';
if ($isWaitingEnd && $token === '?') {
$isTernaryOperator = true;
}
if ($isTernaryOperator && ($token === ';' || $lastBrace)) {
$isTernaryOperator = false;
}
if ($isWaitingEnd && !$isTernaryOperator && $insideBracesCount == 0 && ($token === ';' || $token === ',' || $token === ':' || $lastBrace)) {
$isWaitingEnd = false;
$transformedSource .= ', __DIR__)';
}
list($token, $value) = (array) $token + array(1 => $token);
$transformedSource .= $value;
if (!$isWaitingEnd && isset($lookFor[$token])) {
$isWaitingEnd = true;
$isBracesFinished = $isTernaryOperator = false;
$transformedSource .= ' \\' . __CLASS__ . '::rewrite(';
}
}
$metadata->source = $transformedSource;
}