in src/Parsing/Impl/Tokens/Tokenizer.cs [206:312]
public TokenInfo ReadToken() {
if (_buffer == null) {
throw new InvalidOperationException("Uninitialized");
}
var result = new TokenInfo();
var token = GetNextToken();
result.SourceSpan = new SourceSpan(IndexToLocation(TokenSpan.Start), IndexToLocation(TokenSpan.End));
switch (token.Kind) {
case TokenKind.EndOfFile:
result.Category = TokenCategory.EndOfStream;
break;
case TokenKind.Comment:
result.Category = TokenCategory.Comment;
break;
case TokenKind.Name:
if ("True".Equals(token.Value) || "False".Equals(token.Value)) {
result.Category = TokenCategory.BuiltinIdentifier;
} else {
result.Category = TokenCategory.Identifier;
}
break;
case TokenKind.Error:
if (token is IncompleteStringErrorToken) {
result.Category = TokenCategory.IncompleteMultiLineStringLiteral;
} else {
result.Category = TokenCategory.Error;
}
break;
case TokenKind.Constant:
if (token == Tokens.NoneToken) {
result.Category = TokenCategory.BuiltinIdentifier;
} else if (token.Value is string || token.Value is AsciiString) {
result.Category = TokenCategory.StringLiteral;
} else {
result.Category = TokenCategory.NumericLiteral;
}
break;
case TokenKind.LeftParenthesis:
result.Category = TokenCategory.Grouping;
result.Trigger = TokenTriggers.MatchBraces | TokenTriggers.ParameterStart;
break;
case TokenKind.RightParenthesis:
result.Category = TokenCategory.Grouping;
result.Trigger = TokenTriggers.MatchBraces | TokenTriggers.ParameterEnd;
break;
case TokenKind.LeftBracket:
case TokenKind.LeftBrace:
case TokenKind.RightBracket:
case TokenKind.RightBrace:
result.Category = TokenCategory.Grouping;
result.Trigger = TokenTriggers.MatchBraces;
break;
case TokenKind.Colon:
result.Category = TokenCategory.Delimiter;
break;
case TokenKind.Semicolon:
result.Category = TokenCategory.Delimiter;
break;
case TokenKind.Comma:
result.Category = TokenCategory.Delimiter;
result.Trigger = TokenTriggers.ParameterNext;
break;
case TokenKind.Dot:
result.Category = TokenCategory.Operator;
result.Trigger = TokenTriggers.MemberSelect;
break;
case TokenKind.NewLine:
case TokenKind.NLToken:
result.Category = TokenCategory.WhiteSpace;
break;
case TokenKind.KeywordTrue:
case TokenKind.KeywordFalse:
result.Category = TokenCategory.Keyword;
break;
case TokenKind.KeywordAsync:
case TokenKind.KeywordAwait:
result.Category = TokenCategory.Identifier;
break;
default:
if (token.Kind >= TokenKind.FirstKeyword && token.Kind <= TokenKind.KeywordNonlocal) {
result.Category = TokenCategory.Keyword;
break;
}
result.Category = TokenCategory.Operator;
break;
}
return result;
}