Index: tools/gn/value.cc |
diff --git a/tools/gn/value.cc b/tools/gn/value.cc |
index 1fb7155dc1b609d410f884d5f3163b7b016ca760..3632ddf4a80c5b1cfaab255c00b2467ca92d2cd5 100644 |
--- a/tools/gn/value.cc |
+++ b/tools/gn/value.cc |
@@ -5,6 +5,7 @@ |
#include "tools/gn/value.h" |
#include "base/strings/string_number_conversions.h" |
+#include "base/strings/string_util.h" |
#include "tools/gn/scope.h" |
Value::Value() |
@@ -130,8 +131,17 @@ std::string Value::ToString(bool quote_string) const { |
case INTEGER: |
return base::Int64ToString(int_value_); |
case STRING: |
- if (quote_string) |
- return "\"" + string_value_ + "\""; |
+ if (quote_string) { |
+ std::string escaped = string_value_; |
+ // First escape all special uses of a backslash. |
+ ReplaceSubstringsAfterOffset(&escaped, 0, "\\$", "\\\\$"); |
+ ReplaceSubstringsAfterOffset(&escaped, 0, "\\\"", "\\\\\""); |
+ |
+ // Now escape special chars. |
+ ReplaceSubstringsAfterOffset(&escaped, 0, "$", "\\$"); |
+ ReplaceSubstringsAfterOffset(&escaped, 0, "\"", "\\\""); |
+ return "\"" + escaped + "\""; |
+ } |
return string_value_; |
case LIST: { |
std::string result = "["; |