diff options
| author | Andrew Kelley <superjoe30@gmail.com> | 2016-02-01 17:25:38 -0700 |
|---|---|---|
| committer | Andrew Kelley <superjoe30@gmail.com> | 2016-02-01 17:25:38 -0700 |
| commit | 06f6acb4b19cab55dd8637a41c11501bf8e7158e (patch) | |
| tree | 9d8226f9f2128a91b3038d9b6d739c3b36ee15cf /src/parser.cpp | |
| parent | 122b7b99660f2ce354930749ca545b363bf7849d (diff) | |
| download | zig-06f6acb4b19cab55dd8637a41c11501bf8e7158e.tar.gz zig-06f6acb4b19cab55dd8637a41c11501bf8e7158e.zip | |
inline is a keyword instead of a directive
Diffstat (limited to 'src/parser.cpp')
| -rw-r--r-- | src/parser.cpp | 36 |
1 files changed, 19 insertions, 17 deletions
diff --git a/src/parser.cpp b/src/parser.cpp index 7e7f073722..fe17495fc4 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -82,13 +82,6 @@ static AstNode *ast_create_node(ParseContext *pc, NodeType type, Token *first_to return node; } -static AstNode *ast_create_node_with_node(ParseContext *pc, NodeType type, AstNode *other_node) { - AstNode *node = ast_create_node_no_line_info(pc, type); - node->line = other_node->line; - node->column = other_node->column; - return node; -} - static AstNode *ast_create_void_type_node(ParseContext *pc, Token *token) { AstNode *node = ast_create_node(pc, NodeTypeSymbol, token); buf_init_from_str(&node->data.symbol_expr.symbol, "void"); @@ -2240,15 +2233,26 @@ static AstNode *ast_parse_fn_proto(ParseContext *pc, int *token_index, bool mand } /* -FnDef : FnProto Block +FnDef = option("inline") FnProto Block */ static AstNode *ast_parse_fn_def(ParseContext *pc, int *token_index, bool mandatory, ZigList<AstNode*> *directives, VisibMod visib_mod) { + Token *first_token = &pc->tokens->at(*token_index); + bool is_inline; + if (first_token->id == TokenIdKeywordInline) { + *token_index += 1; + is_inline = true; + } else { + is_inline = false; + } + AstNode *fn_proto = ast_parse_fn_proto(pc, token_index, mandatory, directives, visib_mod); if (!fn_proto) return nullptr; - AstNode *node = ast_create_node_with_node(pc, NodeTypeFnDef, fn_proto); + AstNode *node = ast_create_node(pc, NodeTypeFnDef, first_token); + + fn_proto->data.fn_proto.is_inline = is_inline; node->data.fn_def.fn_proto = fn_proto; node->data.fn_def.body = ast_parse_block(pc, token_index, true); @@ -2646,8 +2650,10 @@ static void set_field(AstNode **field) { } static void set_list_fields(ZigList<AstNode*> *list) { - for (int i = 0; i < list->length; i += 1) { - set_field(&list->at(i)); + if (list) { + for (int i = 0; i < list->length; i += 1) { + set_field(&list->at(i)); + } } } @@ -2661,9 +2667,7 @@ void normalize_parent_ptrs(AstNode *node) { break; case NodeTypeFnProto: set_field(&node->data.fn_proto.return_type); - if (node->data.fn_proto.directives) { - set_list_fields(node->data.fn_proto.directives); - } + set_list_fields(node->data.fn_proto.directives); set_list_fields(&node->data.fn_proto.params); break; case NodeTypeFnDef: @@ -2686,9 +2690,7 @@ void normalize_parent_ptrs(AstNode *node) { set_field(&node->data.return_expr.expr); break; case NodeTypeVariableDeclaration: - if (node->data.variable_declaration.directives) { - set_list_fields(node->data.variable_declaration.directives); - } + set_list_fields(node->data.variable_declaration.directives); set_field(&node->data.variable_declaration.type); set_field(&node->data.variable_declaration.expr); break; |
