From 7d97d424c0a754ec49cccfc8af6c8983e0d06d80 Mon Sep 17 00:00:00 2001 From: Tim Foley Date: Mon, 26 Jun 2017 14:09:53 -0700 Subject: Fix parsing of string literals. String literals can be used as part of attributes, but we lacked an actual AST representation for them. This change adds basic parsing for string literals, as well as emit logic for them. I also included a fix for parsing of chained right-associative operators. To test these fixes, I've re-enabled one of the HLSL tests I disabled a while back. It would be good to go through and see how many of those we can re-enable now. --- source/slang/emit.cpp | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) (limited to 'source/slang/emit.cpp') diff --git a/source/slang/emit.cpp b/source/slang/emit.cpp index eae9cd052..699294d84 100644 --- a/source/slang/emit.cpp +++ b/source/slang/emit.cpp @@ -765,6 +765,34 @@ static void emitCallExpr( emitSimpleCallExpr(context, callExpr, outerPrec); } +static void emitStringLiteral( + EmitContext* context, + String const& value) +{ + emit(context, "\""); + for (auto c : value) + { + // TODO: This needs a more complete implementation, + // especially if we want to support Unicode. + + char buffer[] = { c, 0 }; + switch (c) + { + default: + emit(context, buffer); + break; + + case '\"': emit(context, "\\\""); + case '\'': emit(context, "\\\'"); + case '\\': emit(context, "\\\\"); + case '\n': emit(context, "\\n"); + case '\r': emit(context, "\\r"); + case '\t': emit(context, "\\t"); + } + } + emit(context, "\""); +} + static void EmitExprWithPrecedence(EmitContext* context, RefPtr expr, int outerPrec) { bool needClose = false; @@ -874,6 +902,9 @@ static void EmitExprWithPrecedence(EmitContext* context, RefPtrIntValue ? "true" : "false"); break; + case ConstantExpressionSyntaxNode::ConstantType::String: + emitStringLiteral(context, litExpr->stringValue); + break; default: assert(!"unreachable"); break; -- cgit v1.2.3