mirror of
https://github.com/jbeder/yaml-cpp.git
synced 2025-09-09 04:41:16 +00:00
fix bug from issue298:Emitter stylings settings overridden by node settings. (#915)
This commit is contained in:
@@ -59,6 +59,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);
|
||||||
|
@@ -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);
|
||||||
}
|
}
|
||||||
|
@@ -90,6 +90,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) {
|
||||||
|
@@ -222,6 +222,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) {
|
||||||
|
@@ -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);
|
||||||
|
@@ -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;
|
||||||
|
Reference in New Issue
Block a user