Fix: ConfigWriter::EmitScope incorrectly quotes dictionary keys

fixes #12016
This commit is contained in:
Gunnar Beutner 2016-06-22 12:34:11 +02:00
parent 067cb8d283
commit 428850a6b3
2 changed files with 20 additions and 15 deletions

View File

@ -74,7 +74,8 @@ void ConfigWriter::EmitArrayItems(std::ostream& fp, int indentLevel, const Array
} }
} }
void ConfigWriter::EmitScope(std::ostream& fp, int indentLevel, const Dictionary::Ptr& val, const Array::Ptr& imports) void ConfigWriter::EmitScope(std::ostream& fp, int indentLevel, const Dictionary::Ptr& val,
const Array::Ptr& imports, bool splitDot)
{ {
fp << "{"; fp << "{";
@ -94,18 +95,21 @@ void ConfigWriter::EmitScope(std::ostream& fp, int indentLevel, const Dictionary
BOOST_FOREACH(const Dictionary::Pair& kv, val) { BOOST_FOREACH(const Dictionary::Pair& kv, val) {
fp << "\n"; fp << "\n";
EmitIndent(fp, indentLevel); EmitIndent(fp, indentLevel);
std::vector<String> tokens; if (splitDot) {
boost::algorithm::split(tokens, kv.first, boost::is_any_of(".")); std::vector<String> tokens;
boost::algorithm::split(tokens, kv.first, boost::is_any_of("."));
EmitIdentifier(fp, tokens[0], true);
EmitIdentifier(fp, tokens[0], true);
for (std::vector<String>::size_type i = 1; i < tokens.size(); i++) {
fp << "["; for (std::vector<String>::size_type i = 1; i < tokens.size(); i++) {
EmitString(fp, tokens[i]); fp << "[";
fp << "]"; EmitString(fp, tokens[i]);
} fp << "]";
}
} else
EmitIdentifier(fp, kv.first, true);
fp << " = "; fp << " = ";
EmitValue(fp, indentLevel + 1, kv.second); EmitValue(fp, indentLevel + 1, kv.second);
} }
@ -189,7 +193,7 @@ void ConfigWriter::EmitConfigItem(std::ostream& fp, const String& type, const St
fp << " ignore_on_error"; fp << " ignore_on_error";
fp << " "; fp << " ";
EmitScope(fp, 1, attrs, imports); EmitScope(fp, 1, attrs, imports, true);
} }
void ConfigWriter::EmitComment(std::ostream& fp, const String& text) void ConfigWriter::EmitComment(std::ostream& fp, const String& text)

View File

@ -60,7 +60,8 @@ public:
static void EmitEmpty(std::ostream& fp); static void EmitEmpty(std::ostream& fp);
static void EmitArray(std::ostream& fp, int indentLevel, const Array::Ptr& val); static void EmitArray(std::ostream& fp, int indentLevel, const Array::Ptr& val);
static void EmitArrayItems(std::ostream& fp, int indentLevel, const Array::Ptr& val); static void EmitArrayItems(std::ostream& fp, int indentLevel, const Array::Ptr& val);
static void EmitScope(std::ostream& fp, int indentLevel, const Dictionary::Ptr& val, const Array::Ptr& imports = Array::Ptr()); static void EmitScope(std::ostream& fp, int indentLevel, const Dictionary::Ptr& val,
const Array::Ptr& imports = Array::Ptr(), bool splitDot = false);
static void EmitValue(std::ostream& fp, int indentLevel, const Value& val); static void EmitValue(std::ostream& fp, int indentLevel, const Value& val);
static void EmitRaw(std::ostream& fp, const String& val); static void EmitRaw(std::ostream& fp, const String& val);
static void EmitIndent(std::ostream& fp, int indentLevel); static void EmitIndent(std::ostream& fp, int indentLevel);