Emit the correct Alias on the key (#908) (#929)

This commit is contained in:
Chen 2020-07-28 02:49:04 +08:00 committed by GitHub
parent 1c9abc8fa4
commit 98acc5a887
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 30 additions and 0 deletions

View File

@ -504,6 +504,9 @@ void Emitter::FlowMapPrepareSimpleKeyValue(EmitterNodeType::value child) {
if (m_stream.comment()) if (m_stream.comment())
m_stream << "\n"; m_stream << "\n";
m_stream << IndentTo(lastIndent); m_stream << IndentTo(lastIndent);
if (m_pState->HasAlias()) {
m_stream << " ";
}
m_stream << ":"; m_stream << ":";
} }
@ -643,6 +646,9 @@ void Emitter::BlockMapPrepareSimpleKeyValue(EmitterNodeType::value child) {
const std::size_t nextIndent = curIndent + m_pState->CurGroupIndent(); const std::size_t nextIndent = curIndent + m_pState->CurGroupIndent();
if (!m_pState->HasBegunNode()) { if (!m_pState->HasBegunNode()) {
if (m_pState->HasAlias()) {
m_stream << " ";
}
m_stream << ":"; m_stream << ":";
} }
@ -864,6 +870,8 @@ Emitter& Emitter::Write(const _Alias& alias) {
StartedScalar(); StartedScalar();
m_pState->SetAlias();
return *this; return *this;
} }

View File

@ -29,6 +29,7 @@ EmitterState::EmitterState()
m_groups{}, m_groups{},
m_curIndent(0), m_curIndent(0),
m_hasAnchor(false), m_hasAnchor(false),
m_hasAlias(false),
m_hasTag(false), m_hasTag(false),
m_hasNonContent(false), m_hasNonContent(false),
m_docCount(0) {} m_docCount(0) {}
@ -53,6 +54,8 @@ void EmitterState::SetLocalValue(EMITTER_MANIP value) {
void EmitterState::SetAnchor() { m_hasAnchor = true; } void EmitterState::SetAnchor() { m_hasAnchor = true; }
void EmitterState::SetAlias() { m_hasAlias = true; }
void EmitterState::SetTag() { m_hasTag = true; } void EmitterState::SetTag() { m_hasTag = true; }
void EmitterState::SetNonContent() { m_hasNonContent = true; } void EmitterState::SetNonContent() { m_hasNonContent = true; }
@ -87,6 +90,7 @@ void EmitterState::StartedNode() {
} }
m_hasAnchor = false; m_hasAnchor = false;
m_hasAlias = false;
m_hasTag = false; m_hasTag = false;
m_hasNonContent = false; m_hasNonContent = false;
} }

View File

@ -43,6 +43,7 @@ class EmitterState {
// node handling // node handling
void SetAnchor(); void SetAnchor();
void SetAlias();
void SetTag(); void SetTag();
void SetNonContent(); void SetNonContent();
void SetLongKey(); void SetLongKey();
@ -65,6 +66,7 @@ class EmitterState {
std::size_t LastIndent() const; std::size_t LastIndent() const;
std::size_t CurIndent() const { return m_curIndent; } std::size_t CurIndent() const { return m_curIndent; }
bool HasAnchor() const { return m_hasAnchor; } bool HasAnchor() const { return m_hasAnchor; }
bool HasAlias() const { return m_hasAlias; }
bool HasTag() const { return m_hasTag; } bool HasTag() const { return m_hasTag; }
bool HasBegunNode() const { bool HasBegunNode() const {
return m_hasAnchor || m_hasTag || m_hasNonContent; return m_hasAnchor || m_hasTag || m_hasNonContent;
@ -187,6 +189,7 @@ class EmitterState {
std::vector<std::unique_ptr<Group>> m_groups; std::vector<std::unique_ptr<Group>> m_groups;
std::size_t m_curIndent; std::size_t m_curIndent;
bool m_hasAnchor; bool m_hasAnchor;
bool m_hasAlias;
bool m_hasTag; bool m_hasTag;
bool m_hasNonContent; bool m_hasNonContent;
std::size_t m_docCount; std::size_t m_docCount;

View File

@ -430,6 +430,21 @@ TEST_F(EmitterTest, AliasAndAnchor) {
ExpectEmit("- &fred\n name: Fred\n age: 42\n- *fred"); ExpectEmit("- &fred\n name: Fred\n age: 42\n- *fred");
} }
TEST_F(EmitterTest, AliasOnKey) {
out << BeginSeq;
out << Anchor("name") << "Name";
out << BeginMap;
out << Key << Alias("name") << Value << "Fred";
out << EndMap;
out << Flow << BeginMap;
out << Key << Alias("name") << Value << "Mike";
out << EndMap;
out << EndSeq;
ExpectEmit(R"(- &name Name
- *name : Fred
- {*name : Mike})");
}
TEST_F(EmitterTest, AliasAndAnchorWithNull) { TEST_F(EmitterTest, AliasAndAnchorWithNull) {
out << BeginSeq; out << BeginSeq;
out << Anchor("fred") << Null; out << Anchor("fred") << Null;