fix bug from issue298:Emitter stylings settings overridden by node settings.

This commit is contained in:
dota17 2020-06-20 15:04:56 +08:00
parent 5a9ab177ba
commit 1374c643a2
6 changed files with 39 additions and 0 deletions

View File

@ -58,6 +58,7 @@ class YAML_CPP_API Emitter {
bool SetPostCommentIndent(std::size_t n); bool SetPostCommentIndent(std::size_t n);
bool SetFloatPrecision(std::size_t n); bool SetFloatPrecision(std::size_t n);
bool SetDoublePrecision(std::size_t n); bool SetDoublePrecision(std::size_t n);
void RestoreGlobalModifiedSettings();
// local setters // local setters
Emitter& SetLocalValue(EMITTER_MANIP value); Emitter& SetLocalValue(EMITTER_MANIP value);

View File

@ -59,6 +59,8 @@ void EmitFromEvents::OnSequenceStart(const Mark&, const std::string& tag,
default: default:
break; break;
} }
// Restore the global settings to eliminate the override from node style
m_emitter.RestoreGlobalModifiedSettings();
m_emitter << BeginSeq; m_emitter << BeginSeq;
m_stateStack.push(State::WaitingForSequenceEntry); m_stateStack.push(State::WaitingForSequenceEntry);
} }
@ -83,6 +85,8 @@ void EmitFromEvents::OnMapStart(const Mark&, const std::string& tag,
default: default:
break; break;
} }
// Restore the global settings to eliminate the override from node style
m_emitter.RestoreGlobalModifiedSettings();
m_emitter << BeginMap; m_emitter << BeginMap;
m_stateStack.push(State::WaitingForKey); m_stateStack.push(State::WaitingForKey);
} }

View File

@ -86,6 +86,10 @@ bool Emitter::SetDoublePrecision(std::size_t n) {
return m_pState->SetDoublePrecision(n, FmtScope::Global); return m_pState->SetDoublePrecision(n, FmtScope::Global);
} }
void Emitter::RestoreGlobalModifiedSettings() {
m_pState->RestoreGlobalModifiedSettings();
}
// SetLocalValue // SetLocalValue
// . Either start/end a group, or set a modifier locally // . Either start/end a group, or set a modifier locally
Emitter& Emitter::SetLocalValue(EMITTER_MANIP value) { Emitter& Emitter::SetLocalValue(EMITTER_MANIP value) {

View File

@ -217,6 +217,10 @@ std::size_t EmitterState::LastIndent() const {
void EmitterState::ClearModifiedSettings() { m_modifiedSettings.clear(); } void EmitterState::ClearModifiedSettings() { m_modifiedSettings.clear(); }
void EmitterState::RestoreGlobalModifiedSettings() {
m_globalModifiedSettings.restore();
}
bool EmitterState::SetOutputCharset(EMITTER_MANIP value, bool EmitterState::SetOutputCharset(EMITTER_MANIP value,
FmtScope::value scope) { FmtScope::value scope) {
switch (value) { switch (value) {

View File

@ -72,6 +72,7 @@ class EmitterState {
bool HasBegunContent() const { return m_hasAnchor || m_hasTag; } bool HasBegunContent() const { return m_hasAnchor || m_hasTag; }
void ClearModifiedSettings(); void ClearModifiedSettings();
void RestoreGlobalModifiedSettings();
// formatters // formatters
void SetLocalValue(EMITTER_MANIP value); void SetLocalValue(EMITTER_MANIP value);

View File

@ -732,6 +732,31 @@ TEST_F(EmitterTest, GlobalLongKeyOnMap) {
: *value)"); : *value)");
} }
TEST_F(EmitterTest, GlobalSettingStyleOnSeqNode) {
Node n(Load(R"(foo:
- 1
- 2
- 3
bar: aa)"));
out.SetSeqFormat(YAML::Flow);
out << n;
ExpectEmit(R"(foo: [1, 2, 3]
bar: aa)");
}
TEST_F(EmitterTest, GlobalSettingStyleOnMapNode) {
Node n(Load(R"(-
foo: a
bar: b
- 2
- 3)"));
out.SetMapFormat(YAML::Flow);
out << n;
ExpectEmit(R"(- {foo: a, bar: b}
- 2
- 3)");
}
TEST_F(EmitterTest, ComplexGlobalSettings) { TEST_F(EmitterTest, ComplexGlobalSettings) {
out << BeginSeq; out << BeginSeq;
out << Block; out << Block;