in src/Parsing/Impl/Tokens/Tokenizer.cs [1445:1691]
private Token ReadName() {
#region Generated Python Keyword Lookup
// *** BEGIN GENERATED CODE ***
// generated by function: keyword_lookup_generator from: generate_ops.py
int ch;
BufferBack();
ch = NextChar();
if (ch == 'i') {
ch = NextChar();
if (ch == 'n') {
if (!IsNamePart(Peek())) {
MarkTokenEnd();
return Tokens.KeywordInToken;
}
} else if (ch == 'm') {
if (NextChar() == 'p' && NextChar() == 'o' && NextChar() == 'r' && NextChar() == 't' && !IsNamePart(Peek())) {
MarkTokenEnd();
return Tokens.KeywordImportToken;
}
} else if (ch == 's') {
if (!IsNamePart(Peek())) {
MarkTokenEnd();
return Tokens.KeywordIsToken;
}
} else if (ch == 'f') {
if (!IsNamePart(Peek())) {
MarkTokenEnd();
return Tokens.KeywordIfToken;
}
}
} else if (ch == 'w') {
ch = NextChar();
if (ch == 'i') {
if ((LanguageVersion >= PythonLanguageVersion.V26 || WithStatement) && NextChar() == 't' && NextChar() == 'h' && !IsNamePart(Peek())) {
// with is a keyword in 2.6 and up
return TransformStatementToken(Tokens.KeywordWithToken);
}
} else if (ch == 'h') {
if (NextChar() == 'i' && NextChar() == 'l' && NextChar() == 'e' && !IsNamePart(Peek())) {
return TransformStatementToken(Tokens.KeywordWhileToken);
}
}
} else if (ch == 't') {
if (NextChar() == 'r' && NextChar() == 'y' && !IsNamePart(Peek())) {
return TransformStatementToken(Tokens.KeywordTryToken);
}
} else if (ch == 'r') {
ch = NextChar();
if (ch == 'e') {
if (NextChar() == 't' && NextChar() == 'u' && NextChar() == 'r' && NextChar() == 'n' && !IsNamePart(Peek())) {
return TransformStatementToken(Tokens.KeywordReturnToken);
}
} else if (ch == 'a') {
if (NextChar() == 'i' && NextChar() == 's' && NextChar() == 'e' && !IsNamePart(Peek())) {
return TransformStatementToken(Tokens.KeywordRaiseToken);
}
}
} else if (ch == 'p') {
ch = NextChar();
if (ch == 'a') {
if (NextChar() == 's' && NextChar() == 's' && !IsNamePart(Peek())) {
return TransformStatementToken(Tokens.KeywordPassToken);
}
} else if (ch == 'r') {
if (NextChar() == 'i' && NextChar() == 'n' && NextChar() == 't' && !IsNamePart(Peek())) {
if (!PrintFunction && !LanguageVersion.Is3x() && !StubFile) {
return TransformStatementToken(Tokens.KeywordPrintToken);
}
}
}
} else if (ch == 'g') {
if (NextChar() == 'l' && NextChar() == 'o' && NextChar() == 'b' && NextChar() == 'a' && NextChar() == 'l' && !IsNamePart(Peek())) {
return TransformStatementToken(Tokens.KeywordGlobalToken);
}
} else if (ch == 'f') {
ch = NextChar();
if (ch == 'r') {
if (NextChar() == 'o' && NextChar() == 'm' && !IsNamePart(Peek())) {
MarkTokenEnd();
return Tokens.KeywordFromToken;
}
} else if (ch == 'i') {
if (NextChar() == 'n' && NextChar() == 'a' && NextChar() == 'l' && NextChar() == 'l' && NextChar() == 'y' && !IsNamePart(Peek())) {
return TransformStatementToken(Tokens.KeywordFinallyToken);
}
} else if (ch == 'o') {
if (NextChar() == 'r' && !IsNamePart(Peek())) {
MarkTokenEnd();
return Tokens.KeywordForToken;
}
}
} else if (ch == 'e') {
ch = NextChar();
if (ch == 'x') {
ch = NextChar();
if (ch == 'e') {
if (NextChar() == 'c' && !IsNamePart(Peek())) {
if (LanguageVersion.Is2x()) {
return TransformStatementToken(Tokens.KeywordExecToken);
}
}
} else if (ch == 'c') {
if (NextChar() == 'e' && NextChar() == 'p' && NextChar() == 't' && !IsNamePart(Peek())) {
return TransformStatementToken(Tokens.KeywordExceptToken);
}
}
} else if (ch == 'l') {
ch = NextChar();
if (ch == 's') {
if (NextChar() == 'e' && !IsNamePart(Peek())) {
MarkTokenEnd();
return Tokens.KeywordElseToken;
}
} else if (ch == 'i') {
if (NextChar() == 'f' && !IsNamePart(Peek())) {
return TransformStatementToken(Tokens.KeywordElseIfToken);
}
}
}
} else if (ch == 'd') {
ch = NextChar();
if (ch == 'e') {
ch = NextChar();
if (ch == 'l') {
if (!IsNamePart(Peek())) {
return TransformStatementToken(Tokens.KeywordDelToken);
}
} else if (ch == 'f') {
if (!IsNamePart(Peek())) {
return TransformStatementToken(Tokens.KeywordDefToken);
}
}
}
} else if (ch == 'c') {
ch = NextChar();
if (ch == 'l') {
if (NextChar() == 'a' && NextChar() == 's' && NextChar() == 's' && !IsNamePart(Peek())) {
return TransformStatementToken(Tokens.KeywordClassToken);
}
} else if (ch == 'o') {
if (NextChar() == 'n' && NextChar() == 't' && NextChar() == 'i' && NextChar() == 'n' && NextChar() == 'u' && NextChar() == 'e' && !IsNamePart(Peek())) {
return TransformStatementToken(Tokens.KeywordContinueToken);
}
}
} else if (ch == 'b') {
if (NextChar() == 'r' && NextChar() == 'e' && NextChar() == 'a' && NextChar() == 'k' && !IsNamePart(Peek())) {
return TransformStatementToken(Tokens.KeywordBreakToken);
}
} else if (ch == 'a') {
ch = NextChar();
if (ch == 'n') {
if (NextChar() == 'd' && !IsNamePart(Peek())) {
MarkTokenEnd();
return Tokens.KeywordAndToken;
}
} else if (ch == 's') {
if ((LanguageVersion >= PythonLanguageVersion.V26 || WithStatement) && !IsNamePart(Peek())) {
// as is a keyword in 2.6 and up or when from __future__ import with_statement is used
MarkTokenEnd();
return Tokens.KeywordAsToken;
}
ch = NextChar();
if (ch == 's') {
if (NextChar() == 'e' && NextChar() == 'r' && NextChar() == 't' && !IsNamePart(Peek())) {
return TransformStatementToken(Tokens.KeywordAssertToken);
}
} else if (ch == 'y') {
if (LanguageVersion >= PythonLanguageVersion.V35 && NextChar() == 'n' && NextChar() == 'c' && !IsNamePart(Peek())) {
MarkTokenEnd();
return Tokens.KeywordAsyncToken;
}
}
} else if (ch == 'w') {
if (LanguageVersion >= PythonLanguageVersion.V35 && NextChar() == 'a' && NextChar() == 'i' && NextChar() == 't' && !IsNamePart(Peek())) {
MarkTokenEnd();
return Tokens.KeywordAwaitToken;
}
}
} else if (ch == 'y') {
if (NextChar() == 'i' && NextChar() == 'e' && NextChar() == 'l' && NextChar() == 'd' && !IsNamePart(Peek())) {
MarkTokenEnd();
return Tokens.KeywordYieldToken;
}
} else if (ch == 'o') {
if (NextChar() == 'r' && !IsNamePart(Peek())) {
MarkTokenEnd();
return Tokens.KeywordOrToken;
}
} else if (ch == 'n') {
if (NextChar() == 'o') {
ch = NextChar();
if (ch == 't' && !IsNamePart(Peek())) {
MarkTokenEnd();
return Tokens.KeywordNotToken;
} else if (LanguageVersion.Is3x() && ch == 'n' && NextChar() == 'l' && NextChar() == 'o' && NextChar() == 'c' && NextChar() == 'a' && NextChar() == 'l' && !IsNamePart(Peek())) {
return TransformStatementToken(Tokens.KeywordNonlocalToken);
}
}
} else if (ch == 'N') {
if (NextChar() == 'o' && NextChar() == 'n' && NextChar() == 'e' && !IsNamePart(Peek())) {
MarkTokenEnd();
return Tokens.NoneToken;
}
} else if (ch == 'l') {
if (NextChar() == 'a' && NextChar() == 'm' && NextChar() == 'b' && NextChar() == 'd' && NextChar() == 'a' && !IsNamePart(Peek())) {
MarkTokenEnd();
return Tokens.KeywordLambdaToken;
}
} else if ((LanguageVersion.Is3x() || StubFile) && ch == 'T') {
if (NextChar() == 'r' && NextChar() == 'u' && NextChar() == 'e' && !IsNamePart(Peek())) {
MarkTokenEnd();
return Tokens.KeywordTrueToken;
}
} else if ((LanguageVersion.Is3x() || StubFile) && ch == 'F') {
if (NextChar() == 'a' && NextChar() == 'l' && NextChar() == 's' && NextChar() == 'e' && !IsNamePart(Peek())) {
MarkTokenEnd();
return Tokens.KeywordFalseToken;
}
}
// *** END GENERATED CODE ***
#endregion
BufferBack();
ch = NextChar();
while (IsNamePart(ch)) {
ch = NextChar();
}
BufferBack();
MarkTokenEnd();
// _names uses Tokenizer.TokenEqualityComparer to find matching key.
// When string is compared to _nameFromBuffer, this equality comparer uses _buffer for GetHashCode and Equals
// to avoid allocation of a new string instance
if (!_names.TryGetValue(_nameFromBuffer, out var token)) {
var name = GetTokenString();
token = _names[name] = new NameToken(name);
}
return token;
}