diff options
author | Andrew Dolgov <[email protected]> | 2022-03-22 12:24:31 +0300 |
---|---|---|
committer | Andrew Dolgov <[email protected]> | 2022-03-22 12:24:31 +0300 |
commit | 1c4f7ab3b838b23afb2ee4dab14acbf75956e952 (patch) | |
tree | 0a19274107d717efe92d2c0376cd3105fead5a11 /vendor/nikic/php-parser/lib/PhpParser/Parser/Multiple.php | |
parent | 711662948768492e8d05b778a7d80eacaec368d2 (diff) |
* add phpunit as a dev dependency
* add some basic tests for UrlHelper::rewrite_relative()
* fix UrlHelper::rewrite_relative() to work better on non-absolute
relative URL paths
Diffstat (limited to 'vendor/nikic/php-parser/lib/PhpParser/Parser/Multiple.php')
-rw-r--r-- | vendor/nikic/php-parser/lib/PhpParser/Parser/Multiple.php | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Parser/Multiple.php b/vendor/nikic/php-parser/lib/PhpParser/Parser/Multiple.php new file mode 100644 index 000000000..77fd1f3fb --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Parser/Multiple.php @@ -0,0 +1,55 @@ +<?php declare(strict_types=1); + +namespace PhpParser\Parser; + +use PhpParser\Error; +use PhpParser\ErrorHandler; +use PhpParser\Parser; + +class Multiple implements Parser +{ + /** @var Parser[] List of parsers to try, in order of preference */ + private $parsers; + + /** + * Create a parser which will try multiple parsers in an order of preference. + * + * Parsers will be invoked in the order they're provided to the constructor. If one of the + * parsers runs without throwing, it's output is returned. Otherwise the exception that the + * first parser generated is thrown. + * + * @param Parser[] $parsers + */ + public function __construct(array $parsers) { + $this->parsers = $parsers; + } + + public function parse(string $code, ErrorHandler $errorHandler = null) { + if (null === $errorHandler) { + $errorHandler = new ErrorHandler\Throwing; + } + + list($firstStmts, $firstError) = $this->tryParse($this->parsers[0], $errorHandler, $code); + if ($firstError === null) { + return $firstStmts; + } + + for ($i = 1, $c = count($this->parsers); $i < $c; ++$i) { + list($stmts, $error) = $this->tryParse($this->parsers[$i], $errorHandler, $code); + if ($error === null) { + return $stmts; + } + } + + throw $firstError; + } + + private function tryParse(Parser $parser, ErrorHandler $errorHandler, $code) { + $stmts = null; + $error = null; + try { + $stmts = $parser->parse($code, $errorHandler); + } catch (Error $error) {} + return [$stmts, $error]; + } +} |