From 69b90e0681bb42980eeb8364e50686a1f9702eb5 Mon Sep 17 00:00:00 2001 From: hryx Date: Sun, 23 Jun 2019 15:06:16 -0700 Subject: [PATCH] transStringLiteral --- src-self-hosted/clang.zig | 3 +++ src-self-hosted/translate_c.zig | 36 +++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/src-self-hosted/clang.zig b/src-self-hosted/clang.zig index d48c57c0a..1aa4cbfd6 100644 --- a/src-self-hosted/clang.zig +++ b/src-self-hosted/clang.zig @@ -965,3 +965,6 @@ pub extern fn ZigClangBinaryOperator_getOpcode(*const ZigClangBinaryOperator) Zi pub extern fn ZigClangBinaryOperator_getBeginLoc(*const ZigClangBinaryOperator) ZigClangSourceLocation; pub extern fn ZigClangBinaryOperator_getLHS(*const ZigClangBinaryOperator) *const ZigClangExpr; pub extern fn ZigClangBinaryOperator_getRHS(*const ZigClangBinaryOperator) *const ZigClangExpr; + +pub extern fn ZigClangStringLiteral_getKind(*const ZigClangStringLiteral) ZigClangStringLiteral_StringKind; +pub extern fn ZigClangStringLiteral_getString_bytes_begin_size(*const ZigClangStringLiteral, *usize) [*c]const u8; diff --git a/src-self-hosted/translate_c.zig b/src-self-hosted/translate_c.zig index bce68f886..376515c96 100644 --- a/src-self-hosted/translate_c.zig +++ b/src-self-hosted/translate_c.zig @@ -336,6 +336,7 @@ fn transStmt( .ImplicitCastExprClass => return transImplicitCastExpr(rp, scope, @ptrCast(*const ZigClangImplicitCastExpr, stmt), result_used), .IntegerLiteralClass => return transIntegerLiteral(rp, scope, @ptrCast(*const ZigClangIntegerLiteral, stmt), result_used), .ReturnStmtClass => return transReturnStmt(rp, scope, @ptrCast(*const ZigClangReturnStmt, stmt)), + .StringLiteralClass => return transStringLiteral(rp, scope, @ptrCast(*const ZigClangStringLiteral, stmt), result_used), else => { return revertAndWarn( rp, @@ -647,6 +648,41 @@ fn transReturnStmt( }; } +fn transStringLiteral( + rp: RestorePoint, + scope: *Scope, + stmt: *const ZigClangStringLiteral, + result_used: ResultUsed, +) !TransResult { + const kind = ZigClangStringLiteral_getKind(stmt); + switch (kind) { + .Ascii, .UTF8 => { + var len: usize = undefined; + const cstr = ZigClangStringLiteral_getString_bytes_begin_size(stmt, &len); + const zstr = try rp.c.str(cstr); + const token = try appendToken(rp.c, .StringLiteral, zstr); + const node = try rp.c.a().create(ast.Node.StringLiteral); + node.* = ast.Node.StringLiteral{ + .base = ast.Node{ .id = .StringLiteral }, + .token = token, + }; + const res = TransResult{ + .node = &node.base, + .child_scope = scope, + .node_scope = scope, + }; + return maybeSuppressResult(rp, scope, result_used, res); + }, + .UTF16, .UTF32, .Wide => return revertAndWarn( + rp, + error.UnsupportedTranslation, + ZigClangStmt_getBeginLoc(@ptrCast(*const ZigClangStmt, stmt)), + "TODO: support string literal kind {}", + kind, + ), + } +} + fn transCCast( rp: RestorePoint, scope: *Scope,