This revision was automatically updated to reflect the committed changes. jvikstrom marked 2 inline comments as done. Closed by commit rL369385: [Syntax] Added function to get macro expansion tokens to TokenBuffer. (authored by jvikstrom, committed by ). Herald added a project: LLVM. Herald added a subscriber: llvm-commits.
Changed prior to commit: https://reviews.llvm.org/D66470?vs=216103&id=216135#toc Repository: rL LLVM CHANGES SINCE LAST ACTION https://reviews.llvm.org/D66470/new/ https://reviews.llvm.org/D66470 Files: cfe/trunk/include/clang/Tooling/Syntax/Tokens.h cfe/trunk/lib/Tooling/Syntax/Tokens.cpp cfe/trunk/unittests/Tooling/Syntax/TokensTest.cpp Index: cfe/trunk/lib/Tooling/Syntax/Tokens.cpp =================================================================== --- cfe/trunk/lib/Tooling/Syntax/Tokens.cpp +++ cfe/trunk/lib/Tooling/Syntax/Tokens.cpp @@ -232,6 +232,21 @@ return E; } +std::vector<const syntax::Token *> +TokenBuffer::macroExpansions(FileID FID) const { + auto FileIt = Files.find(FID); + assert(FileIt != Files.end() && "file not tracked by token buffer"); + auto &File = FileIt->second; + std::vector<const syntax::Token *> Expansions; + auto &Spelled = File.SpelledTokens; + for (auto Mapping : File.Mappings) { + const syntax::Token *Token = &Spelled[Mapping.BeginSpelled]; + if (Token->kind() == tok::TokenKind::identifier) + Expansions.push_back(Token); + } + return Expansions; +} + std::vector<syntax::Token> syntax::tokenize(FileID FID, const SourceManager &SM, const LangOptions &LO) { std::vector<syntax::Token> Tokens; Index: cfe/trunk/unittests/Tooling/Syntax/TokensTest.cpp =================================================================== --- cfe/trunk/unittests/Tooling/Syntax/TokensTest.cpp +++ cfe/trunk/unittests/Tooling/Syntax/TokensTest.cpp @@ -755,4 +755,27 @@ // We don't test assertion failures because death tests are slow. } +TEST_F(TokenBufferTest, macroExpansions) { + llvm::Annotations Code(R"cpp( + #define FOO B + #define FOO2 BA + #define CALL(X) int X + #define G CALL(FOO2) + int B; + $macro[[FOO]]; + $macro[[CALL]](A); + $macro[[G]]; + )cpp"); + recordTokens(Code.code()); + auto &SM = *SourceMgr; + auto Expansions = Buffer.macroExpansions(SM.getMainFileID()); + std::vector<FileRange> ExpectedMacroRanges; + for (auto Range : Code.ranges("macro")) + ExpectedMacroRanges.push_back( + FileRange(SM.getMainFileID(), Range.Begin, Range.End)); + std::vector<FileRange> ActualMacroRanges; + for (auto Expansion : Expansions) + ActualMacroRanges.push_back(Expansion->range(SM)); + EXPECT_EQ(ExpectedMacroRanges, ActualMacroRanges); +} } // namespace Index: cfe/trunk/include/clang/Tooling/Syntax/Tokens.h =================================================================== --- cfe/trunk/include/clang/Tooling/Syntax/Tokens.h +++ cfe/trunk/include/clang/Tooling/Syntax/Tokens.h @@ -236,6 +236,16 @@ /// #pragma, etc. llvm::ArrayRef<syntax::Token> spelledTokens(FileID FID) const; + /// Get all tokens that expand a macro in \p FID. For the following input + /// #define FOO B + /// #define FOO2(X) int X + /// FOO2(XY) + /// int B; + /// FOO; + /// macroExpansions() returns {"FOO2", "FOO"} (from line 3 and 5 + /// respecitvely). + std::vector<const syntax::Token *> macroExpansions(FileID FID) const; + const SourceManager &sourceManager() const { return *SourceMgr; } std::string dumpForTests() const;
Index: cfe/trunk/lib/Tooling/Syntax/Tokens.cpp =================================================================== --- cfe/trunk/lib/Tooling/Syntax/Tokens.cpp +++ cfe/trunk/lib/Tooling/Syntax/Tokens.cpp @@ -232,6 +232,21 @@ return E; } +std::vector<const syntax::Token *> +TokenBuffer::macroExpansions(FileID FID) const { + auto FileIt = Files.find(FID); + assert(FileIt != Files.end() && "file not tracked by token buffer"); + auto &File = FileIt->second; + std::vector<const syntax::Token *> Expansions; + auto &Spelled = File.SpelledTokens; + for (auto Mapping : File.Mappings) { + const syntax::Token *Token = &Spelled[Mapping.BeginSpelled]; + if (Token->kind() == tok::TokenKind::identifier) + Expansions.push_back(Token); + } + return Expansions; +} + std::vector<syntax::Token> syntax::tokenize(FileID FID, const SourceManager &SM, const LangOptions &LO) { std::vector<syntax::Token> Tokens; Index: cfe/trunk/unittests/Tooling/Syntax/TokensTest.cpp =================================================================== --- cfe/trunk/unittests/Tooling/Syntax/TokensTest.cpp +++ cfe/trunk/unittests/Tooling/Syntax/TokensTest.cpp @@ -755,4 +755,27 @@ // We don't test assertion failures because death tests are slow. } +TEST_F(TokenBufferTest, macroExpansions) { + llvm::Annotations Code(R"cpp( + #define FOO B + #define FOO2 BA + #define CALL(X) int X + #define G CALL(FOO2) + int B; + $macro[[FOO]]; + $macro[[CALL]](A); + $macro[[G]]; + )cpp"); + recordTokens(Code.code()); + auto &SM = *SourceMgr; + auto Expansions = Buffer.macroExpansions(SM.getMainFileID()); + std::vector<FileRange> ExpectedMacroRanges; + for (auto Range : Code.ranges("macro")) + ExpectedMacroRanges.push_back( + FileRange(SM.getMainFileID(), Range.Begin, Range.End)); + std::vector<FileRange> ActualMacroRanges; + for (auto Expansion : Expansions) + ActualMacroRanges.push_back(Expansion->range(SM)); + EXPECT_EQ(ExpectedMacroRanges, ActualMacroRanges); +} } // namespace Index: cfe/trunk/include/clang/Tooling/Syntax/Tokens.h =================================================================== --- cfe/trunk/include/clang/Tooling/Syntax/Tokens.h +++ cfe/trunk/include/clang/Tooling/Syntax/Tokens.h @@ -236,6 +236,16 @@ /// #pragma, etc. llvm::ArrayRef<syntax::Token> spelledTokens(FileID FID) const; + /// Get all tokens that expand a macro in \p FID. For the following input + /// #define FOO B + /// #define FOO2(X) int X + /// FOO2(XY) + /// int B; + /// FOO; + /// macroExpansions() returns {"FOO2", "FOO"} (from line 3 and 5 + /// respecitvely). + std::vector<const syntax::Token *> macroExpansions(FileID FID) const; + const SourceManager &sourceManager() const { return *SourceMgr; } std::string dumpForTests() const;
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits