1<?php declare(strict_types=1);
2
3namespace PhpParser\Node\Expr;
4
5use PhpParser\Node\Arg;
6use PhpParser\Node\Expr;
7use PhpParser\Node\VariadicPlaceholder;
8
9abstract class CallLike extends Expr {
10    /**
11     * Return raw arguments, which may be actual Args, or VariadicPlaceholders for first-class
12     * callables.
13     *
14     * @return array<Arg|VariadicPlaceholder>
15     */
16    abstract public function getRawArgs(): array;
17
18    /**
19     * Returns whether this call expression is actually a first class callable.
20     */
21    public function isFirstClassCallable(): bool {
22        $rawArgs = $this->getRawArgs();
23        return count($rawArgs) === 1 && current($rawArgs) instanceof VariadicPlaceholder;
24    }
25
26    /**
27     * Assert that this is not a first-class callable and return only ordinary Args.
28     *
29     * @return Arg[]
30     */
31    public function getArgs(): array {
32        assert(!$this->isFirstClassCallable());
33        return $this->getRawArgs();
34    }
35}
36