Mercurial > hg > cmmr2012-drupal-site
diff vendor/symfony/yaml/Parser.php @ 4:a9cd425dd02b
Update, including to Drupal core 8.6.10
author | Chris Cannam |
---|---|
date | Thu, 28 Feb 2019 13:11:55 +0000 |
parents | c75dbcec494b |
children | 12f9dff5fda9 |
line wrap: on
line diff
--- a/vendor/symfony/yaml/Parser.php Thu Feb 28 11:14:44 2019 +0000 +++ b/vendor/symfony/yaml/Parser.php Thu Feb 28 13:11:55 2019 +0000 @@ -29,23 +29,24 @@ private $filename; private $offset = 0; private $totalNumberOfLines; - private $lines = array(); + private $lines = []; private $currentLineNb = -1; private $currentLine = ''; - private $refs = array(); - private $skippedLineNumbers = array(); - private $locallySkippedLineNumbers = array(); + private $refs = []; + private $skippedLineNumbers = []; + private $locallySkippedLineNumbers = []; + private $refsBeingParsed = []; public function __construct() { - if (func_num_args() > 0) { + if (\func_num_args() > 0) { @trigger_error(sprintf('The constructor arguments $offset, $totalNumberOfLines, $skippedLineNumbers of %s are deprecated and will be removed in 4.0', self::class), E_USER_DEPRECATED); $this->offset = func_get_arg(0); - if (func_num_args() > 1) { + if (\func_num_args() > 1) { $this->totalNumberOfLines = func_get_arg(1); } - if (func_num_args() > 2) { + if (\func_num_args() > 2) { $this->skippedLineNumbers = func_get_arg(2); } } @@ -92,7 +93,7 @@ */ public function parse($value, $flags = 0) { - if (is_bool($flags)) { + if (\is_bool($flags)) { @trigger_error('Passing a boolean flag to toggle exception handling is deprecated since Symfony 3.1 and will be removed in 4.0. Use the Yaml::PARSE_EXCEPTION_ON_INVALID_TYPE flag instead.', E_USER_DEPRECATED); if ($flags) { @@ -102,7 +103,7 @@ } } - if (func_num_args() >= 3) { + if (\func_num_args() >= 3) { @trigger_error('Passing a boolean flag to toggle object support is deprecated since Symfony 3.1 and will be removed in 4.0. Use the Yaml::PARSE_OBJECT flag instead.', E_USER_DEPRECATED); if (func_get_arg(2)) { @@ -110,7 +111,7 @@ } } - if (func_num_args() >= 4) { + if (\func_num_args() >= 4) { @trigger_error('Passing a boolean flag to toggle object for map support is deprecated since Symfony 3.1 and will be removed in 4.0. Use the Yaml::PARSE_OBJECT_FOR_MAP flag instead.', E_USER_DEPRECATED); if (func_get_arg(3)) { @@ -126,7 +127,7 @@ throw new ParseException('The YAML value does not appear to be valid UTF-8.', -1, null, $this->filename); } - $this->refs = array(); + $this->refs = []; $mbEncoding = null; $e = null; @@ -147,11 +148,11 @@ mb_internal_encoding($mbEncoding); } - $this->lines = array(); + $this->lines = []; $this->currentLine = ''; - $this->refs = array(); - $this->skippedLineNumbers = array(); - $this->locallySkippedLineNumbers = array(); + $this->refs = []; + $this->skippedLineNumbers = []; + $this->locallySkippedLineNumbers = []; if (null !== $e) { throw $e; @@ -166,17 +167,17 @@ $this->currentLine = ''; $value = $this->cleanup($value); $this->lines = explode("\n", $value); - $this->locallySkippedLineNumbers = array(); + $this->locallySkippedLineNumbers = []; if (null === $this->totalNumberOfLines) { - $this->totalNumberOfLines = count($this->lines); + $this->totalNumberOfLines = \count($this->lines); } if (!$this->moveToNextLine()) { return null; } - $data = array(); + $data = []; $context = null; $allowOverwrite = false; @@ -212,6 +213,7 @@ if (isset($values['value']) && self::preg_match('#^&(?P<ref>[^ ]+) *(?P<value>.*)#u', $values['value'], $matches)) { $isRef = $matches['ref']; + $this->refsBeingParsed[] = $isRef; $values['value'] = $matches['value']; } @@ -234,7 +236,7 @@ // this is a compact notation element, add to next block and parse $block = $values['value']; if ($this->isNextLineIndented()) { - $block .= "\n".$this->getNextEmbedBlock($this->getCurrentLineIndentation() + strlen($values['leadspaces']) + 1); + $block .= "\n".$this->getNextEmbedBlock($this->getCurrentLineIndentation() + \strlen($values['leadspaces']) + 1); } $data[] = $this->parseBlock($this->getRealCurrentLineNb(), $block, $flags); @@ -244,10 +246,11 @@ } if ($isRef) { $this->refs[$isRef] = end($data); + array_pop($this->refsBeingParsed); } } elseif ( self::preg_match('#^(?P<key>(?:![^\s]++\s++)?(?:'.Inline::REGEX_QUOTED_STRING.'|(?:!?!php/const:)?[^ \'"\[\{!].*?)) *\:(\s++(?P<value>.+))?$#u', rtrim($this->currentLine), $values) - && (false === strpos($values['key'], ' #') || in_array($values['key'][0], array('"', "'"))) + && (false === strpos($values['key'], ' #') || \in_array($values['key'][0], ['"', "'"])) ) { if ($context && 'sequence' == $context) { throw new ParseException('You cannot define a mapping item when in a sequence', $this->currentLineNb + 1, $this->currentLine, $this->filename); @@ -271,13 +274,13 @@ throw $e; } - if (!is_string($key) && !is_int($key)) { + if (!\is_string($key) && !\is_int($key)) { $keyType = is_numeric($key) ? 'numeric key' : 'non-string key'; @trigger_error($this->getDeprecationMessage(sprintf('Implicit casting of %s to string is deprecated since Symfony 3.3 and will throw \Symfony\Component\Yaml\Exception\ParseException in 4.0. Quote your evaluable mapping keys instead.', $keyType)), E_USER_DEPRECATED); } // Convert float keys to strings, to avoid being converted to integers by PHP - if (is_float($key)) { + if (\is_float($key)) { $key = (string) $key; } @@ -287,6 +290,10 @@ if (isset($values['value'][0]) && '*' === $values['value'][0]) { $refName = substr(rtrim($values['value']), 1); if (!array_key_exists($refName, $this->refs)) { + if (false !== $pos = array_search($refName, $this->refsBeingParsed, true)) { + throw new ParseException(sprintf('Circular reference [%s, %s] detected for reference "%s".', implode(', ', \array_slice($this->refsBeingParsed, $pos)), $refName, $refName), $this->currentLineNb + 1, $this->currentLine, $this->filename); + } + throw new ParseException(sprintf('Reference "%s" does not exist.', $refName), $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename); } @@ -296,7 +303,7 @@ $refValue = (array) $refValue; } - if (!is_array($refValue)) { + if (!\is_array($refValue)) { throw new ParseException('YAML merge keys used with a scalar value instead of an array.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename); } @@ -313,7 +320,7 @@ $parsed = (array) $parsed; } - if (!is_array($parsed)) { + if (!\is_array($parsed)) { throw new ParseException('YAML merge keys used with a scalar value instead of an array.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename); } @@ -326,7 +333,7 @@ $parsedItem = (array) $parsedItem; } - if (!is_array($parsedItem)) { + if (!\is_array($parsedItem)) { throw new ParseException('Merge items must be arrays.', $this->getRealCurrentLineNb() + 1, $parsedItem, $this->filename); } @@ -340,6 +347,7 @@ } } elseif ('<<' !== $key && isset($values['value']) && self::preg_match('#^&(?P<ref>[^ ]++) *+(?P<value>.*)#u', $values['value'], $matches)) { $isRef = $matches['ref']; + $this->refsBeingParsed[] = $isRef; $values['value'] = $matches['value']; } @@ -395,6 +403,7 @@ } if ($isRef) { $this->refs[$isRef] = $data[$key]; + array_pop($this->refsBeingParsed); } } else { // multiple documents are not supported @@ -407,7 +416,7 @@ } // 1-liner optionally followed by newline(s) - if (is_string($value) && $this->lines[0] === trim($value)) { + if (\is_string($value) && $this->lines[0] === trim($value)) { try { $value = Inline::parse($this->lines[0], $flags, $this->refs); } catch (ParseException $e) { @@ -470,7 +479,7 @@ $data = new TaggedValue($tag, $data); } - if (Yaml::PARSE_OBJECT_FOR_MAP & $flags && !is_object($data) && 'mapping' === $context) { + if (Yaml::PARSE_OBJECT_FOR_MAP & $flags && !\is_object($data) && 'mapping' === $context) { $object = new \stdClass(); foreach ($data as $key => $value) { @@ -500,6 +509,7 @@ $parser->totalNumberOfLines = $this->totalNumberOfLines; $parser->skippedLineNumbers = $skippedLineNumbers; $parser->refs = &$this->refs; + $parser->refsBeingParsed = $this->refsBeingParsed; return $parser->doParse($yaml, $flags); } @@ -533,7 +543,7 @@ */ private function getCurrentLineIndentation() { - return strlen($this->currentLine) - strlen(ltrim($this->currentLine, ' ')); + return \strlen($this->currentLine) - \strlen(ltrim($this->currentLine, ' ')); } /** @@ -549,11 +559,6 @@ private function getNextEmbedBlock($indentation = null, $inSequence = false) { $oldLineIndentation = $this->getCurrentLineIndentation(); - $blockScalarIndentations = array(); - - if ($this->isBlockScalarHeader()) { - $blockScalarIndentations[] = $oldLineIndentation; - } if (!$this->moveToNextLine()) { return; @@ -591,7 +596,7 @@ $newIndent = $indentation; } - $data = array(); + $data = []; if ($this->getCurrentLineIndentation() >= $newIndent) { $data[] = substr($this->currentLine, $newIndent); } elseif ($this->isCurrentLineEmpty() || $this->isCurrentLineComment()) { @@ -612,30 +617,9 @@ $isItUnindentedCollection = $this->isStringUnIndentedCollectionItem(); - if (empty($blockScalarIndentations) && $this->isBlockScalarHeader()) { - $blockScalarIndentations[] = $this->getCurrentLineIndentation(); - } - - $previousLineIndentation = $this->getCurrentLineIndentation(); - while ($this->moveToNextLine()) { $indent = $this->getCurrentLineIndentation(); - // terminate all block scalars that are more indented than the current line - if (!empty($blockScalarIndentations) && $indent < $previousLineIndentation && '' !== trim($this->currentLine)) { - foreach ($blockScalarIndentations as $key => $blockScalarIndentation) { - if ($blockScalarIndentation >= $indent) { - unset($blockScalarIndentations[$key]); - } - } - } - - if (empty($blockScalarIndentations) && !$this->isCurrentLineComment() && $this->isBlockScalarHeader()) { - $blockScalarIndentations[] = $indent; - } - - $previousLineIndentation = $indent; - if ($isItUnindentedCollection && !$this->isCurrentLineEmpty() && !$this->isStringUnIndentedCollectionItem() && $newIndent === $indent) { $this->moveToPreviousLine(); break; @@ -669,7 +653,7 @@ */ private function moveToNextLine() { - if ($this->currentLineNb >= count($this->lines) - 1) { + if ($this->currentLineNb >= \count($this->lines) - 1) { return false; } @@ -715,6 +699,10 @@ } if (!array_key_exists($value, $this->refs)) { + if (false !== $pos = array_search($value, $this->refsBeingParsed, true)) { + throw new ParseException(sprintf('Circular reference [%s, %s] detected for reference "%s".', implode(', ', \array_slice($this->refsBeingParsed, $pos)), $value, $value), $this->currentLineNb + 1, $this->currentLine, $this->filename); + } + throw new ParseException(sprintf('Reference "%s" does not exist.', $value), $this->currentLineNb + 1, $this->currentLine, $this->filename); } @@ -747,7 +735,7 @@ return Inline::parse($value, $flags, $this->refs); } - $lines = array(); + $lines = []; while ($this->moveToNextLine()) { // unquoted strings end before the first unindented line @@ -765,7 +753,7 @@ } } - for ($i = 0, $linesCount = count($lines), $previousLineBlank = false; $i < $linesCount; ++$i) { + for ($i = 0, $linesCount = \count($lines), $previousLineBlank = false; $i < $linesCount; ++$i) { if ('' === $lines[$i]) { $value .= "\n"; $previousLineBlank = true; @@ -782,7 +770,7 @@ $parsedValue = Inline::parse($value, $flags, $this->refs); - if ('mapping' === $context && is_string($parsedValue) && '"' !== $value[0] && "'" !== $value[0] && '[' !== $value[0] && '{' !== $value[0] && '!' !== $value[0] && false !== strpos($parsedValue, ': ')) { + if ('mapping' === $context && \is_string($parsedValue) && '"' !== $value[0] && "'" !== $value[0] && '[' !== $value[0] && '{' !== $value[0] && '!' !== $value[0] && false !== strpos($parsedValue, ': ')) { throw new ParseException('A colon cannot be used in an unquoted mapping value.', $this->getRealCurrentLineNb() + 1, $value, $this->filename); } @@ -812,7 +800,7 @@ } $isCurrentLineBlank = $this->isCurrentLineBlank(); - $blockLines = array(); + $blockLines = []; // leading blank lines are consumed before determining indentation while ($notEOF && $isCurrentLineBlank) { @@ -826,7 +814,7 @@ // determine indentation if not specified if (0 === $indentation) { if (self::preg_match('/^ +/', $this->currentLine, $matches)) { - $indentation = strlen($matches[0]); + $indentation = \strlen($matches[0]); } } @@ -839,7 +827,7 @@ self::preg_match($pattern, $this->currentLine, $matches) ) ) { - if ($isCurrentLineBlank && strlen($this->currentLine) > $indentation) { + if ($isCurrentLineBlank && \strlen($this->currentLine) > $indentation) { $blockLines[] = substr($this->currentLine, $indentation); } elseif ($isCurrentLineBlank) { $blockLines[] = ''; @@ -869,7 +857,7 @@ $previousLineIndented = false; $previousLineBlank = false; - for ($i = 0, $blockLinesCount = count($blockLines); $i < $blockLinesCount; ++$i) { + for ($i = 0, $blockLinesCount = \count($blockLines); $i < $blockLinesCount; ++$i) { if ('' === $blockLines[$i]) { $text .= "\n"; $previousLineIndented = false; @@ -984,7 +972,7 @@ */ private function cleanup($value) { - $value = str_replace(array("\r\n", "\r"), "\n", $value); + $value = str_replace(["\r\n", "\r"], "\n", $value); // strip YAML header $count = 0; @@ -1055,16 +1043,6 @@ } /** - * Tests whether or not the current line is the header of a block scalar. - * - * @return bool - */ - private function isBlockScalarHeader() - { - return (bool) self::preg_match('~'.self::BLOCK_SCALAR_HEADER_PATTERN.'$~', $this->currentLine); - } - - /** * A local wrapper for `preg_match` which will throw a ParseException if there * is an internal error in the PCRE engine. *