Fix 61
This commit is contained in:
parent
ddbe485c40
commit
cf8f3c8eac
|
@ -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;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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,9 +6024,19 @@ q{doStuff(5)}c;
|
||||||
else
|
else
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
node.declarators = ownArray(declarators);
|
// node.declarators = ownArray(declarators);
|
||||||
expect(tok!";");
|
// if (node.declarators.length == 1
|
||||||
return node;
|
// && 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!";");
|
||||||
|
return node;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue