Skip to content

[YAML] Error parsing file when custom tag references itself #29462

Closed
@eugene-manuilov

Description

@eugene-manuilov

Symfony version(s) affected: symfony/yaml@^4.2

Description

I have received the following error when I try to parse YAML document generated by YARD documentation tool. The custom tag (!ruby/object:YARDJS::CodeObjects::PropertyObject) in the YAML file has a reference to itself, but parser hasn't added it to the references registry yet thus throws the error.

PHP Fatal error:  Uncaught Symfony\Component\Yaml\Exception\ParseException: Reference "1" does not exist at line 4 (near "object: *1"). in vendor/symfony/yaml/Parser.php:642
Stack trace:
#0 vendor/symfony/yaml/Parser.php(337): Symfony\Component\Yaml\Parser->parseValue('1', 512, 'mapping')
#1 vendor/symfony/yaml/Parser.php(454): Symfony\Component\Yaml\Parser->doParse('Constructs a se...', 512)
#2 vendor/symfony/yaml/Parser.php(315): Symfony\Component\Yaml\Parser->parseBlock(18, 'str: |-\n  Const...', 512)
#3 vendor/symfony/yaml/Parser.php(454): Symfony\Component\Yaml\Parser->doParse(Array, 512)
#4 vendor/symfony/yaml/Parser.php(185): Symfony\Component\Yaml\Parser->parseBlock(10, 'files: []\ncurre...', 512)
#5 vendor/symfony/yaml/Parser.php(454): Symfony\Component\Yaml\Parser->doParse('- &1 !ruby/obje...', 512)
#6 vendor/symfony/yaml/Parser in vendor/symfony/yaml/Parser.php on line 642

How to reproduce

Just run:

use Symfony\Component\Yaml\Yaml;

$content = "
children: !ruby/array:YARD::CodeObjects::CodeObjectList
  internal:
  - &235 !ruby/object:YARD::CodeObjects::ModuleObject
    children: !ruby/array:YARD::CodeObjects::CodeObjectList
      internal:
      - &2 !ruby/object:YARD::CodeObjects::ClassObject
        children: !ruby/array:YARD::CodeObjects::CodeObjectList
          internal:
          - &1 !ruby/object:YARDJS::CodeObjects::PropertyObject
            files: []
            current_file_has_comments: false
            name: :constructor
            source_type: :ruby
            visibility: :public
            tags: []
            docstrings: {}
            docstring: !ruby/string:YARD::Docstring
              str: |-
                Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibu
                lum sit amet pulvinar odio, vitae convallis dolor.
              object: *1
              summary:
              hash_flag: false
";

$yaml = Yaml::parse( $content, Yaml::PARSE_CUSTOM_TAGS );

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions