X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;f=parser.c;h=1f071a74a412e1dc8c70dee469f7e5099abebf2a;hb=ec439d788086e95450c9331ea9d43e9299ce1ffc;hp=8bde63a2b99e9e7aa0917767f1c47f286e167d51;hpb=1c81c27ceedcd88868a05676514b34f0454a1f94;p=xonotic%2Fgmqcc.git diff --git a/parser.c b/parser.c index 8bde63a..1f071a7 100644 --- a/parser.c +++ b/parser.c @@ -292,6 +292,8 @@ static ast_value *parser_parse_type(parser_t *parser, int basetype, bool *isfunc *isfunc = true; while (true) { ast_value *param; + ast_value *fld; + bool isfield = false; bool dummy; if (!parser_next(parser)) @@ -300,6 +302,14 @@ static ast_value *parser_parse_type(parser_t *parser, int basetype, bool *isfunc if (parser->tok == ')') break; + if (parser->tok == '.') { + isfield = true; + if (!parser_next(parser)) { + parseerror(parser, "expected field parameter type"); + goto on_error; + } + } + temptype = parser_token(parser)->constval.t; if (!parser_next(parser)) goto on_error; @@ -318,6 +328,12 @@ static ast_value *parser_parse_type(parser_t *parser, int basetype, bool *isfunc goto on_error; } + if (isfield) { + fld = ast_value_new(ctx, param->name, TYPE_FIELD); + fld->expression.next = (ast_expression*)param; + param = fld; + } + if (!paramlist_t_p_add(¶ms, param)) { parseerror(parser, "Out of memory while parsing typename"); goto on_error; @@ -2007,6 +2023,18 @@ static bool parser_do(parser_t *parser) } } + if (isfunc) { + ast_value *fval; + fval = ast_value_new(ctx, var->name, TYPE_FUNCTION); + if (!fval) { + ast_value_delete(var); + return false; + } + fval->expression.next = (ast_expression*)var; + MEM_VECTOR_MOVE(&var->expression, params, &fval->expression, params); + var = fval; + } + /* turn it into a field */ fld = ast_value_new(ctx, parser_tokval(parser), TYPE_FIELD); fld->expression.next = (ast_expression*)var;