Commit 69b90e0681

hryx <codroid@gmail.com>
2019-06-24 00:06:16
transStringLiteral
1 parent b2e06c3
Changed files (2)
src-self-hosted
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;
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,