Phan\AST\ContextNode::analyzeBackwardCompatibility PHP Method

analyzeBackwardCompatibility() public method

Perform some backwards compatibility checks on a node
public analyzeBackwardCompatibility ( ) : void
return void
    public function analyzeBackwardCompatibility()
    {
        if (!Config::get()->backward_compatibility_checks) {
            return;
        }
        if (empty($this->node->children['expr'])) {
            return;
        }
        if ($this->node->kind === \ast\AST_STATIC_CALL || $this->node->kind === \ast\AST_METHOD_CALL) {
            return;
        }
        $llnode = $this->node;
        if ($this->node->kind !== \ast\AST_DIM) {
            if (!$this->node->children['expr'] instanceof Node) {
                return;
            }
            if ($this->node->children['expr']->kind !== \ast\AST_DIM) {
                (new ContextNode($this->code_base, $this->context, $this->node->children['expr']))->analyzeBackwardCompatibility();
                return;
            }
            $temp = $this->node->children['expr']->children['expr'];
            $llnode = $this->node->children['expr'];
            $lnode = $temp;
        } else {
            $temp = $this->node->children['expr'];
            $lnode = $temp;
        }
        if (!($temp->kind == \ast\AST_PROP || $temp->kind == \ast\AST_STATIC_PROP)) {
            return;
        }
        while ($temp instanceof Node && ($temp->kind == \ast\AST_PROP || $temp->kind == \ast\AST_STATIC_PROP)) {
            $llnode = $lnode;
            $lnode = $temp;
            // Lets just hope the 0th is the expression
            // we want
            $temp = array_values($temp->children)[0];
        }
        if (!$temp instanceof Node) {
            return;
        }
        // Foo::$bar['baz'](); is a problem
        // Foo::$bar['baz'] is not
        if ($lnode->kind === \ast\AST_STATIC_PROP && $this->node->kind !== \ast\AST_CALL) {
            return;
        }
        // $this->$bar['baz']; is a problem
        // $this->bar['baz'] is not
        if ($lnode->kind === \ast\AST_PROP && !$lnode->children['prop'] instanceof Node && !$llnode->children['prop'] instanceof Node) {
            return;
        }
        if (($lnode->children['prop'] instanceof Node && $lnode->children['prop']->kind == \ast\AST_VAR || !empty($lnode->children['class']) && $lnode->children['class'] instanceof Node && ($lnode->children['class']->kind == \ast\AST_VAR || $lnode->children['class']->kind == \ast\AST_NAME) || !empty($lnode->children['expr']) && $lnode->children['expr'] instanceof Node && ($lnode->children['expr']->kind == \ast\AST_VAR || $lnode->children['expr']->kind == \ast\AST_NAME)) && ($temp->kind == \ast\AST_VAR || $temp->kind == \ast\AST_NAME)) {
            $ftemp = new \SplFileObject($this->context->getFile());
            $ftemp->seek($this->node->lineno - 1);
            $line = $ftemp->current();
            unset($ftemp);
            if (strpos($line, '}[') === false || strpos($line, ']}') === false || strpos($line, '>{') === false) {
                Issue::maybeEmit($this->code_base, $this->context, Issue::CompatiblePHP7, $this->node->lineno ?? 0);
            }
        }
    }