aboutsummaryrefslogtreecommitdiff
path: root/src/parser.cpp
diff options
context:
space:
mode:
authorAndrew Kelley <superjoe30@gmail.com>2016-02-01 17:25:38 -0700
committerAndrew Kelley <superjoe30@gmail.com>2016-02-01 17:25:38 -0700
commit06f6acb4b19cab55dd8637a41c11501bf8e7158e (patch)
tree9d8226f9f2128a91b3038d9b6d739c3b36ee15cf /src/parser.cpp
parent122b7b99660f2ce354930749ca545b363bf7849d (diff)
downloadzig-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.cpp36
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;