private SyntaxToken LexDirectiveToken()
{
_kind = SyntaxKind.BadToken;
_contextualKind = SyntaxKind.BadToken;
_diagnostics.Clear();
_start = _charReader.Position;
var trailingTrivia = new List<SyntaxNode>();
var isEndOfLine = false;
switch (_charReader.Current)
{
case '#':
NextChar();
if (_charReader.Current == '#')
{
NextChar();
_kind = SyntaxKind.HashHashToken;
}
else
{
_kind = SyntaxKind.HashToken;
_currentDirectiveKind = null;
}
break;
case '\r':
case '\n':
_kind = SyntaxKind.EndOfDirectiveToken;
_currentDirectiveKind = null;
isEndOfLine = true;
break;
case '\0':
_kind = SyntaxKind.EndOfDirectiveToken;
_currentDirectiveKind = null;
break;
case '<':
if (_currentDirectiveKind != SyntaxKind.IncludeKeyword)
goto default;
ReadBracketedString();
break;
default:
ReadToken();
if (_contextualKind.IsPreprocessorDirective())
_currentDirectiveKind = _contextualKind;
break;
}
var end = _charReader.Position;
var kind = _kind;
var span = TextSpan.FromBounds(Text, _start, end);
var text = Text.GetText(span);
var diagnostics = _diagnostics.ToImmutableArray();
LexDirectiveTrailingTrivia(trailingTrivia, kind, isEndOfLine);
var token = new SyntaxToken(kind, _contextualKind, false, MakeAbsolute(span), span, text, _value,
ImmutableArray<SyntaxNode>.Empty, trailingTrivia.ToImmutableArray(),
diagnostics, null, false);
return token;
}