Go\Instrument\Transformer\FilterInjectorTransformer::transform PHP Method

transform() public method

Wrap all includes into rewrite filter
public transform ( StreamMetaData $metadata ) : void | boolean
$metadata StreamMetaData Metadata for source
return void | boolean Return false if transformation should be stopped
    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;
    }

Usage Example

 public function testCanTransformWithBraces()
 {
     $this->metadata->source = file_get_contents(__DIR__ . '/_files/yii_style.php');
     self::$transformer->transform($this->metadata);
     $this->assertEquals(file_get_contents(__DIR__ . '/_files/yii_style_output.php'), $this->metadata->source);
 }