This commit is contained in:
Hackerpilot 2014-04-15 11:36:11 -07:00
parent ddbe485c40
commit cf8f3c8eac
2 changed files with 32 additions and 9 deletions

View File

@ -1903,11 +1903,13 @@ final class NonVoidInitializer : ASTNode
public: public:
override void accept(ASTVisitor visitor) const override void accept(ASTVisitor visitor) const
{ {
mixin (visitIfNotNull!(assignExpression, arrayInitializer, structInitializer)); mixin (visitIfNotNull!(assignExpression, arrayInitializer,
structInitializer, functionBody));
} }
/** */ AssignExpression assignExpression; /** */ AssignExpression assignExpression;
/** */ ArrayInitializer arrayInitializer; /** */ ArrayInitializer arrayInitializer;
/** */ StructInitializer structInitializer; /** */ StructInitializer structInitializer;
/** */ FunctionBody functionBody;
} }

View File

@ -3782,6 +3782,7 @@ invariant() foo();
* $(RULE assignExpression) * $(RULE assignExpression)
* | $(RULE arrayInitializer) * | $(RULE arrayInitializer)
* | $(RULE structInitializer) * | $(RULE structInitializer)
* | $(RULE functionBody)
* ;) * ;)
*/ */
NonVoidInitializer parseNonVoidInitializer() NonVoidInitializer parseNonVoidInitializer()
@ -3793,6 +3794,8 @@ invariant() foo();
auto b = peekPastBraces(); auto b = peekPastBraces();
if (b !is null && (b.type == tok!"(")) if (b !is null && (b.type == tok!"("))
node.assignExpression = parseAssignExpression(); node.assignExpression = parseAssignExpression();
else if (hasMagicDelimiter!(tok!"{", tok!";")())
node.functionBody = parseFunctionBody();
else else
node.structInitializer = parseStructInitializer(); node.structInitializer = parseStructInitializer();
} }
@ -3810,8 +3813,15 @@ invariant() foo();
else else
node.assignExpression = parseAssignExpression(); node.assignExpression = parseAssignExpression();
} }
else if (currentIsOneOf(tok!"in", tok!"out", tok!"body"))
node.functionBody = parseFunctionBody();
else else
node.assignExpression = parseAssignExpression(); node.assignExpression = parseAssignExpression();
if (node.assignExpression is null && node.arrayInitializer is null
&& node.structInitializer is null && node.functionBody is null)
{
return null;
}
return node; return node;
} }
@ -5987,6 +5997,7 @@ q{doStuff(5)}c;
* *
* $(GRAMMAR $(RULEDEF variableDeclaration): * $(GRAMMAR $(RULEDEF variableDeclaration):
* $(RULE _type) $(RULE declarator) ($(LITERAL ',') $(RULE declarator))* $(LITERAL ';') * $(RULE _type) $(RULE declarator) ($(LITERAL ',') $(RULE declarator))* $(LITERAL ';')
* | $(RULE _type) $(RULE declarator) $(LITERAL '=') $(RULE functionBody)
* | $(RULE autoDeclaration) * | $(RULE autoDeclaration)
* ;) * ;)
*/ */
@ -6013,10 +6024,20 @@ q{doStuff(5)}c;
else else
break; break;
} }
node.declarators = ownArray(declarators); // node.declarators = ownArray(declarators);
// if (node.declarators.length == 1
// && node.declarators[0].initializer !is null
// && node.declarators[0].initializer.nonVoidInitializer !is null
// && node.declarators[0].initializer.nonVoidInitializer.functionBody !is null)
// {
// return node;
// }
// else
{
expect(tok!";"); expect(tok!";");
return node; return node;
} }
}
/** /**
* Parses a Vector * Parses a Vector
@ -6166,7 +6187,7 @@ q{doStuff(5)}c;
mixin(traceEnterAndExit!(__FUNCTION__)); mixin(traceEnterAndExit!(__FUNCTION__));
if (startsWith(tok!"[", tok!"]")) if (startsWith(tok!"[", tok!"]"))
return true; return true;
return hasMagicDelimiter!(tok!"..")(); return hasMagicDelimiter!(tok!"[", tok!"..")();
} }
void setTokens(const(Token)[] tokens) void setTokens(const(Token)[] tokens)
@ -6226,22 +6247,22 @@ protected:
bool isAssociativeArrayLiteral() bool isAssociativeArrayLiteral()
{ {
return hasMagicDelimiter!(tok!":")(); return hasMagicDelimiter!(tok!"[", tok!":")();
} }
bool hasMagicDelimiter(alias T)() bool hasMagicDelimiter(alias L, alias T)()
{ {
mixin(traceEnterAndExit!(__FUNCTION__)); mixin(traceEnterAndExit!(__FUNCTION__));
auto i = index; auto i = index;
scope(exit) index = i; scope(exit) index = i;
assert(currentIs(tok!"[")); assert(currentIs(L));
advance(); advance();
while (moreTokens()) switch (current.type) while (moreTokens()) switch (current.type)
{ {
case tok!"{": skipBraces(); break; case tok!"{": skipBraces(); break;
case tok!"(": skipParens(); break; case tok!"(": skipParens(); break;
case tok!"[": skipBrackets(); break; case tok!"[": skipBrackets(); break;
case tok!"]": return false; case tok!"]": case tok!"}": return false;
case T: return true; case T: return true;
default: advance(); break; default: advance(); break;
} }