From: Wolfgang (Blub) Bumiller Date: Sun, 25 Nov 2012 16:37:54 +0000 (+0100) Subject: multiple dots to start a field type, ie ..float for a fieldpointer field X-Git-Tag: 0.1.9~264 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=2884556fe3a9db69a622a67e59698d70db63a5c2;p=xonotic%2Fgmqcc.git multiple dots to start a field type, ie ..float for a fieldpointer field --- diff --git a/parser.c b/parser.c index 83a5a48..650de16 100644 --- a/parser.c +++ b/parser.c @@ -3198,6 +3198,7 @@ static ast_value *parse_typename(parser_t *parser, ast_value **storebase, ast_va const char *name = NULL; bool isfield = false; bool wasarray = false; + size_t morefields = 0; ctx = parser_ctx(parser); @@ -3217,12 +3218,30 @@ static ast_value *parse_typename(parser_t *parser, ast_value **storebase, ast_va } } + /* Further dots are handled seperately because they won't be part of the + * basetype + */ + while (parser->tok == '.') { + ++morefields; + if (!parser_next(parser)) { + parseerror(parser, "expected typename for field definition"); + return NULL; + } + } + /* generate the basic type value */ if (cached_typedef) { var = ast_value_copy(cached_typedef); ast_value_set_name(var, ""); } else var = ast_value_new(ctx, "", parser_token(parser)->constval.t); + + for (; morefields; --morefields) { + tmp = ast_value_new(ctx, "<.type>", TYPE_FIELD); + tmp->expression.next = (ast_expression*)var; + var = tmp; + } + /* do not yet turn into a field - remember: * .void() foo; is a field too * .void()() foo; is a function diff --git a/tests/fieldparams.qc b/tests/fieldparams.qc index 9ca71d6..8e5cb03 100644 --- a/tests/fieldparams.qc +++ b/tests/fieldparams.qc @@ -3,6 +3,7 @@ entity() spawn = #3; .string a; .string b; +..string ps; void(entity e, .string s) callout = { print(e.s, "\n"); @@ -14,4 +15,6 @@ void() main = { e.a = "foo"; e.b = "bar"; callout(e, b); + e.ps = a; + print(e.(e.ps), "\n"); }; diff --git a/tests/fieldparams.tmpl b/tests/fieldparams.tmpl index 7d5217f..5e1af6e 100644 --- a/tests/fieldparams.tmpl +++ b/tests/fieldparams.tmpl @@ -6,3 +6,4 @@ E: $null F: field paramaters fail S: field paramaters work M: bar +M: foo