summaryrefslogtreecommitdiff
path: root/vendor/nikic/php-parser/lib/PhpParser/Parser/Multiple.php
diff options
context:
space:
mode:
authorAndrew Dolgov <[email protected]>2022-03-22 12:24:31 +0300
committerAndrew Dolgov <[email protected]>2022-03-22 12:24:31 +0300
commit1c4f7ab3b838b23afb2ee4dab14acbf75956e952 (patch)
tree0a19274107d717efe92d2c0376cd3105fead5a11 /vendor/nikic/php-parser/lib/PhpParser/Parser/Multiple.php
parent711662948768492e8d05b778a7d80eacaec368d2 (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.php55
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];
+ }
+}