| ... | ... | @@ -291,6 +291,10 @@ static AstNode *trans_create_node_inline_fn(Context *c, Buf *fn_name, Buf *var_n |
| 291 | 291 | return fn_def; |
| 292 | 292 | } |
| 293 | 293 | |
| 294 | static AstNode *trans_create_node_unwrap_null(Context *c, AstNode *child) { |
| 295 | return trans_create_node_prefix_op(c, PrefixOpUnwrapMaybe, child); |
| 296 | } |
| 297 | |
| 294 | 298 | static AstNode *get_global(Context *c, Buf *name) { |
| 295 | 299 | for (size_t i = 0; i < c->root->data.root.top_level_decls.length; i += 1) { |
| 296 | 300 | AstNode *decl_node = c->root->data.root.top_level_decls.items[i]; |
| ... | ... | @@ -1760,6 +1764,21 @@ static AstNode *trans_call_expr(Context *c, bool result_used, AstNode *block, Ca |
| 1760 | 1764 | return node; |
| 1761 | 1765 | } |
| 1762 | 1766 | |
| 1767 | static AstNode *trans_member_expr(Context *c, AstNode *block, MemberExpr *stmt) { |
| 1768 | AstNode *container_node = trans_expr(c, true, block, stmt->getBase(), TransRValue); |
| 1769 | if (container_node == nullptr) |
| 1770 | return nullptr; |
| 1771 | |
| 1772 | if (stmt->isArrow()) { |
| 1773 | container_node = trans_create_node_unwrap_null(c, container_node); |
| 1774 | } |
| 1775 | |
| 1776 | const char *name = decl_name(stmt->getMemberDecl()); |
| 1777 | |
| 1778 | AstNode *node = trans_create_node_field_access_str(c, container_node, name); |
| 1779 | return node; |
| 1780 | } |
| 1781 | |
| 1763 | 1782 | static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *stmt, TransLRValue lrvalue) { |
| 1764 | 1783 | Stmt::StmtClass sc = stmt->getStmtClass(); |
| 1765 | 1784 | switch (sc) { |
| ... | ... | @@ -1789,7 +1808,10 @@ static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *s |
| 1789 | 1808 | return trans_if_statement(c, block, (IfStmt *)stmt); |
| 1790 | 1809 | case Stmt::CallExprClass: |
| 1791 | 1810 | return trans_call_expr(c, result_used, block, (CallExpr *)stmt); |
| 1792 | | |
| 1811 | case Stmt::NullStmtClass: |
| 1812 | return skip_add_to_block_node; |
| 1813 | case Stmt::MemberExprClass: |
| 1814 | return trans_member_expr(c, block, (MemberExpr *)stmt); |
| 1793 | 1815 | case Stmt::CaseStmtClass: |
| 1794 | 1816 | emit_warning(c, stmt->getLocStart(), "TODO handle C CaseStmtClass"); |
| 1795 | 1817 | return nullptr; |
| ... | ... | @@ -2034,9 +2056,6 @@ static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *s |
| 2034 | 2056 | case Stmt::MaterializeTemporaryExprClass: |
| 2035 | 2057 | emit_warning(c, stmt->getLocStart(), "TODO handle C MaterializeTemporaryExprClass"); |
| 2036 | 2058 | return nullptr; |
| 2037 | | case Stmt::MemberExprClass: |
| 2038 | | emit_warning(c, stmt->getLocStart(), "TODO handle C MemberExprClass"); |
| 2039 | | return nullptr; |
| 2040 | 2059 | case Stmt::NoInitExprClass: |
| 2041 | 2060 | emit_warning(c, stmt->getLocStart(), "TODO handle C NoInitExprClass"); |
| 2042 | 2061 | return nullptr; |
| ... | ... | @@ -2159,9 +2178,6 @@ static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *s |
| 2159 | 2178 | case Stmt::MSDependentExistsStmtClass: |
| 2160 | 2179 | emit_warning(c, stmt->getLocStart(), "TODO handle C MSDependentExistsStmtClass"); |
| 2161 | 2180 | return nullptr; |
| 2162 | | case Stmt::NullStmtClass: |
| 2163 | | emit_warning(c, stmt->getLocStart(), "TODO handle C NullStmtClass"); |
| 2164 | | return nullptr; |
| 2165 | 2181 | case Stmt::OMPAtomicDirectiveClass: |
| 2166 | 2182 | emit_warning(c, stmt->getLocStart(), "TODO handle C OMPAtomicDirectiveClass"); |
| 2167 | 2183 | return nullptr; |