Fixed class parsing. Apparently constraints and base classes can go in either order
This commit is contained in:
parent
a081ceda2a
commit
0aa1e20595
|
@ -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");
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue