Skip to content

Commit

Permalink
bug #36683 [Yaml] fix parse error when unindented collections contain…
Browse files Browse the repository at this point in the history
… a comment (wdiesveld)

This PR was squashed before being merged into the 3.4 branch.

Discussion
----------

[Yaml] fix parse error when unindented collections contain a comment

| Q             | A
| ------------- | ---
| Branch?       | 5.0
| Bug fix?      | yes
| New feature?  | no
| Deprecations? | no
| Tickets       | Fix #36558
| License       | MIT

### Problem
The method `Parser::getNextEmbedBlock` did not determine the yaml-block correctly when there was a comment before the first unindented collection item. This was caused by the fact that the check for unindented collection items was done for the _first line of the block only_. So in case this first line is a comment, this check will result in _false_, while in fact the parser is in an unindented collection.

### Solution
In the solution I implemented the parser will check for comment lines as well. As long as the loop encounters a comment line, it will check (in the next iteration) whether the line is an unindented collection item. So this check will be done until all comments before the first uncommented item are parsed.

Commits
-------

58bb2c5 [Yaml] fix parse error when unindented collections contain a comment
  • Loading branch information
fabpot committed May 4, 2020
2 parents 469d82d + 58bb2c5 commit bb77914
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 0 deletions.
6 changes: 6 additions & 0 deletions src/Symfony/Component/Yaml/Parser.php
Expand Up @@ -619,8 +619,14 @@ private function getNextEmbedBlock($indentation = null, $inSequence = false)
}

$isItUnindentedCollection = $this->isStringUnIndentedCollectionItem();
$isItComment = $this->isCurrentLineComment();

while ($this->moveToNextLine()) {
if ($isItComment && !$isItUnindentedCollection) {
$isItUnindentedCollection = $this->isStringUnIndentedCollectionItem();
$isItComment = $this->isCurrentLineComment();
}

$indent = $this->getCurrentLineIndentation();

if ($isItUnindentedCollection && !$this->isCurrentLineEmpty() && !$this->isStringUnIndentedCollectionItem() && $newIndent === $indent) {
Expand Down
14 changes: 14 additions & 0 deletions src/Symfony/Component/Yaml/Tests/Fixtures/sfComments.yml
Expand Up @@ -74,3 +74,17 @@ yaml: |
'foo #': baz
php: |
['foo #' => 'baz']
---
test: Comment before first item in unindented collection
brief: >
Comment directly before unindented collection is allowed
yaml: |
collection1:
# comment
- a
- b
collection2:
- a
- b
php: |
['collection1' => ['a', 'b'], 'collection2' => ['a', 'b']]

0 comments on commit bb77914

Please sign in to comment.