| ... | ... | @@ -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]; |
| ... | ... | @@ -1763,6 +1767,21 @@ static AstNode *trans_call_expr(Context *c, bool result_used, AstNode *block, Ca |
| 1763 | 1767 | return node; |
| 1764 | 1768 | } |
| 1765 | 1769 | |
| 1770 | static AstNode *trans_member_expr(Context *c, AstNode *block, MemberExpr *stmt) { |
| 1771 | AstNode *container_node = trans_expr(c, true, block, stmt->getBase(), TransRValue); |
| 1772 | if (container_node == nullptr) |
| 1773 | return nullptr; |
| 1774 | |
| 1775 | if (stmt->isArrow()) { |
| 1776 | container_node = trans_create_node_unwrap_null(c, container_node); |
| 1777 | } |
| 1778 | |
| 1779 | const char *name = decl_name(stmt->getMemberDecl()); |
| 1780 | |
| 1781 | AstNode *node = trans_create_node_field_access_str(c, container_node, name); |
| 1782 | return node; |
| 1783 | } |
| 1784 | |
| 1766 | 1785 | static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *stmt, TransLRValue lrvalue) { |
| 1767 | 1786 | Stmt::StmtClass sc = stmt->getStmtClass(); |
| 1768 | 1787 | switch (sc) { |
| ... | ... | @@ -1793,6 +1812,8 @@ static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *s |
| 1793 | 1812 | case Stmt::CallExprClass: |
| 1794 | 1813 | return trans_call_expr(c, result_used, block, (CallExpr *)stmt); |
| 1795 | 1814 | |
| 1815 | case Stmt::MemberExprClass: |
| 1816 | return trans_member_expr(c, block, (MemberExpr *)stmt); |
| 1796 | 1817 | case Stmt::CaseStmtClass: |
| 1797 | 1818 | emit_warning(c, stmt->getLocStart(), "TODO handle C CaseStmtClass"); |
| 1798 | 1819 | return nullptr; |
| ... | ... | @@ -2037,9 +2058,6 @@ static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *s |
| 2037 | 2058 | case Stmt::MaterializeTemporaryExprClass: |
| 2038 | 2059 | emit_warning(c, stmt->getLocStart(), "TODO handle C MaterializeTemporaryExprClass"); |
| 2039 | 2060 | return nullptr; |
| 2040 | | case Stmt::MemberExprClass: |
| 2041 | | emit_warning(c, stmt->getLocStart(), "TODO handle C MemberExprClass"); |
| 2042 | | return nullptr; |
| 2043 | 2061 | case Stmt::NoInitExprClass: |
| 2044 | 2062 | emit_warning(c, stmt->getLocStart(), "TODO handle C NoInitExprClass"); |
| 2045 | 2063 | return nullptr; |