Fixed class parsing. Apparently constraints and base classes can go in either order

This commit is contained in:
Hackerpilot 2014-05-12 18:05:29 -07:00
parent a081ceda2a
commit 0aa1e20595
1 changed files with 19 additions and 6 deletions

View File

@ -1205,7 +1205,10 @@ incorrect;
* Parses a ClassDeclaration * Parses a ClassDeclaration
* *
* $(GRAMMAR $(RULEDEF classDeclaration): * $(GRAMMAR $(RULEDEF classDeclaration):
* $(LITERAL 'class') $(LITERAL Identifier) ($(LITERAL ';') | ($(RULE templateParameters) $(RULE constraint)?)? ($(LITERAL ':') $(RULE baseClassList))? $(RULE structBody)) * $(LITERAL 'class') $(LITERAL Identifier) ($(LITERAL ':') $(RULE baseClassList))? $(LITERAL ';')
* | $(LITERAL 'class') $(LITERAL Identifier) ($(LITERAL ':') $(RULE baseClassList))? $(RULE structBody)
* | $(LITERAL 'class') $(LITERAL Identifier) $(RULE templateParameters) $(RULE constraint)? ($(LITERAL ':') $(RULE baseClassList))? $(RULE structBody)
* | $(LITERAL 'class') $(LITERAL Identifier) $(RULE templateParameters) ($(LITERAL ':') $(RULE baseClassList))? $(RULE constraint)? $(RULE structBody)
* ;) * ;)
*/ */
ClassDeclaration parseClassDeclaration() ClassDeclaration parseClassDeclaration()
@ -1223,19 +1226,27 @@ incorrect;
advance(); advance();
return node; return node;
} }
if (currentIs(tok!"(")) templateStuff: if (currentIs(tok!"("))
{ {
node.templateParameters = parseTemplateParameters(); node.templateParameters = parseTemplateParameters();
if (currentIs(tok!"if")) constraint: if (currentIs(tok!"if"))
{
node.constraint = parseConstraint(); node.constraint = parseConstraint();
if (node.baseClassList !is null)
goto structBody;
if (currentIs(tok!":"))
{
advance();
node.baseClassList = parseBaseClassList();
} }
if (currentIs(tok!"if"))
goto constraint;
} }
if (currentIs(tok!":")) if (currentIs(tok!":"))
{ {
advance(); advance();
node.baseClassList = parseBaseClassList(); node.baseClassList = parseBaseClassList();
} }
structBody:
node.structBody = parseStructBody(); node.structBody = parseStructBody();
return node; return node;
} }
@ -1243,10 +1254,12 @@ incorrect;
unittest unittest
{ {
string sourceCode = string sourceCode =
q{class ClassOne {} q{class ClassZero;
class ClassOne {}
class ClassTwo : Super {} class ClassTwo : Super {}
class ClassThree(A, B) : Super {} class ClassThree(A, B) : Super {}
class ClassFour(A, B) if (someTest()) : Super {}}c; class ClassFour(A, B) if (someTest()) : Super {}
class ClassFive(A, B) : Super if (someTest()) {}}c;
Parser p = getParserForUnittest(sourceCode, "parseClassDeclaration"); Parser p = getParserForUnittest(sourceCode, "parseClassDeclaration");