Skip to content

Commit 0188b07

Browse files
committed
Parser: fix missing anchors/tags specially in map flow mode
1 parent 3cba8d3 commit 0188b07

3 files changed

Lines changed: 32 additions & 10 deletions

File tree

src/c4/yml/parse_engine.def.hpp

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5388,7 +5388,7 @@ void ParseEngine<EventHandler>::_handle_seq_flow()
53885388
{
53895389
csubstr ref = _scan_ref_seq();
53905390
_c4dbgpf("seqflow[RVAL]: ref! {}", _prs(ref));
5391-
m_evt_handler->set_val_ref(ref);
5391+
_handle_valref(ref);
53925392
addrem_flags(RNXT, RVAL);
53935393
}
53945394
else if(first == '&')
@@ -5712,6 +5712,7 @@ void ParseEngine<EventHandler>::_handle_map_flow()
57125712
_c4dbgp("mapflow[RVAL]: scanning single-quoted scalar");
57135713
sc = _scan_scalar_squot();
57145714
csubstr maybe_filtered = _maybe_filter_val_scalar_squot(sc);
5715+
_handle_annotations_before_blck_val_scalar();
57155716
m_evt_handler->set_val_scalar_squoted(maybe_filtered);
57165717
addrem_flags(RNXT, RVAL);
57175718
}
@@ -5720,6 +5721,7 @@ void ParseEngine<EventHandler>::_handle_map_flow()
57205721
_c4dbgp("mapflow[RVAL]: scanning double-quoted scalar");
57215722
sc = _scan_scalar_dquot();
57225723
csubstr maybe_filtered = _maybe_filter_val_scalar_dquot(sc);
5724+
_handle_annotations_before_blck_val_scalar();
57235725
m_evt_handler->set_val_scalar_dquoted(maybe_filtered);
57245726
addrem_flags(RNXT, RVAL);
57255727
}
@@ -5728,13 +5730,15 @@ void ParseEngine<EventHandler>::_handle_map_flow()
57285730
{
57295731
_c4dbgp("mapflow[RVAL]: plain scalar.");
57305732
csubstr maybe_filtered = _maybe_filter_val_scalar_plain(sc, m_evt_handler->m_curr->indref);
5733+
_handle_annotations_before_blck_val_scalar();
57315734
m_evt_handler->set_val_scalar_plain(maybe_filtered);
57325735
addrem_flags(RNXT, RVAL);
57335736
}
57345737
else if(first == '[')
57355738
{
57365739
_c4dbgp("mapflow[RVAL]: start val seqflow");
57375740
addrem_flags(RNXT, RVAL);
5741+
_handle_annotations_before_blck_val_scalar();
57385742
m_evt_handler->begin_seq_val_flow();
57395743
_set_indentation(m_evt_handler->m_parent->indref);
57405744
addrem_flags(RSEQ|RVAL, RMAP|RNXT);
@@ -5745,6 +5749,7 @@ void ParseEngine<EventHandler>::_handle_map_flow()
57455749
{
57465750
_c4dbgp("mapflow[RVAL]: start val mapflow");
57475751
addrem_flags(RNXT, RVAL);
5752+
_handle_annotations_before_blck_val_scalar();
57485753
m_evt_handler->begin_map_val_flow();
57495754
_set_indentation(m_evt_handler->m_parent->indref);
57505755
addrem_flags(RKEY, RNXT);
@@ -5754,6 +5759,7 @@ void ParseEngine<EventHandler>::_handle_map_flow()
57545759
else if(first == '}')
57555760
{
57565761
_c4dbgp("mapflow[RVAL]: end!");
5762+
_handle_annotations_before_blck_val_scalar();
57575763
m_evt_handler->set_val_scalar_plain_empty();
57585764
_line_progressed(1);
57595765
_end_map_flow();
@@ -5762,6 +5768,7 @@ void ParseEngine<EventHandler>::_handle_map_flow()
57625768
else if(first == ',')
57635769
{
57645770
_c4dbgp("mapflow[RVAL]: empty val!");
5771+
_handle_annotations_before_blck_val_scalar();
57655772
m_evt_handler->set_val_scalar_plain_empty();
57665773
addrem_flags(RNXT, RVAL);
57675774
// keep going in this function
@@ -5777,13 +5784,13 @@ void ParseEngine<EventHandler>::_handle_map_flow()
57775784
{
57785785
csubstr anchor = _scan_anchor();
57795786
_c4dbgpf("mapflow[RVAL]: key anchor! {}", _prs(anchor));
5780-
m_evt_handler->set_val_anchor(anchor);
5787+
_add_annotation(&m_pending_anchors, anchor);
57815788
}
57825789
else if(first == '!')
57835790
{
57845791
csubstr tag = _scan_tag();
57855792
_c4dbgpf("mapflow[RVAL]: tag! {}", _prs(tag));
5786-
m_evt_handler->set_val_tag(tag);
5793+
_add_annotation(&m_pending_tags, tag);
57875794
}
57885795
else
57895796
{
@@ -5834,6 +5841,7 @@ void ParseEngine<EventHandler>::_handle_map_flow()
58345841
_c4dbgp("mapflow[QMRK]: scanning single-quoted scalar");
58355842
sc = _scan_scalar_squot();
58365843
csubstr maybe_filtered = _maybe_filter_key_scalar_squot(sc);
5844+
_handle_annotations_before_blck_key_scalar();
58375845
m_evt_handler->set_key_scalar_squoted(maybe_filtered);
58385846
addrem_flags(RKCL, QMRK);
58395847
}
@@ -5842,6 +5850,7 @@ void ParseEngine<EventHandler>::_handle_map_flow()
58425850
_c4dbgp("mapflow[QMRK]: scanning double-quoted scalar");
58435851
sc = _scan_scalar_dquot();
58445852
csubstr maybe_filtered = _maybe_filter_key_scalar_dquot(sc);
5853+
_handle_annotations_before_blck_key_scalar();
58455854
m_evt_handler->set_key_scalar_dquoted(maybe_filtered);
58465855
addrem_flags(RKCL, QMRK);
58475856
}
@@ -5850,12 +5859,14 @@ void ParseEngine<EventHandler>::_handle_map_flow()
58505859
{
58515860
_c4dbgp("mapflow[QMRK]: plain scalar");
58525861
csubstr maybe_filtered = _maybe_filter_key_scalar_plain(sc, m_evt_handler->m_curr->indref);
5862+
_handle_annotations_before_blck_key_scalar();
58535863
m_evt_handler->set_key_scalar_plain(maybe_filtered);
58545864
addrem_flags(RKCL, QMRK);
58555865
}
58565866
else if(first == ':')
58575867
{
58585868
_c4dbgp("mapflow[QMRK]: setting empty key");
5869+
_handle_annotations_before_blck_key_scalar();
58595870
m_evt_handler->set_key_scalar_plain_empty();
58605871
addrem_flags(RVAL, QMRK);
58615872
_line_progressed(1);
@@ -5864,6 +5875,7 @@ void ParseEngine<EventHandler>::_handle_map_flow()
58645875
else if(first == '}') // this happens on a trailing comma like ", }"
58655876
{
58665877
_c4dbgp("mapflow[QMRK]: end!");
5878+
_handle_annotations_before_blck_key_scalar();
58675879
m_evt_handler->set_key_scalar_plain_empty();
58685880
m_evt_handler->set_val_scalar_plain_empty();
58695881
_end_map_flow();
@@ -5873,6 +5885,7 @@ void ParseEngine<EventHandler>::_handle_map_flow()
58735885
else if(first == ',')
58745886
{
58755887
_c4dbgp("mapflow[QMRK]: empty key+val!");
5888+
_handle_annotations_before_blck_key_scalar();
58765889
m_evt_handler->set_key_scalar_plain_empty();
58775890
m_evt_handler->set_val_scalar_plain_empty();
58785891
addrem_flags(RNXT, QMRK);
@@ -5881,7 +5894,7 @@ void ParseEngine<EventHandler>::_handle_map_flow()
58815894
{
58825895
csubstr anchor = _scan_anchor();
58835896
_c4dbgpf("mapflow[QMRK]: key anchor! {}", _prs(anchor));
5884-
m_evt_handler->set_key_anchor(anchor);
5897+
_add_annotation(&m_pending_anchors, anchor);
58855898
}
58865899
else if(first == '*')
58875900
{
@@ -5897,6 +5910,7 @@ void ParseEngine<EventHandler>::_handle_map_flow()
58975910
// able to handle it.
58985911
_c4dbgp("mapflow[QMRK]: start child seqflow (!)");
58995912
addrem_flags(RKCL, QMRK);
5913+
_handle_annotations_before_blck_key_scalar();
59005914
m_evt_handler->begin_seq_key_flow();
59015915
addrem_flags(RSEQ|RVAL, RMAP|RKCL);
59025916
_set_indentation(m_evt_handler->m_parent->indref);
@@ -5910,6 +5924,7 @@ void ParseEngine<EventHandler>::_handle_map_flow()
59105924
// able to handle it.
59115925
_c4dbgp("mapflow[QMRK]: start child mapflow (!)");
59125926
addrem_flags(RKCL, QMRK);
5927+
_handle_annotations_before_blck_key_scalar();
59135928
m_evt_handler->begin_map_key_flow();
59145929
_set_indentation(m_evt_handler->m_parent->indref);
59155930
addrem_flags(RKEY, RKCL);
@@ -5920,7 +5935,7 @@ void ParseEngine<EventHandler>::_handle_map_flow()
59205935
{
59215936
csubstr tag = _scan_tag();
59225937
_c4dbgpf("mapflow[QMRK]: tag! {}", _prs(tag));
5923-
m_evt_handler->set_key_tag(tag);
5938+
_add_annotation(&m_pending_tags, tag);
59245939
}
59255940
else
59265941
{
@@ -6988,6 +7003,7 @@ void ParseEngine<EventHandler>::_handle_map_block()
69887003
{
69897004
_c4dbgp("mapblck[RVAL]: start child map, block");
69907005
addrem_flags(RNXT, RVAL);
7006+
_handle_annotations_before_blck_val_scalar();
69917007
m_evt_handler->begin_map_val_block();
69927008
_handle_keyref(ref);
69937009
_set_indentation(startindent);
@@ -7439,7 +7455,9 @@ bool ParseEngine<EventHandler>::_handle_map_block_qmrk()
74397455
else
74407456
{
74417457
_c4dbgp("mapblck[QMRK]: start new block map as key (!), set ref as key");
7458+
_handle_annotations_before_start_mapblck_as_key();
74427459
m_evt_handler->begin_map_key_block();
7460+
_handle_annotations_and_indentation_after_start_mapblck(startindent, startline);
74437461
_handle_keyref(ref);
74447462
_set_indentation(startindent);
74457463
// keep the child state on RVAL
@@ -7486,6 +7504,7 @@ bool ParseEngine<EventHandler>::_handle_map_block_qmrk()
74867504
{
74877505
_c4dbgp("mapblck[QMRK]: start child seqflow (!)");
74887506
addrem_flags(RKCL, QMRK);
7507+
_handle_annotations_before_blck_key_scalar();
74897508
m_evt_handler->begin_seq_key_flow();
74907509
addrem_flags(RVAL|RSEQ|RFLOW, RMAP|RKCL|RBLCK);
74917510
_set_indentation(m_evt_handler->m_parent->indref + 1);
@@ -7496,6 +7515,7 @@ bool ParseEngine<EventHandler>::_handle_map_block_qmrk()
74967515
{
74977516
_c4dbgp("mapblck[QMRK]: start child mapflow (!)");
74987517
addrem_flags(RKCL, QMRK);
7518+
_handle_annotations_before_blck_key_scalar();
74997519
m_evt_handler->begin_map_key_flow();
75007520
addrem_flags(RKEY|RFLOW, RVAL|RKCL|RBLCK);
75017521
_set_indentation(m_evt_handler->m_parent->indref + 1);
@@ -7508,6 +7528,7 @@ bool ParseEngine<EventHandler>::_handle_map_block_qmrk()
75087528
if(m_evt_handler->m_curr->indentation_eq())
75097529
{
75107530
_c4dbgp("mapblck[QMRK]: ? indent eq - prev ? was for an empty keyval");
7531+
_handle_annotations_before_blck_key_scalar();
75117532
m_evt_handler->set_key_scalar_plain_empty();
75127533
m_evt_handler->set_val_scalar_plain_empty();
75137534
m_evt_handler->add_sibling();
@@ -7517,7 +7538,7 @@ bool ParseEngine<EventHandler>::_handle_map_block_qmrk()
75177538
_RYML_ASSERT_PARSE_(callbacks(), m_evt_handler->m_curr->indentation_gt(), m_evt_handler->m_curr->pos);
75187539
_c4dbgp("mapblck[QMRK]: ? indent gt - start child mapblck (!)");
75197540
addrem_flags(RKCL, RKEY|QMRK);
7520-
rem_flags(RKEY);
7541+
_handle_annotations_before_blck_key_scalar();
75217542
m_evt_handler->begin_map_key_block();
75227543
addrem_flags(RBLCK|QMRK, RVAL|RKCL);
75237544
_set_indentation(startindent);
@@ -7962,7 +7983,6 @@ void ParseEngine<EventHandler>::_handle_unk()
79627983
const size_t line = m_evt_handler->m_curr->pos.line;
79637984
_add_annotation(&m_pending_anchors, anchor, remindent, line);
79647985
_set_indentation(0);
7965-
m_doc_empty = false;
79667986
}
79677987
else if(first == '*')
79687988
{

src/c4/yml/parse_engine.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -645,7 +645,7 @@ class ParseEngine
645645
size_t line;
646646
};
647647
Entry annotations[2];
648-
size_t num_entries;
648+
uint8_t num_entries;
649649
};
650650

651651
void _handle_colon();

src_extra/c4/yml/extra/event_handler_ints.hpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1085,7 +1085,7 @@ struct EventHandlerInts : public c4::yml::EventHandlerStack<EventHandlerInts, Ev
10851085

10861086
void set_key_anchor(csubstr anchor)
10871087
{
1088-
_c4dbgpf("{}/{}: set_key_anchor", m_evt_pos, m_evt_size);
1088+
_c4dbgpf("{}/{}: set_key_anchor: {}", m_evt_pos, m_evt_size, anchor);
10891089
_RYML_ASSERT_BASIC_(m_stack.m_callbacks, !_has_any_(KEYREF));
10901090
_enable_(c4::yml::KEYANCH);
10911091
if(m_evt_pos + 3 < m_evt_size)
@@ -1098,7 +1098,7 @@ struct EventHandlerInts : public c4::yml::EventHandlerStack<EventHandlerInts, Ev
10981098
}
10991099
void set_val_anchor(csubstr anchor)
11001100
{
1101-
_c4dbgpf("{}/{}: set_val_anchor", m_evt_pos, m_evt_size);
1101+
_c4dbgpf("{}/{}: set_val_anchor: {}", m_evt_pos, m_evt_size, anchor);
11021102
_RYML_ASSERT_BASIC_(m_stack.m_callbacks, !_has_any_(VALREF));
11031103
_enable_(c4::yml::VALANCH);
11041104
if(m_evt_pos + 3 < m_evt_size)
@@ -1112,6 +1112,7 @@ struct EventHandlerInts : public c4::yml::EventHandlerStack<EventHandlerInts, Ev
11121112

11131113
void set_key_ref(csubstr ref)
11141114
{
1115+
_c4dbgpf("{}/{}: set_key_ref: {}", m_evt_pos, m_evt_size, ref);
11151116
_RYML_ASSERT_BASIC_(m_stack.m_callbacks, ref.begins_with('*'));
11161117
if(C4_UNLIKELY(_has_any_(KEYANCH)))
11171118
_RYML_ERR_PARSE_(m_stack.m_callbacks, m_curr->pos, "key cannot have both anchor and ref");
@@ -1120,6 +1121,7 @@ struct EventHandlerInts : public c4::yml::EventHandlerStack<EventHandlerInts, Ev
11201121
}
11211122
void set_val_ref(csubstr ref)
11221123
{
1124+
_c4dbgpf("{}/{}: set_val_ref: {}", m_evt_pos, m_evt_size, ref);
11231125
_RYML_ASSERT_BASIC_(m_stack.m_callbacks, ref.begins_with('*'));
11241126
if(C4_UNLIKELY(_has_any_(VALANCH)))
11251127
_RYML_ERR_PARSE_(m_stack.m_callbacks, m_curr->pos, "val cannot have both anchor and ref");

0 commit comments

Comments
 (0)