61 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
		
		
			
		
	
	
			61 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| 
								 | 
							
								<?php declare(strict_types=1);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace PhpParser\Node\Expr;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								use PhpParser\Node\Arg;
							 | 
						||
| 
								 | 
							
								use PhpParser\Node\Expr;
							 | 
						||
| 
								 | 
							
								use PhpParser\Node\VariadicPlaceholder;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								abstract class CallLike extends Expr {
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * Return raw arguments, which may be actual Args, or VariadicPlaceholders for first-class
							 | 
						||
| 
								 | 
							
								     * callables.
							 | 
						||
| 
								 | 
							
								     *
							 | 
						||
| 
								 | 
							
								     * @return array<Arg|VariadicPlaceholder>
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    abstract public function getRawArgs(): array;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * Returns whether this call expression is actually a first class callable.
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public function isFirstClassCallable(): bool {
							 | 
						||
| 
								 | 
							
								        $rawArgs = $this->getRawArgs();
							 | 
						||
| 
								 | 
							
								        return count($rawArgs) === 1 && current($rawArgs) instanceof VariadicPlaceholder;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * Assert that this is not a first-class callable and return only ordinary Args.
							 | 
						||
| 
								 | 
							
								     *
							 | 
						||
| 
								 | 
							
								     * @return Arg[]
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public function getArgs(): array {
							 | 
						||
| 
								 | 
							
								        assert(!$this->isFirstClassCallable());
							 | 
						||
| 
								 | 
							
								        return $this->getRawArgs();
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * Retrieves a specific argument from the raw arguments.
							 | 
						||
| 
								 | 
							
								     *
							 | 
						||
| 
								 | 
							
								     * Returns the named argument that matches the given `$name`, or the
							 | 
						||
| 
								 | 
							
								     * positional (unnamed) argument that exists at the given `$position`,
							 | 
						||
| 
								 | 
							
								     * otherwise, returns `null` for first-class callables or if no match is found.
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public function getArg(string $name, int $position): ?Arg {
							 | 
						||
| 
								 | 
							
								        if ($this->isFirstClassCallable()) {
							 | 
						||
| 
								 | 
							
								            return null;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        foreach ($this->getRawArgs() as $i => $arg) {
							 | 
						||
| 
								 | 
							
								            if ($arg->unpack) {
							 | 
						||
| 
								 | 
							
								                continue;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            if (
							 | 
						||
| 
								 | 
							
								                ($arg->name !== null && $arg->name->toString() === $name)
							 | 
						||
| 
								 | 
							
								                || ($arg->name === null && $i === $position)
							 | 
						||
| 
								 | 
							
								            ) {
							 | 
						||
| 
								 | 
							
								                return $arg;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        return null;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 |