aboutsummaryrefslogtreecommitdiff
path: root/clang
diff options
context:
space:
mode:
authorClement Courbet <courbet@google.com>2025-01-16 17:06:05 +0100
committerGitHub <noreply@github.com>2025-01-16 17:06:05 +0100
commit18196466238ff25d5c76906645ba1d92f08bd0f7 (patch)
treece5b5248212a7984a64d5bb86ade91229a834543 /clang
parentf6b0555a433cea1d32a6904c120516cd94b8f3db (diff)
downloadllvm-18196466238ff25d5c76906645ba1d92f08bd0f7.zip
llvm-18196466238ff25d5c76906645ba1d92f08bd0f7.tar.gz
llvm-18196466238ff25d5c76906645ba1d92f08bd0f7.tar.bz2
[clang][refactor] Refactor `findNextTokenIncludingComments` (#123060)
We have two copies of the same code in clang-tidy and clang-reorder-fields, and those are extremenly similar to `Lexer::findNextToken`, so just add an extra agument to the latter. --------- Co-authored-by: cor3ntin <corentinjabot@gmail.com>
Diffstat (limited to 'clang')
-rw-r--r--clang/include/clang/Lex/Lexer.h3
-rw-r--r--clang/lib/Lex/Lexer.cpp4
-rw-r--r--clang/unittests/Lex/LexerTest.cpp21
3 files changed, 26 insertions, 2 deletions
diff --git a/clang/include/clang/Lex/Lexer.h b/clang/include/clang/Lex/Lexer.h
index b6ecc7e..82a041ea 100644
--- a/clang/include/clang/Lex/Lexer.h
+++ b/clang/include/clang/Lex/Lexer.h
@@ -554,7 +554,8 @@ public:
/// Returns the next token, or std::nullopt if the location is inside a macro.
static std::optional<Token> findNextToken(SourceLocation Loc,
const SourceManager &SM,
- const LangOptions &LangOpts);
+ const LangOptions &LangOpts,
+ bool IncludeComments = false);
/// Checks that the given token is the first token that occurs after
/// the given location (this excludes comments and whitespace). Returns the
diff --git a/clang/lib/Lex/Lexer.cpp b/clang/lib/Lex/Lexer.cpp
index 7236450..115b6c1 100644
--- a/clang/lib/Lex/Lexer.cpp
+++ b/clang/lib/Lex/Lexer.cpp
@@ -1323,7 +1323,8 @@ const char *Lexer::SkipEscapedNewLines(const char *P) {
std::optional<Token> Lexer::findNextToken(SourceLocation Loc,
const SourceManager &SM,
- const LangOptions &LangOpts) {
+ const LangOptions &LangOpts,
+ bool IncludeComments) {
if (Loc.isMacroID()) {
if (!Lexer::isAtEndOfMacroExpansion(Loc, SM, LangOpts, &Loc))
return std::nullopt;
@@ -1344,6 +1345,7 @@ std::optional<Token> Lexer::findNextToken(SourceLocation Loc,
// Lex from the start of the given location.
Lexer lexer(SM.getLocForStartOfFile(LocInfo.first), LangOpts, File.begin(),
TokenBegin, File.end());
+ lexer.SetCommentRetentionState(IncludeComments);
// Find the token.
Token Tok;
lexer.LexFromRawLexer(Tok);
diff --git a/clang/unittests/Lex/LexerTest.cpp b/clang/unittests/Lex/LexerTest.cpp
index aead7fb..c897998 100644
--- a/clang/unittests/Lex/LexerTest.cpp
+++ b/clang/unittests/Lex/LexerTest.cpp
@@ -603,6 +603,7 @@ TEST_F(LexerTest, CharRangeOffByOne) {
TEST_F(LexerTest, FindNextToken) {
Lex("int abcd = 0;\n"
+ "// A comment.\n"
"int xyz = abcd;\n");
std::vector<std::string> GeneratedByNextToken;
SourceLocation Loc =
@@ -619,6 +620,26 @@ TEST_F(LexerTest, FindNextToken) {
"xyz", "=", "abcd", ";"));
}
+TEST_F(LexerTest, FindNextTokenIncludingComments) {
+ Lex("int abcd = 0;\n"
+ "// A comment.\n"
+ "int xyz = abcd;\n");
+ std::vector<std::string> GeneratedByNextToken;
+ SourceLocation Loc =
+ SourceMgr.getLocForStartOfFile(SourceMgr.getMainFileID());
+ while (true) {
+ auto T = Lexer::findNextToken(Loc, SourceMgr, LangOpts, true);
+ ASSERT_TRUE(T);
+ if (T->is(tok::eof))
+ break;
+ GeneratedByNextToken.push_back(getSourceText(*T, *T));
+ Loc = T->getLocation();
+ }
+ EXPECT_THAT(GeneratedByNextToken,
+ ElementsAre("abcd", "=", "0", ";", "// A comment.", "int", "xyz",
+ "=", "abcd", ";"));
+}
+
TEST_F(LexerTest, CreatedFIDCountForPredefinedBuffer) {
TrivialModuleLoader ModLoader;
auto PP = CreatePP("", ModLoader);