private PostSkipAction SkipBadTokens(
Func<HlslParser, bool> isNotExpectedFunction,
Func<HlslParser, bool> abortFunction,
SyntaxKind? expected = null)
{
var action = PostSkipAction.Continue;
var tokens = new List<SyntaxToken>();
var first = true;
while (isNotExpectedFunction(this))
{
if (abortFunction(this))
{
action = PostSkipAction.Abort;
break;
}
tokens.Add(first && expected != null ? NextTokenWithPrejudice(expected.Value) : NextToken());
first = false;
}
if (!_scanStack.Any() && tokens.Any())
{
var current = _tokens[_tokenIndex];
var skippedTokensTrivia = CreateSkippedTokensTrivia(tokens);
var leadingTrivia = new List<SyntaxNode>(current.LeadingTrivia.Length + 1);
leadingTrivia.Add(skippedTokensTrivia);
leadingTrivia.AddRange(current.LeadingTrivia);
_tokens[_tokenIndex] = current
.WithLeadingTrivia(leadingTrivia)
.WithDiagnostic(Diagnostic.Format(
tokens.First().GetTextSpanRoot(),
DiagnosticId.TokenUnexpected,
tokens.First().Text));
}
return action;
}