Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
Y
yaml-cpp
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
lvzhengyang
yaml-cpp
Commits
eca9cfd6
Commit
eca9cfd6
authored
Mar 12, 2019
by
caryoscelus
Committed by
Jesse Beder
Mar 12, 2019
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add optional OnAnchor method to EventHandler (#530)
ref #110
parent
a2a113c6
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
52 additions
and
16 deletions
+52
-16
include/yaml-cpp/eventhandler.h
+6
-1
src/singledocparser.cpp
+12
-5
src/singledocparser.h
+4
-3
test/create-emitter-tests.py
+16
-4
test/integration/gen_emitter_test.cpp
+0
-0
test/integration/handler_spec_test.cpp
+12
-2
test/mock_event_handler.h
+2
-1
No files found.
include/yaml-cpp/eventhandler.h
View file @
eca9cfd6
...
...
@@ -34,7 +34,12 @@ class EventHandler {
virtual
void
OnMapStart
(
const
Mark
&
mark
,
const
std
::
string
&
tag
,
anchor_t
anchor
,
EmitterStyle
::
value
style
)
=
0
;
virtual
void
OnMapEnd
()
=
0
;
virtual
void
OnAnchor
(
const
Mark
&
/*mark*/
,
const
std
::
string
&
/*anchor_name*/
)
{
// empty default implementation for compatibility
}
};
}
}
// namespace YAML
#endif // EVENTHANDLER_H_62B23520_7C8E_11DE_8A39_0800200C9A66
src/singledocparser.cpp
View file @
eca9cfd6
...
...
@@ -71,8 +71,12 @@ void SingleDocParser::HandleNode(EventHandler& eventHandler) {
}
std
::
string
tag
;
std
::
string
anchor_name
;
anchor_t
anchor
;
ParseProperties
(
tag
,
anchor
);
ParseProperties
(
tag
,
anchor
,
anchor_name
);
if
(
!
anchor_name
.
empty
())
eventHandler
.
OnAnchor
(
mark
,
anchor_name
);
const
Token
&
token
=
m_scanner
.
peek
();
...
...
@@ -356,8 +360,10 @@ void SingleDocParser::HandleCompactMapWithNoKey(EventHandler& eventHandler) {
// ParseProperties
// . Grabs any tag or anchor tokens and deals with them.
void
SingleDocParser
::
ParseProperties
(
std
::
string
&
tag
,
anchor_t
&
anchor
)
{
void
SingleDocParser
::
ParseProperties
(
std
::
string
&
tag
,
anchor_t
&
anchor
,
std
::
string
&
anchor_name
)
{
tag
.
clear
();
anchor_name
.
clear
();
anchor
=
NullAnchor
;
while
(
1
)
{
...
...
@@ -369,7 +375,7 @@ void SingleDocParser::ParseProperties(std::string& tag, anchor_t& anchor) {
ParseTag
(
tag
);
break
;
case
Token
:
:
ANCHOR
:
ParseAnchor
(
anchor
);
ParseAnchor
(
anchor
,
anchor_name
);
break
;
default
:
return
;
...
...
@@ -387,11 +393,12 @@ void SingleDocParser::ParseTag(std::string& tag) {
m_scanner
.
pop
();
}
void
SingleDocParser
::
ParseAnchor
(
anchor_t
&
anchor
)
{
void
SingleDocParser
::
ParseAnchor
(
anchor_t
&
anchor
,
std
::
string
&
anchor_name
)
{
Token
&
token
=
m_scanner
.
peek
();
if
(
anchor
)
throw
ParserException
(
token
.
mark
,
ErrorMsg
::
MULTIPLE_ANCHORS
);
anchor_name
=
token
.
value
;
anchor
=
RegisterAnchor
(
token
.
value
);
m_scanner
.
pop
();
}
...
...
@@ -411,4 +418,4 @@ anchor_t SingleDocParser::LookupAnchor(const Mark& mark,
return
it
->
second
;
}
}
}
// namespace YAML
src/singledocparser.h
View file @
eca9cfd6
...
...
@@ -43,9 +43,10 @@ class SingleDocParser : private noncopyable {
void
HandleCompactMap
(
EventHandler
&
eventHandler
);
void
HandleCompactMapWithNoKey
(
EventHandler
&
eventHandler
);
void
ParseProperties
(
std
::
string
&
tag
,
anchor_t
&
anchor
);
void
ParseProperties
(
std
::
string
&
tag
,
anchor_t
&
anchor
,
std
::
string
&
anchor_name
);
void
ParseTag
(
std
::
string
&
tag
);
void
ParseAnchor
(
anchor_t
&
anchor
);
void
ParseAnchor
(
anchor_t
&
anchor
,
std
::
string
&
anchor_name
);
anchor_t
RegisterAnchor
(
const
std
::
string
&
name
);
anchor_t
LookupAnchor
(
const
Mark
&
mark
,
const
std
::
string
&
name
)
const
;
...
...
@@ -60,6 +61,6 @@ class SingleDocParser : private noncopyable {
anchor_t
m_curAnchor
;
};
}
}
// namespace YAML
#endif // SINGLEDOCPARSER_H_62B23520_7C8E_11DE_8A39_0800200C9A66
test/create-emitter-tests.py
View file @
eca9cfd6
...
...
@@ -35,10 +35,12 @@ def doc_end(implicit=False):
def
scalar
(
value
,
tag
=
''
,
anchor
=
''
,
anchor_id
=
0
):
emit
=
[]
handle
=
[]
if
tag
:
emit
+=
[
'VerbatimTag("
%
s")'
%
encode
(
tag
)]
if
anchor
:
emit
+=
[
'Anchor("
%
s")'
%
encode
(
anchor
)]
handle
+=
[
'OnAnchor(_, "
%
s")'
%
encode
(
anchor
)]
if
tag
:
out_tag
=
encode
(
tag
)
else
:
...
...
@@ -47,39 +49,46 @@ def scalar(value, tag='', anchor='', anchor_id=0):
else
:
out_tag
=
'!'
emit
+=
[
'"
%
s"'
%
encode
(
value
)]
return
{
'emit'
:
emit
,
'handle'
:
'OnScalar(_, "
%
s",
%
s, "
%
s")'
%
(
out_tag
,
anchor_id
,
encode
(
value
))}
handle
+=
[
'OnScalar(_, "
%
s",
%
s, "
%
s")'
%
(
out_tag
,
anchor_id
,
encode
(
value
))]
return
{
'emit'
:
emit
,
'handle'
:
handle
}
def
comment
(
value
):
return
{
'emit'
:
'Comment("
%
s")'
%
value
,
'handle'
:
''
}
def
seq_start
(
tag
=
''
,
anchor
=
''
,
anchor_id
=
0
,
style
=
'_'
):
emit
=
[]
handle
=
[]
if
tag
:
emit
+=
[
'VerbatimTag("
%
s")'
%
encode
(
tag
)]
if
anchor
:
emit
+=
[
'Anchor("
%
s")'
%
encode
(
anchor
)]
handle
+=
[
'OnAnchor(_, "
%
s")'
%
encode
(
anchor
)]
if
tag
:
out_tag
=
encode
(
tag
)
else
:
out_tag
=
'?'
emit
+=
[
'BeginSeq'
]
return
{
'emit'
:
emit
,
'handle'
:
'OnSequenceStart(_, "
%
s",
%
s,
%
s)'
%
(
out_tag
,
anchor_id
,
style
)}
handle
+=
[
'OnSequenceStart(_, "
%
s",
%
s,
%
s)'
%
(
out_tag
,
anchor_id
,
style
)]
return
{
'emit'
:
emit
,
'handle'
:
handle
}
def
seq_end
():
return
{
'emit'
:
'EndSeq'
,
'handle'
:
'OnSequenceEnd()'
}
def
map_start
(
tag
=
''
,
anchor
=
''
,
anchor_id
=
0
,
style
=
'_'
):
emit
=
[]
handle
=
[]
if
tag
:
emit
+=
[
'VerbatimTag("
%
s")'
%
encode
(
tag
)]
if
anchor
:
emit
+=
[
'Anchor("
%
s")'
%
encode
(
anchor
)]
handle
+=
[
'OnAnchor(_, "
%
s")'
%
encode
(
anchor
)]
if
tag
:
out_tag
=
encode
(
tag
)
else
:
out_tag
=
'?'
emit
+=
[
'BeginMap'
]
return
{
'emit'
:
emit
,
'handle'
:
'OnMapStart(_, "
%
s",
%
s,
%
s)'
%
(
out_tag
,
anchor_id
,
style
)}
handle
+=
[
'OnMapStart(_, "
%
s",
%
s,
%
s)'
%
(
out_tag
,
anchor_id
,
style
)]
return
{
'emit'
:
emit
,
'handle'
:
handle
}
def
map_end
():
return
{
'emit'
:
'EndMap'
,
'handle'
:
'OnMapEnd()'
}
...
...
@@ -202,7 +211,10 @@ def create_emitter_tests(out):
out
.
writeln
(
''
)
for
event
in
test
[
'events'
]:
handle
=
event
[
'handle'
]
if
handle
:
if
isinstance
(
handle
,
list
):
for
e
in
handle
:
out
.
writeln
(
'EXPECT_CALL(handler,
%
s);'
%
e
)
elif
handle
:
out
.
writeln
(
'EXPECT_CALL(handler,
%
s);'
%
handle
)
out
.
writeln
(
'Parse(out.c_str());'
)
out
.
writeln
(
''
)
...
...
test/integration/gen_emitter_test.cpp
View file @
eca9cfd6
This source diff could not be displayed because it is too large. You can
view the blob
instead.
test/integration/handler_spec_test.cpp
View file @
eca9cfd6
...
...
@@ -199,6 +199,7 @@ TEST_F(HandlerSpecTest, Ex2_10_SimpleAnchor) {
EXPECT_CALL
(
handler
,
OnScalar
(
_
,
"?"
,
0
,
"hr"
));
EXPECT_CALL
(
handler
,
OnSequenceStart
(
_
,
"?"
,
0
,
EmitterStyle
::
Block
));
EXPECT_CALL
(
handler
,
OnScalar
(
_
,
"?"
,
0
,
"Mark McGwire"
));
EXPECT_CALL
(
handler
,
OnAnchor
(
_
,
"SS"
));
EXPECT_CALL
(
handler
,
OnScalar
(
_
,
"?"
,
1
,
"Sammy Sosa"
));
EXPECT_CALL
(
handler
,
OnSequenceEnd
());
EXPECT_CALL
(
handler
,
OnScalar
(
_
,
"?"
,
0
,
"rbi"
));
...
...
@@ -376,6 +377,7 @@ TEST_F(HandlerSpecTest, Ex2_24_GlobalTags) {
EXPECT_CALL
(
handler
,
OnMapStart
(
_
,
"tag:clarkevans.com,2002:circle"
,
0
,
EmitterStyle
::
Block
));
EXPECT_CALL
(
handler
,
OnScalar
(
_
,
"?"
,
0
,
"center"
));
EXPECT_CALL
(
handler
,
OnAnchor
(
_
,
"ORIGIN"
));
EXPECT_CALL
(
handler
,
OnMapStart
(
_
,
"?"
,
1
,
EmitterStyle
::
Flow
));
EXPECT_CALL
(
handler
,
OnScalar
(
_
,
"?"
,
0
,
"x"
));
EXPECT_CALL
(
handler
,
OnScalar
(
_
,
"?"
,
0
,
"73"
));
...
...
@@ -456,6 +458,7 @@ TEST_F(HandlerSpecTest, Ex2_27_Invoice) {
EXPECT_CALL
(
handler
,
OnScalar
(
_
,
"?"
,
0
,
"date"
));
EXPECT_CALL
(
handler
,
OnScalar
(
_
,
"?"
,
0
,
"2001-01-23"
));
EXPECT_CALL
(
handler
,
OnScalar
(
_
,
"?"
,
0
,
"bill-to"
));
EXPECT_CALL
(
handler
,
OnAnchor
(
_
,
"id001"
));
EXPECT_CALL
(
handler
,
OnMapStart
(
_
,
"?"
,
1
,
EmitterStyle
::
Block
));
EXPECT_CALL
(
handler
,
OnScalar
(
_
,
"?"
,
0
,
"given"
));
EXPECT_CALL
(
handler
,
OnScalar
(
_
,
"?"
,
0
,
"Chris"
));
...
...
@@ -616,6 +619,7 @@ TEST_F(HandlerSpecTest, Ex5_6_NodePropertyIndicators) {
EXPECT_CALL
(
handler
,
OnDocumentStart
(
_
));
EXPECT_CALL
(
handler
,
OnMapStart
(
_
,
"?"
,
0
,
EmitterStyle
::
Block
));
EXPECT_CALL
(
handler
,
OnScalar
(
_
,
"?"
,
0
,
"anchored"
));
EXPECT_CALL
(
handler
,
OnAnchor
(
_
,
"anchor"
));
EXPECT_CALL
(
handler
,
OnScalar
(
_
,
"!local"
,
1
,
"value"
));
EXPECT_CALL
(
handler
,
OnScalar
(
_
,
"?"
,
0
,
"alias"
));
EXPECT_CALL
(
handler
,
OnAlias
(
_
,
1
));
...
...
@@ -909,8 +913,10 @@ TEST_F(HandlerSpecTest, Ex6_22_GlobalTagPrefix) {
TEST_F
(
HandlerSpecTest
,
Ex6_23_NodeProperties
)
{
EXPECT_CALL
(
handler
,
OnDocumentStart
(
_
));
EXPECT_CALL
(
handler
,
OnMapStart
(
_
,
"?"
,
0
,
EmitterStyle
::
Block
));
EXPECT_CALL
(
handler
,
OnAnchor
(
_
,
"a1"
));
EXPECT_CALL
(
handler
,
OnScalar
(
_
,
"tag:yaml.org,2002:str"
,
1
,
"foo"
));
EXPECT_CALL
(
handler
,
OnScalar
(
_
,
"tag:yaml.org,2002:str"
,
0
,
"bar"
));
EXPECT_CALL
(
handler
,
OnAnchor
(
_
,
"a2"
));
EXPECT_CALL
(
handler
,
OnScalar
(
_
,
"?"
,
2
,
"baz"
));
EXPECT_CALL
(
handler
,
OnAlias
(
_
,
1
));
EXPECT_CALL
(
handler
,
OnMapEnd
());
...
...
@@ -972,6 +978,7 @@ TEST_F(HandlerSpecTest, Ex6_29_NodeAnchors) {
EXPECT_CALL
(
handler
,
OnDocumentStart
(
_
));
EXPECT_CALL
(
handler
,
OnMapStart
(
_
,
"?"
,
0
,
EmitterStyle
::
Block
));
EXPECT_CALL
(
handler
,
OnScalar
(
_
,
"?"
,
0
,
"First occurrence"
));
EXPECT_CALL
(
handler
,
OnAnchor
(
_
,
"anchor"
));
EXPECT_CALL
(
handler
,
OnScalar
(
_
,
"?"
,
1
,
"Value"
));
EXPECT_CALL
(
handler
,
OnScalar
(
_
,
"?"
,
0
,
"Second occurrence"
));
EXPECT_CALL
(
handler
,
OnAlias
(
_
,
1
));
...
...
@@ -984,10 +991,12 @@ TEST_F(HandlerSpecTest, Ex7_1_AliasNodes) {
EXPECT_CALL
(
handler
,
OnDocumentStart
(
_
));
EXPECT_CALL
(
handler
,
OnMapStart
(
_
,
"?"
,
0
,
EmitterStyle
::
Block
));
EXPECT_CALL
(
handler
,
OnScalar
(
_
,
"?"
,
0
,
"First occurrence"
));
EXPECT_CALL
(
handler
,
OnAnchor
(
_
,
"anchor"
));
EXPECT_CALL
(
handler
,
OnScalar
(
_
,
"?"
,
1
,
"Foo"
));
EXPECT_CALL
(
handler
,
OnScalar
(
_
,
"?"
,
0
,
"Second occurrence"
));
EXPECT_CALL
(
handler
,
OnAlias
(
_
,
1
));
EXPECT_CALL
(
handler
,
OnScalar
(
_
,
"?"
,
0
,
"Override anchor"
));
EXPECT_CALL
(
handler
,
OnAnchor
(
_
,
"anchor"
));
EXPECT_CALL
(
handler
,
OnScalar
(
_
,
"?"
,
2
,
"Bar"
));
EXPECT_CALL
(
handler
,
OnScalar
(
_
,
"?"
,
0
,
"Reuse anchor"
));
EXPECT_CALL
(
handler
,
OnAlias
(
_
,
2
));
...
...
@@ -1307,6 +1316,7 @@ TEST_F(HandlerSpecTest, Ex7_24_FlowNodes) {
EXPECT_CALL
(
handler
,
OnSequenceStart
(
_
,
"?"
,
0
,
EmitterStyle
::
Block
));
EXPECT_CALL
(
handler
,
OnScalar
(
_
,
"tag:yaml.org,2002:str"
,
0
,
"a"
));
EXPECT_CALL
(
handler
,
OnScalar
(
_
,
"!"
,
0
,
"b"
));
EXPECT_CALL
(
handler
,
OnAnchor
(
_
,
"anchor"
));
EXPECT_CALL
(
handler
,
OnScalar
(
_
,
"!"
,
1
,
"c"
));
EXPECT_CALL
(
handler
,
OnAlias
(
_
,
1
));
EXPECT_CALL
(
handler
,
OnScalar
(
_
,
"tag:yaml.org,2002:str"
,
0
,
""
));
...
...
@@ -1607,5 +1617,5 @@ TEST_F(HandlerSpecTest, Ex8_22_BlockCollectionNodes) {
EXPECT_CALL
(
handler
,
OnDocumentEnd
());
Parse
(
ex8_22
);
}
}
}
}
// namespace
}
// namespace YAML
test/mock_event_handler.h
View file @
eca9cfd6
...
...
@@ -22,5 +22,6 @@ class MockEventHandler : public EventHandler {
MOCK_METHOD4
(
OnMapStart
,
void
(
const
Mark
&
,
const
std
::
string
&
,
anchor_t
,
EmitterStyle
::
value
));
MOCK_METHOD0
(
OnMapEnd
,
void
());
MOCK_METHOD2
(
OnAnchor
,
void
(
const
Mark
&
,
const
std
::
string
&
));
};
}
}
// namespace YAML
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment