0
 ?÷     -se;
                return NodeTraverser::STOP_TRAVERSAL;
            }
            // skip integer in possibly string type as string can be accessed via int
            $dimType = $this->getType($node->dim);
            if ($dimType->isInteger()->yes() && $variableType->isString()->maybe()) {
                return null;
            }
            $isParamAccessedArrayDimFetch = \true;
            return null;
        });
        return $isParamAccessedArrayDimFetch;
    }
    private function isEchoed(Node $node, string $paramName) : bool
    {
        if (!$node instanceof Echo_) {
            return \false;
        }
        foreach ($node->exprs as $expr) {
            if ($expr instanceof Variable && $this->isName($expr, $paramName)) {
                return \true;
            }
        }
        return \false;
    }
    private function shouldStop(Node $node, Param $param, string $paramName) : bool
    {
        $nodeToCheck = null;
        if (!$param->default instanceof Expr) {
            if ($node instanceof Isset_) {
                foreach ($node->vars as $var) {
                    if ($var instanceof ArrayDimFetch && $var->var instanceof Variable && $var->var->name === $paramName) {
                        return \true;
                    }
                }
            }
            if ($node instanceof Empty_ && $node->expr instanceof ArrayDimFetch && $node->expr->var instanceof Variable && $node->expr->var->name === $paramName) {
                return \true;
            }
        }
        if ($node instanceof FuncCall && !$node->isFirstClassCallable() && $this->isNames($node, ['is_array', 'is_string', 'is_int', 'is_bool', 'is_float'])) {
            $firstArg = $node->getArgs()[0];
            $nodeToCheck = $firstArg->value;
        }
        if ($node instanceof Expression) {
            $nodeToCheck = $node->expr;
        }
        if ($node instanceof Coalesce) {
            $nodeToCheck = $node->left;
        }
        if ($node instanceof AssignOpCoalesce) {
            $nodeToCheck = $node->var;
        }
        if ($this->isMethodCallOrArrayDimFetch($paramName, $nodeToCheck)) {
            return \true;
        }
        if ($nodeToCheck instanceof Variable && $this->isName($nodeToCheck, $paramName)) {
            return \true;
        }
        if ($this->isEmptyOrEchoedOrCasted($node, $paramName)) {
            return \true;
        }
        return $this->isReassignAndUseAsArg($node, $paramName);
    }
    private function isReassignAndUseAsArg(Node $node, string $paramName) : bool
    {
        if (!$node instanceof Assign) {
            return \false;
        }
        if (!$node->var instanceof Variable) {
            return \false;
        }
        if (!$this->isName($node->var, $paramName)) {
            return \false;
        }
        if (!$node->expr instanceof CallLike) {
            return \false;
        }
        if ($node->expr->isFirstClassCallable()) {
            return \false;
        }
        foreach ($node->expr->getArgs() as $arg) {
            if ($arg->value instanceof Variable && $this->isName($arg->value, $paramName)) {
                return \true;
            }
        }
        return \false;
    }
    private function isEmptyOrEchoedOrCasted(Node $node, string $paramName) : bool
    {
        if ($node instanceof Empty_ && $node->expr instanceof Variable && $this->isName($node->expr, $paramName)) {
            return \true;
        }
        if ($this->isEchoed($node, $paramName)) {
            return \true;
        }
        return $node instanceof Array_ && $node->expr instanceof Variable && $this->isName($node->expr, $paramName);
    }
    private function isMethodCallOrArrayDimFetch(string $paramName, ?Node $node) : bool
    {
        if ($node instanceof MethodCall) {
            return $node->var instanceof Variable && $this->isName($node->var, $paramName);
        }
        if ($node instanceof ArrayDimFetch) {
            return $node->var instanceof Variable && $this->isName($node->var, $paramName);
        }
        return \false;
    }
}
