diff options
| author | hryx <codroid@gmail.com> | 2019-06-23 15:06:16 -0700 |
|---|---|---|
| committer | hryx <codroid@gmail.com> | 2019-06-23 15:06:16 -0700 |
| commit | 69b90e0681bb42980eeb8364e50686a1f9702eb5 (patch) | |
| tree | c717f2e9981f10b75c60dac5c3f81b368ffaf2a4 /src-self-hosted | |
| parent | b2e06c3bf41669e02f07525bb483efedf2d77b95 (diff) | |
| download | zig-69b90e0681bb42980eeb8364e50686a1f9702eb5.tar.gz zig-69b90e0681bb42980eeb8364e50686a1f9702eb5.zip | |
transStringLiteral
Diffstat (limited to 'src-self-hosted')
| -rw-r--r-- | src-self-hosted/clang.zig | 3 | ||||
| -rw-r--r-- | src-self-hosted/translate_c.zig | 36 |
2 files changed, 39 insertions, 0 deletions
diff --git a/src-self-hosted/clang.zig b/src-self-hosted/clang.zig index d48c57c0a4..1aa4cbfd6c 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 bce68f8865..376515c961 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, |
