diff --git a/CHANGELOG.md b/CHANGELOG.md index 1a112f12..a664d4b1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,8 +5,8 @@ CHANGELOG ----- * Mappings with a colon (`:`) that is not followed by a whitespace are deprecated - and will lead to a `ParseException` in Symfony 4.0 (e.g. `foo:bar` must be - `foo: bar`). + when the mapping key is not quoted and will lead to a `ParseException` in + Symfony 4.0 (e.g. `foo:bar` must be `foo: bar`). * Added support for parsing PHP constants: diff --git a/Inline.php b/Inline.php index b5136b3a..e9a5955b 100644 --- a/Inline.php +++ b/Inline.php @@ -461,14 +461,15 @@ private static function parseMapping($mapping, $flags, &$i = 0, $references = ar } // key + $isKeyQuoted = in_array($mapping[$i], array('"', "'"), true); $key = self::parseScalar($mapping, $flags, array(':', ' '), array('"', "'"), $i, false); if (':' !== $key && false === $i = strpos($mapping, ':', $i)) { break; } - if (':' !== $key && (!isset($mapping[$i + 1]) || !in_array($mapping[$i + 1], array(' ', ',', '[', ']', '{', '}'), true))) { - @trigger_error('Using a colon that is not followed by an indication character (i.e. " ", ",", "[", "]", "{", "}" is deprecated since version 3.2 and will throw a ParseException in 4.0.', E_USER_DEPRECATED); + if (':' !== $key && !$isKeyQuoted && (!isset($mapping[$i + 1]) || !in_array($mapping[$i + 1], array(' ', ',', '[', ']', '{', '}'), true))) { + @trigger_error('Using a colon after an unquoted mapping key that is not followed by an indication character (i.e. " ", ",", "[", "]", "{", "}") is deprecated since version 3.2 and will throw a ParseException in 4.0.', E_USER_DEPRECATED); } // value diff --git a/Tests/InlineTest.php b/Tests/InlineTest.php index bfa13e09..09175a68 100644 --- a/Tests/InlineTest.php +++ b/Tests/InlineTest.php @@ -168,7 +168,7 @@ public function testParseInvalidMappingKeyShouldThrowException() /** * @group legacy - * @expectedDeprecation Using a colon that is not followed by an indication character (i.e. " ", ",", "[", "]", "{", "}" is deprecated since version 3.2 and will throw a ParseException in 4.0. + * @expectedDeprecation Using a colon after an unquoted mapping key that is not followed by an indication character (i.e. " ", ",", "[", "]", "{", "}") is deprecated since version 3.2 and will throw a ParseException in 4.0. * throws \Symfony\Component\Yaml\Exception\ParseException in 4.0 */ public function testParseMappingKeyWithColonNotFollowedBySpace() @@ -391,6 +391,8 @@ public function getTestsForParse() array('{\'foo\': \'bar\', "bar": \'foo: bar\'}', array('foo' => 'bar', 'bar' => 'foo: bar')), array('{\'foo\'\'\': \'bar\', "bar\"": \'foo: bar\'}', array('foo\'' => 'bar', 'bar"' => 'foo: bar')), array('{\'foo: \': \'bar\', "bar: ": \'foo: bar\'}', array('foo: ' => 'bar', 'bar: ' => 'foo: bar')), + array('{"foo:bar": "baz"}', array('foo:bar' => 'baz')), + array('{"foo":"bar"}', array('foo' => 'bar')), // nested sequences and mappings array('[foo, [bar, foo]]', array('foo', array('bar', 'foo'))), @@ -460,6 +462,8 @@ public function getTestsForParseWithMapObjects() array('{\'foo\': \'bar\', "bar": \'foo: bar\'}', (object) array('foo' => 'bar', 'bar' => 'foo: bar')), array('{\'foo\'\'\': \'bar\', "bar\"": \'foo: bar\'}', (object) array('foo\'' => 'bar', 'bar"' => 'foo: bar')), array('{\'foo: \': \'bar\', "bar: ": \'foo: bar\'}', (object) array('foo: ' => 'bar', 'bar: ' => 'foo: bar')), + array('{"foo:bar": "baz"}', (object) array('foo:bar' => 'baz')), + array('{"foo":"bar"}', (object) array('foo' => 'bar')), // nested sequences and mappings array('[foo, [bar, foo]]', array('foo', array('bar', 'foo'))),