summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJohn Hodge <tpg@mutabah.net>2016-03-26 08:29:26 +0800
committerJohn Hodge <tpg@mutabah.net>2016-03-26 08:29:26 +0800
commit210b1a17340e3ed3a8da9c29588f5a0db0d5e435 (patch)
tree892fe76050862cdc37ae80400d91fa91f29b8aab /src
parente9a844be4715db43ef4930eb0cbabd5e6219469f (diff)
downloadmrust-210b1a17340e3ed3a8da9c29588f5a0db0d5e435.tar.gz
Parse - Escape strings when debuging
Diffstat (limited to 'src')
-rw-r--r--src/expand/mod.cpp5
-rw-r--r--src/parse/lex.cpp40
2 files changed, 39 insertions, 6 deletions
diff --git a/src/expand/mod.cpp b/src/expand/mod.cpp
index 49fbad89..1fdf56c1 100644
--- a/src/expand/mod.cpp
+++ b/src/expand/mod.cpp
@@ -241,7 +241,6 @@ struct CExpandExpr:
if( n_mac->m_name == "" )
cnode.reset();
}
- DEBUG("replacement = " << replacement.get());
if( this->replacement ) {
cnode = mv$(this->replacement);
}
@@ -277,7 +276,7 @@ struct CExpandExpr:
void visit(::AST::ExprNode_Macro& node) override
{
- TRACE_FUNCTION_F("name = " << node.m_name);
+ TRACE_FUNCTION_F("ExprNode_Macro - name = " << node.m_name);
auto& mod = this->cur_mod();
auto ttl = Expand_Macro(
is_early, crate, modstack, mod,
@@ -297,7 +296,7 @@ struct CExpandExpr:
// And schedule it to replace the previous
replacement = mv$(newexpr);
}
- DEBUG("replacement = " << replacement.get());
+ DEBUG("ExprNode_Macro - replacement = " << replacement.get());
node.m_name = "";
}
}
diff --git a/src/parse/lex.cpp b/src/parse/lex.cpp
index 0e928bf2..0ed05123 100644
--- a/src/parse/lex.cpp
+++ b/src/parse/lex.cpp
@@ -976,6 +976,40 @@ enum eTokenType Token::typefromstr(const ::std::string& s)
return TOK_NULL;
}
+struct EscapedString {
+ const ::std::string& s;
+ EscapedString(const ::std::string& s): s(s) {}
+
+ friend ::std::ostream& operator<<(::std::ostream& os, const EscapedString& x) {
+ for(auto b : x.s) {
+ if( b < 0 || b >= 128 ) {
+ os << b;
+ }
+ else {
+ switch(b)
+ {
+ case '"':
+ os << "\\\"";
+ break;
+ case '\\':
+ os << "\\\\";
+ break;
+ case '\n':
+ os << "\\n";
+ break;
+ default:
+ if( ' ' <= b && b < 0x7F )
+ os << b;
+ else
+ os << "\\u{" << ::std::hex << (unsigned int)b << "}";
+ break;
+ }
+ }
+ }
+ return os;
+ }
+};
+
::std::string Token::to_str() const
{
switch(m_type)
@@ -993,8 +1027,8 @@ enum eTokenType Token::typefromstr(const ::std::string& s)
case TOK_INTEGER: return FMT(m_intval); // TODO: suffix for type
case TOK_CHAR: return FMT("'\\u{"<< ::std::hex << m_intval << "}");
case TOK_FLOAT: return FMT(m_floatval);
- case TOK_STRING: return "\"" + m_str + "\"";
- case TOK_BYTESTRING:return "b\"" + m_str + "\"";
+ case TOK_STRING: return FMT("\"" << EscapedString(m_str) << "\"");
+ case TOK_BYTESTRING:return FMT("b\"" << m_str << "\"");
case TOK_CATTR_OPEN:return "#![";
case TOK_ATTR_OPEN: return "#[";
case TOK_UNDERSCORE:return "_";
@@ -1146,7 +1180,7 @@ SERIALISE_TYPE_S(Token, {
case TOK_IDENT:
case TOK_MACRO:
case TOK_LIFETIME:
- os << "\"" << tok.str() << "\"";
+ os << "\"" << EscapedString(tok.str()) << "\"";
break;
case TOK_INTEGER:
os << ":" << tok.intval();