diff options
| author | gingerBill <bill@gingerbill.org> | 2018-06-17 10:48:50 +0100 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2018-06-17 10:48:50 +0100 |
| commit | e5aff6fd6d88c58b9ac4d303a97c5990f6f622b0 (patch) | |
| tree | 88d4e9b2e6d126e69ad701cbf01a9e0c4405fca9 /src/parser.cpp | |
| parent | 3eb8aa826823197bf0be223f9bccffdfeb366ebd (diff) | |
Minimize AstNode size
Diffstat (limited to 'src/parser.cpp')
| -rw-r--r-- | src/parser.cpp | 21 |
1 files changed, 8 insertions, 13 deletions
diff --git a/src/parser.cpp b/src/parser.cpp index 58e5647a7..cc6bead02 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -283,7 +283,7 @@ AstNode *clone_ast_node(gbAllocator a, AstNode *node) { case AstNode_ForeignBlockDecl: n->ForeignBlockDecl.foreign_library = clone_ast_node(a, n->ForeignBlockDecl.foreign_library); - n->ForeignBlockDecl.decls = clone_ast_node_array(a, n->ForeignBlockDecl.decls); + n->ForeignBlockDecl.body = clone_ast_node(a, n->ForeignBlockDecl.body); n->ForeignBlockDecl.attributes = clone_ast_node_array(a, n->ForeignBlockDecl.attributes); break; case AstNode_Label: @@ -946,14 +946,12 @@ AstNode *ast_map_type(AstFile *f, Token token, AstNode *key, AstNode *value) { } -AstNode *ast_foreign_block_decl(AstFile *f, Token token, AstNode *foreign_library, Token open, Token close, Array<AstNode *> decls, +AstNode *ast_foreign_block_decl(AstFile *f, Token token, AstNode *foreign_library, AstNode *body, CommentGroup *docs) { AstNode *result = alloc_ast_node(f, AstNode_ForeignBlockDecl); result->ForeignBlockDecl.token = token; result->ForeignBlockDecl.foreign_library = foreign_library; - result->ForeignBlockDecl.open = open; - result->ForeignBlockDecl.close = close; - result->ForeignBlockDecl.decls = decls; + result->ForeignBlockDecl.body = body; result->ForeignBlockDecl.docs = docs; result->ForeignBlockDecl.attributes.allocator = heap_allocator(); @@ -1261,6 +1259,7 @@ bool is_semicolon_optional_for_node(AstFile *f, AstNode *s) { switch (s->kind) { case AstNode_EmptyStmt: + case AstNode_BlockStmt: return true; case AstNode_IfStmt: @@ -1303,13 +1302,7 @@ bool is_semicolon_optional_for_node(AstFile *f, AstNode *s) { break; case AstNode_ForeignBlockDecl: - if (s->ForeignBlockDecl.close.pos.line != 0) { - return true; - } - if (s->ForeignBlockDecl.decls.count == 1) { - return is_semicolon_optional_for_node(f, s->ForeignBlockDecl.decls[0]); - } - break; + return is_semicolon_optional_for_node(f, s->ForeignBlockDecl.body); } return false; @@ -2401,7 +2394,9 @@ AstNode *parse_foreign_block(AstFile *f, Token token) { close = expect_token(f, Token_CloseBrace); - AstNode *decl = ast_foreign_block_decl(f, token, foreign_library, open, close, decls, docs); + AstNode *body = ast_block_stmt(f, decls, open, close); + + AstNode *decl = ast_foreign_block_decl(f, token, foreign_library, body, docs); expect_semicolon(f, decl); return decl; } |