private StructTypeSyntax ParseStructType()
{
var @struct = Match(SyntaxKind.StructKeyword);
// Name is optional - but if omitted, this *must* be part of a variable declaration.
var name = NextTokenIf(SyntaxKind.IdentifierToken);
BaseListSyntax baseList = null;
if (Current.Kind == SyntaxKind.ColonToken)
baseList = ParseBaseList();
var openBrace = Match(SyntaxKind.OpenBraceToken);
var fields = new List<VariableDeclarationStatementSyntax>();
while (Current.Kind != SyntaxKind.CloseBraceToken)
{
if (IsPossibleVariableDeclarationStatement())
{
fields.Add(ParseVariableDeclarationStatement());
}
else
{
var action = SkipBadTokens(
p => !p.IsPossibleVariableDeclarationStatement(),
p => p.IsTerminator(),
SyntaxKind.CloseBraceToken);
if (action == PostSkipAction.Abort)
break;
}
}
var closeBrace = Match(SyntaxKind.CloseBraceToken);
return new StructTypeSyntax(@struct, name, baseList, openBrace, fields, closeBrace);
}