aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/Lex/TokenLexer.cpp
diff options
context:
space:
mode:
authoryronglin <yronglin777@gmail.com>2025-06-24 18:55:21 +0800
committerGitHub <noreply@github.com>2025-06-24 18:55:21 +0800
commite8976e92f655f8c358081ffae01e10ea159cd37d (patch)
tree2a0a89496b67332eda5f8c7af3751972669f3c21 /clang/lib/Lex/TokenLexer.cpp
parent4d2b79b04a9ebd6c678c465c9a4b1f311ccfbfc2 (diff)
downloadllvm-e8976e92f655f8c358081ffae01e10ea159cd37d.zip
llvm-e8976e92f655f8c358081ffae01e10ea159cd37d.tar.gz
llvm-e8976e92f655f8c358081ffae01e10ea159cd37d.tar.bz2
[clang][Preprocessor] Add peekNextPPToken, makes look ahead next token without side-effects (#143898)
This PR introduce a new function `peekNextPPToken`. It's an extension of `isNextPPTokenLParen` and can makes look ahead one token in preprocessor without side-effects. It's also the 1st part of https://github.com/llvm/llvm-project/pull/107168 and it was used to look ahead next token then determine whether current lexing pp directive is one of pp-import or pp-module directive. At the start of phase 4 an import or module token is treated as starting a directive and are converted to their respective keywords iff: - After skipping horizontal whitespace are - at the start of a logical line, or - preceded by an export at the start of the logical line. - Are followed by an identifier pp token (before macro expansion), or - <, ", or : (but not ::) pp tokens for import, or - ; for module Otherwise the token is treated as an identifier. --------- Signed-off-by: yronglin <yronglin777@gmail.com>
Diffstat (limited to 'clang/lib/Lex/TokenLexer.cpp')
-rw-r--r--clang/lib/Lex/TokenLexer.cpp10
1 files changed, 5 insertions, 5 deletions
diff --git a/clang/lib/Lex/TokenLexer.cpp b/clang/lib/Lex/TokenLexer.cpp
index 6e93416..fbb8c42 100644
--- a/clang/lib/Lex/TokenLexer.cpp
+++ b/clang/lib/Lex/TokenLexer.cpp
@@ -921,13 +921,13 @@ bool TokenLexer::pasteTokens(Token &LHSTok, ArrayRef<Token> TokenStream,
}
/// isNextTokenLParen - If the next token lexed will pop this macro off the
-/// expansion stack, return 2. If the next unexpanded token is a '(', return
-/// 1, otherwise return 0.
-unsigned TokenLexer::isNextTokenLParen() const {
+/// expansion stack, return std::nullopt, otherwise return the next unexpanded
+/// token.
+std::optional<Token> TokenLexer::peekNextPPToken() const {
// Out of tokens?
if (isAtEnd())
- return 2;
- return Tokens[CurTokenIdx].is(tok::l_paren);
+ return std::nullopt;
+ return Tokens[CurTokenIdx];
}
/// isParsingPreprocessorDirective - Return true if we are in the middle of a