| ... | @@ -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]; |
| ... | @@ -1760,6 +1764,21 @@ static AstNode *trans_call_expr(Context *c, bool result_used, AstNode *block, Ca | ... | @@ -1760,6 +1764,21 @@ static AstNode *trans_call_expr(Context *c, bool result_used, AstNode *block, Ca |
| 1760 | return node; | 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 | static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *stmt, TransLRValue lrvalue) { | 1782 | static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *stmt, TransLRValue lrvalue) { |
| 1764 | Stmt::StmtClass sc = stmt->getStmtClass(); | 1783 | Stmt::StmtClass sc = stmt->getStmtClass(); |
| 1765 | switch (sc) { | 1784 | switch (sc) { |
| ... | @@ -1789,7 +1808,10 @@ static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *s | ... | @@ -1789,7 +1808,10 @@ static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *s |
| 1789 | return trans_if_statement(c, block, (IfStmt *)stmt); | 1808 | return trans_if_statement(c, block, (IfStmt *)stmt); |
| 1790 | case Stmt::CallExprClass: | 1809 | case Stmt::CallExprClass: |
| 1791 | return trans_call_expr(c, result_used, block, (CallExpr *)stmt); | 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 | case Stmt::CaseStmtClass: | 1815 | case Stmt::CaseStmtClass: |
| 1794 | emit_warning(c, stmt->getLocStart(), "TODO handle C CaseStmtClass"); | 1816 | emit_warning(c, stmt->getLocStart(), "TODO handle C CaseStmtClass"); |
| 1795 | return nullptr; | 1817 | return nullptr; |
| ... | @@ -2034,9 +2056,6 @@ static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *s | ... | @@ -2034,9 +2056,6 @@ static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *s |
| 2034 | case Stmt::MaterializeTemporaryExprClass: | 2056 | case Stmt::MaterializeTemporaryExprClass: |
| 2035 | emit_warning(c, stmt->getLocStart(), "TODO handle C MaterializeTemporaryExprClass"); | 2057 | emit_warning(c, stmt->getLocStart(), "TODO handle C MaterializeTemporaryExprClass"); |
| 2036 | return nullptr; | 2058 | return nullptr; |
| 2037 | case Stmt::MemberExprClass: | | |
| 2038 | emit_warning(c, stmt->getLocStart(), "TODO handle C MemberExprClass"); | | |
| 2039 | return nullptr; | | |
| 2040 | case Stmt::NoInitExprClass: | 2059 | case Stmt::NoInitExprClass: |
| 2041 | emit_warning(c, stmt->getLocStart(), "TODO handle C NoInitExprClass"); | 2060 | emit_warning(c, stmt->getLocStart(), "TODO handle C NoInitExprClass"); |
| 2042 | return nullptr; | 2061 | return nullptr; |
| ... | @@ -2159,9 +2178,6 @@ static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *s | ... | @@ -2159,9 +2178,6 @@ static AstNode *trans_stmt(Context *c, bool result_used, AstNode *block, Stmt *s |
| 2159 | case Stmt::MSDependentExistsStmtClass: | 2178 | case Stmt::MSDependentExistsStmtClass: |
| 2160 | emit_warning(c, stmt->getLocStart(), "TODO handle C MSDependentExistsStmtClass"); | 2179 | emit_warning(c, stmt->getLocStart(), "TODO handle C MSDependentExistsStmtClass"); |
| 2161 | return nullptr; | 2180 | return nullptr; |
| 2162 | case Stmt::NullStmtClass: | | |
| 2163 | emit_warning(c, stmt->getLocStart(), "TODO handle C NullStmtClass"); | | |
| 2164 | return nullptr; | | |
| 2165 | case Stmt::OMPAtomicDirectiveClass: | 2181 | case Stmt::OMPAtomicDirectiveClass: |
| 2166 | emit_warning(c, stmt->getLocStart(), "TODO handle C OMPAtomicDirectiveClass"); | 2182 | emit_warning(c, stmt->getLocStart(), "TODO handle C OMPAtomicDirectiveClass"); |
| 2167 | return nullptr; | 2183 | return nullptr; |