| ... | @@ -291,6 +291,10 @@ static AstNode *trans_create_node_inline_fn(Context *c, Buf *fn_name, Buf *var_n | ... | @@ -291,6 +291,10 @@ static AstNode *trans_create_node_inline_fn(Context *c, Buf *fn_name, Buf *var_n |
| 291 | return fn_def; | 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 | static AstNode *get_global(Context *c, Buf *name) { | 298 | static AstNode *get_global(Context *c, Buf *name) { |
| 295 | for (size_t i = 0; i < c->root->data.root.top_level_decls.length; i += 1) { | 299 | for (size_t i = 0; i < c->root->data.root.top_level_decls.length; i += 1) { |
| 296 | AstNode *decl_node = c->root->data.root.top_level_decls.items[i]; | 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,6 +1767,21 @@ static AstNode *trans_call_expr(Context *c, bool result_used, AstNode *block, Ca |
| 1763 | return node; | 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 | static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *stmt, TransLRValue lrvalue) { | 1785 | static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *stmt, TransLRValue lrvalue) { |
| 1767 | Stmt::StmtClass sc = stmt->getStmtClass(); | 1786 | Stmt::StmtClass sc = stmt->getStmtClass(); |
| 1768 | switch (sc) { | 1787 | switch (sc) { |
| ... | @@ -1793,6 +1812,8 @@ static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *s | ... | @@ -1793,6 +1812,8 @@ static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *s |
| 1793 | case Stmt::CallExprClass: | 1812 | case Stmt::CallExprClass: |
| 1794 | return trans_call_expr(c, result_used, block, (CallExpr *)stmt); | 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 | case Stmt::CaseStmtClass: | 1817 | case Stmt::CaseStmtClass: |
| 1797 | emit_warning(c, stmt->getLocStart(), "TODO handle C CaseStmtClass"); | 1818 | emit_warning(c, stmt->getLocStart(), "TODO handle C CaseStmtClass"); |
| 1798 | return nullptr; | 1819 | return nullptr; |
| ... | @@ -2037,9 +2058,6 @@ static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *s | ... | @@ -2037,9 +2058,6 @@ static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *s |
| 2037 | case Stmt::MaterializeTemporaryExprClass: | 2058 | case Stmt::MaterializeTemporaryExprClass: |
| 2038 | emit_warning(c, stmt->getLocStart(), "TODO handle C MaterializeTemporaryExprClass"); | 2059 | emit_warning(c, stmt->getLocStart(), "TODO handle C MaterializeTemporaryExprClass"); |
| 2039 | return nullptr; | 2060 | return nullptr; |
| 2040 | case Stmt::MemberExprClass: | | |
| 2041 | emit_warning(c, stmt->getLocStart(), "TODO handle C MemberExprClass"); | | |
| 2042 | return nullptr; | | |
| 2043 | case Stmt::NoInitExprClass: | 2061 | case Stmt::NoInitExprClass: |
| 2044 | emit_warning(c, stmt->getLocStart(), "TODO handle C NoInitExprClass"); | 2062 | emit_warning(c, stmt->getLocStart(), "TODO handle C NoInitExprClass"); |
| 2045 | return nullptr; | 2063 | return nullptr; |