Rust: Fix parsing of attributes in structs/enums.

Previously, things like:

struct Foo
{
    #[bar]
    baz: int
}

or

struct Foo
{
    #![bar]
    baz: int
}

would horribly confuse the parser and prevent proper parsing of the rest of the
file.
This commit is contained in:
SiegeLord 2014-03-23 12:44:17 -04:00
parent 52a179dce1
commit 2bde26b202

View File

@ -715,9 +715,29 @@ static void parseStructOrEnum (lexerState *lexer, vString *scope, int parent_kin
vString *field_name = vStringNew(); vString *field_name = vStringNew();
while (lexer->cur_token != TOKEN_EOF) while (lexer->cur_token != TOKEN_EOF)
{ {
int goal_tokens2[] = {'}', ','};
/* Skip attributes. Format:
* #[..] or #![..]
* */
if (lexer->cur_token == '#')
{
advanceToken(lexer, TRUE);
if (lexer->cur_token == '!')
advanceToken(lexer, TRUE);
if (lexer->cur_token == '[')
{
/* It's an attribute, skip it. */
skipUntil(lexer, NULL, 0);
}
else
{
/* Something's up with this field, skip to the next one */
skipUntil(lexer, goal_tokens2, 2);
continue;
}
}
if (lexer->cur_token == TOKEN_IDENT) if (lexer->cur_token == TOKEN_IDENT)
{ {
int goal_tokens2[] = {'}', ','};
if (strcmp(lexer->token_str->buffer, "priv") == 0) if (strcmp(lexer->token_str->buffer, "priv") == 0)
{ {
advanceToken(lexer, TRUE); advanceToken(lexer, TRUE);