bug #35364 [Yaml] Throw on unquoted exclamation mark (fancyweb)
This PR was merged into the 4.3 branch.
Discussion
----------
[Yaml] Throw on unquoted exclamation mark
| Q | A
| ------------- | ---
| Branch? | 4.3
| Bug fix? | yes
| New feature? | no
| Deprecations? |
| Tickets | https://github.com/symfony/symfony/issues/35344
| License | MIT
| Doc PR | -
Commits
-------
6b4147c991
[Yaml] Throw on unquoted exclamation mark
This commit is contained in:
commit
79d9bdac35
|
@ -674,6 +674,10 @@ class Inline
|
|||
$nextOffset = $i + $tagLength + 1;
|
||||
$nextOffset += strspn($value, ' ', $nextOffset);
|
||||
|
||||
if ('' === $tag && (!isset($value[$nextOffset]) || \in_array($value[$nextOffset], [']', '}', ','], true))) {
|
||||
throw new ParseException(sprintf('Using the unquoted scalar value "!" is not supported. You must quote it.', $value), self::$parsedLineNumber + 1, $value, self::$parsedFilename);
|
||||
}
|
||||
|
||||
// Is followed by a scalar and is a built-in tag
|
||||
if ('' !== $tag && (!isset($value[$nextOffset]) || !\in_array($value[$nextOffset], ['[', '{'], true)) && ('!' === $tag[0] || 'str' === $tag || 'php/const' === $tag || 'php/object' === $tag)) {
|
||||
// Manage in {@link self::evaluateScalar()}
|
||||
|
|
|
@ -737,4 +737,69 @@ class InlineTest extends TestCase
|
|||
'negative octal number' => [-28, '-034'],
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider unquotedExclamationMarkThrowsProvider
|
||||
*/
|
||||
public function testUnquotedExclamationMarkThrows(string $value)
|
||||
{
|
||||
$this->expectException(ParseException::class);
|
||||
$this->expectExceptionMessageRegExp('/^Using the unquoted scalar value "!" is not supported\. You must quote it at line 1 \(near "/');
|
||||
|
||||
Inline::parse($value);
|
||||
}
|
||||
|
||||
public function unquotedExclamationMarkThrowsProvider()
|
||||
{
|
||||
return [
|
||||
['!'],
|
||||
['! '],
|
||||
['! '],
|
||||
[' ! '],
|
||||
['[!]'],
|
||||
['[! ]'],
|
||||
['[! ]'],
|
||||
['[!, "foo"]'],
|
||||
['["foo", !, "ccc"]'],
|
||||
['{foo: !}'],
|
||||
['{foo: !}'],
|
||||
['{foo: !, bar: "ccc"}'],
|
||||
['{bar: "ccc", foo: ! }'],
|
||||
['!]]]'],
|
||||
['!}'],
|
||||
['!,}foo,]'],
|
||||
['! [!]'],
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider quotedExclamationMarkProvider
|
||||
*/
|
||||
public function testQuotedExclamationMark($expected, string $value)
|
||||
{
|
||||
$this->assertSame($expected, Inline::parse($value));
|
||||
}
|
||||
|
||||
// This provider should stay consistent with unquotedExclamationMarkThrowsProvider
|
||||
public function quotedExclamationMarkProvider()
|
||||
{
|
||||
return [
|
||||
['!', '"!"'],
|
||||
['! ', '"! "'],
|
||||
[' !', '" !"'],
|
||||
[' ! ', '" ! "'],
|
||||
[['!'], '["!"]'],
|
||||
[['! '], '["! "]'],
|
||||
[['!', 'foo'], '["!", "foo"]'],
|
||||
[['foo', '!', 'ccc'], '["foo", "!", "ccc"]'],
|
||||
[['foo' => '!'], '{foo: "!"}'],
|
||||
[['foo' => ' !'], '{foo: " !"}'],
|
||||
[['foo' => '!', 'bar' => 'ccc'], '{foo: "!", bar: "ccc"}'],
|
||||
[['bar' => 'ccc', 'foo' => '! '], '{bar: "ccc", foo: "! "}'],
|
||||
['!]]]', '"!]]]"'],
|
||||
['!}', '"!}"'],
|
||||
['!,}foo,]', '"!,}foo,]"'],
|
||||
[['!'], '! ["!"]'],
|
||||
];
|
||||
}
|
||||
}
|
||||
|
|
Reference in New Issue