Skip to content

Commit 3d66090

Browse files
committed
fix parsing of maps with trailing empty keys + vals (tags also)
1 parent 0c64a25 commit 3d66090

4 files changed

Lines changed: 782 additions & 278 deletions

File tree

changelog/current.md

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,27 @@
22
## Fixes
33

44
- [PR#501](https://github.com/biojppm/rapidyaml/pull/501): fix missing tag in `- !!seq []`
5-
- [PR#502](https://github.com/biojppm/rapidyaml/pull/502): fix parse error in tagged empty documents:
6-
```yaml
7-
!yamlscript/v0/bare
8-
--- !code
9-
42
10-
```
5+
- [PR#502](https://github.com/biojppm/rapidyaml/pull/502): fix parse errors or missing tags:
6+
- missing tags in empty documents:
7+
```yaml
8+
!yamlscript/v0/bare
9+
--- !code
10+
42
11+
```
12+
- trailing empty keys or vals:
13+
```yaml
14+
a:
15+
:
16+
```
17+
- missing tags in trailing empty keys or vals:
18+
```yaml
19+
a: !tag
20+
!tag : !tag
21+
```
22+
- missing tags in complex maps:
23+
```yaml
24+
? a: !tag
25+
!tag : !tag
26+
:
27+
!tag : !tag
28+
```

src/c4/yml/parse_engine.def.hpp

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6810,14 +6810,26 @@ void ParseEngine<EventHandler>::_handle_map_block()
68106810
m_evt_handler->set_val_scalar_plain_empty();
68116811
m_evt_handler->add_sibling();
68126812
m_evt_handler->set_key_scalar_plain_empty();
6813-
_line_progressed(1);
6814-
_maybe_skip_whitespace_tokens();
6815-
goto mapblck_again;
6813+
}
6814+
else if(startindent > m_evt_handler->m_curr->indref)
6815+
{
6816+
_c4dbgp("mapblck[RVAL]: start val mapblck");
6817+
addrem_flags(RNXT, RVAL);
6818+
_handle_annotations_before_start_mapblck(startline);
6819+
m_evt_handler->begin_map_val_block();
6820+
_handle_annotations_and_indentation_after_start_mapblck(startindent, startline);
6821+
m_evt_handler->set_key_scalar_plain_empty();
6822+
_set_indentation(m_evt_handler->m_curr->line_contents.indentation);
6823+
// keep the child state on RVAL
6824+
addrem_flags(RVAL, RNXT);
68166825
}
68176826
else
68186827
{
68196828
_c4err("parse error");
68206829
}
6830+
_line_progressed(1);
6831+
_maybe_skip_whitespace_tokens();
6832+
goto mapblck_again;
68216833
}
68226834
else if(first == '.')
68236835
{
@@ -7170,6 +7182,7 @@ void ParseEngine<EventHandler>::_handle_map_block()
71707182
{
71717183
_c4dbgp("mapblck[QMRK]: start child seqblck (!)");
71727184
addrem_flags(RKCL, RKEY|QMRK);
7185+
_handle_annotations_before_blck_key_scalar();
71737186
m_evt_handler->begin_seq_key_block();
71747187
addrem_flags(RVAL|RSEQ, RMAP|RKCL|QMRK);
71757188
_set_indentation(startindent);
@@ -7531,13 +7544,16 @@ void ParseEngine<EventHandler>::_handle_unk()
75317544
if(m_doc_empty)
75327545
{
75337546
_c4dbgp("it's a map with an empty key");
7547+
const size_t startindent = m_evt_handler->m_curr->line_contents.indentation; // save
7548+
const size_t startline = m_evt_handler->m_curr->pos.line; // save
75347549
m_evt_handler->check_trailing_doc_token();
75357550
_maybe_begin_doc();
7536-
_handle_annotations_before_blck_val_scalar();
7551+
_handle_annotations_before_start_mapblck(startline);
75377552
m_evt_handler->begin_map_val_block();
7553+
_handle_annotations_and_indentation_after_start_mapblck(startindent, startline);
75387554
m_evt_handler->set_key_scalar_plain_empty();
75397555
m_doc_empty = false;
7540-
_save_indentation();
7556+
_set_indentation(startindent);
75417557
}
75427558
else
75437559
{

0 commit comments

Comments
 (0)