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

transform() public method

Rewrites all "new" expressions with our implementation
public transform ( StreamMetaData $metadata = null ) : void | boolean
$metadata StreamMetaData Metadata for source
return void | boolean Return false if transformation should be stopped
    public function transform(StreamMetaData $metadata = null)
    {
        if (strpos($metadata->source, 'new ') === false) {
            return;
        }
        $tokenStream = token_get_all($metadata->source);
        $transformedSource = '';
        $isWaitingClass = false;
        $isWaitingEnd = false;
        $isClassName = true;
        $classNamePosition = 0;
        foreach ($tokenStream as $index => $token) {
            list($token, $tokenValue) = (array) $token + array(1 => $token);
            if ($isWaitingClass && $token !== T_WHITESPACE && $token !== T_COMMENT) {
                $classNamePosition++;
                if ($token === T_VARIABLE && $classNamePosition === 1) {
                    $isWaitingEnd = true;
                    $isWaitingClass = false;
                }
                if (in_array($tokenStream[$index + 1], array('(', ';', ')', '.'))) {
                    $isWaitingEnd = true;
                    $isWaitingClass = false;
                }
                if ($isClassName && $token !== T_NS_SEPARATOR && $token !== T_STRING && $token !== T_STATIC) {
                    $isClassName = false;
                }
            }
            if ($token === T_NEW) {
                $tokenValue = '\\' . __CLASS__ . '::getInstance()->{';
                $isWaitingClass = true;
                $isClassName = true;
                $classNamePosition = 0;
            }
            $transformedSource .= $tokenValue;
            if ($isWaitingEnd) {
                $transformedSource .= $isClassName ? '::class' : '';
                $transformedSource .= '}';
                $isWaitingEnd = false;
            }
        }
        $metadata->source = $transformedSource;
    }