private void ReadTrivia(List<SyntaxNode> target, bool isTrailing)
{
var onlyWhitespaceOnLine = !isTrailing;
while (true)
{
switch (_charReader.Current)
{
case '\n':
case '\r':
{
ReadEndOfLine();
AddTrivia(target, SyntaxKind.EndOfLineTrivia);
if (isTrailing)
return;
onlyWhitespaceOnLine = true;
}
break;
case '/':
if (_charReader.Peek() == '/')
{
ReadSinglelineComment();
AddTrivia(target, SyntaxKind.SingleLineCommentTrivia);
onlyWhitespaceOnLine = false;
}
else if (_charReader.Peek() == '*')
{
ReadMultilineComment();
AddTrivia(target, SyntaxKind.MultiLineCommentTrivia);
onlyWhitespaceOnLine = false;
}
else
{
return;
}
break;
case '#':
var shouldContinue = LexDirectiveAndExcludedTrivia(isTrailing || !onlyWhitespaceOnLine, target);
if (!shouldContinue)
return;
break;
case '\\':
if (_charReader.Peek() != '\r' && _charReader.Peek() != '\n')
goto default;
_kind = SyntaxKind.BackslashNewlineTrivia;
NextChar();
ReadEndOfLine();
AddTrivia(target, SyntaxKind.BackslashNewlineTrivia);
break;
default:
if (char.IsWhiteSpace(_charReader.Current))
{
ReadWhitespace();
AddTrivia(target, SyntaxKind.WhitespaceTrivia);
}
else
{
return;
}
break;
}
}
}