summaryrefslogtreecommitdiff
path: root/vendor/nikic/php-parser/lib/PhpParser/Parser/Multiple.php
diff options
context:
space:
mode:
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];
+ }
+}