Author: sammccall Date: Tue Sep 3 08:34:47 2019 New Revision: 370768 URL: http://llvm.org/viewvc/llvm-project?rev=370768&view=rev Log: [clangd] Move getBeginningOfIdentifier from ClangdUnit to SourceCode. Drop dependencies on ClangdUnit from some headers. NFC
Modified: clang-tools-extra/trunk/clangd/ClangdServer.cpp clang-tools-extra/trunk/clangd/ClangdServer.h clang-tools-extra/trunk/clangd/ClangdUnit.cpp clang-tools-extra/trunk/clangd/ClangdUnit.h clang-tools-extra/trunk/clangd/CodeComplete.h clang-tools-extra/trunk/clangd/Selection.cpp clang-tools-extra/trunk/clangd/Selection.h clang-tools-extra/trunk/clangd/SourceCode.cpp clang-tools-extra/trunk/clangd/SourceCode.h clang-tools-extra/trunk/clangd/XRefs.cpp clang-tools-extra/trunk/clangd/index/FileIndex.h clang-tools-extra/trunk/clangd/refactor/Rename.cpp clang-tools-extra/trunk/clangd/refactor/Rename.h clang-tools-extra/trunk/clangd/unittests/ClangdUnitTests.cpp clang-tools-extra/trunk/clangd/unittests/SourceCodeTests.cpp Modified: clang-tools-extra/trunk/clangd/ClangdServer.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/ClangdServer.cpp?rev=370768&r1=370767&r2=370768&view=diff ============================================================================== --- clang-tools-extra/trunk/clangd/ClangdServer.cpp (original) +++ clang-tools-extra/trunk/clangd/ClangdServer.cpp Tue Sep 3 08:34:47 2019 @@ -315,7 +315,7 @@ void ClangdServer::prepareRename(PathRef return CB(Changes.takeError()); } SourceLocation Loc = getBeginningOfIdentifier( - AST, Pos, AST.getSourceManager().getMainFileID()); + Pos, AST.getSourceManager(), AST.getASTContext().getLangOpts()); if (auto Range = getTokenRange(AST.getSourceManager(), AST.getASTContext().getLangOpts(), Loc)) return CB(*Range); Modified: clang-tools-extra/trunk/clangd/ClangdServer.h URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/ClangdServer.h?rev=370768&r1=370767&r2=370768&view=diff ============================================================================== --- clang-tools-extra/trunk/clangd/ClangdServer.h (original) +++ clang-tools-extra/trunk/clangd/ClangdServer.h Tue Sep 3 08:34:47 2019 @@ -11,7 +11,6 @@ #include "../clang-tidy/ClangTidyOptions.h" #include "Cancellation.h" -#include "ClangdUnit.h" #include "CodeComplete.h" #include "FSProvider.h" #include "FormattedString.h" Modified: clang-tools-extra/trunk/clangd/ClangdUnit.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/ClangdUnit.cpp?rev=370768&r1=370767&r2=370768&view=diff ============================================================================== --- clang-tools-extra/trunk/clangd/ClangdUnit.cpp (original) +++ clang-tools-extra/trunk/clangd/ClangdUnit.cpp Tue Sep 3 08:34:47 2019 @@ -710,39 +710,6 @@ buildAST(PathRef FileName, std::unique_p std::move(VFS), Inputs.Index, Inputs.Opts); } -SourceLocation getBeginningOfIdentifier(const ParsedAST &Unit, - const Position &Pos, const FileID FID) { - const ASTContext &AST = Unit.getASTContext(); - const SourceManager &SourceMgr = AST.getSourceManager(); - auto Offset = positionToOffset(SourceMgr.getBufferData(FID), Pos); - if (!Offset) { - log("getBeginningOfIdentifier: {0}", Offset.takeError()); - return SourceLocation(); - } - - // GetBeginningOfToken(pos) is almost what we want, but does the wrong thing - // if the cursor is at the end of the identifier. - // Instead, we lex at GetBeginningOfToken(pos - 1). The cases are: - // 1) at the beginning of an identifier, we'll be looking at something - // that isn't an identifier. - // 2) at the middle or end of an identifier, we get the identifier. - // 3) anywhere outside an identifier, we'll get some non-identifier thing. - // We can't actually distinguish cases 1 and 3, but returning the original - // location is correct for both! - SourceLocation InputLoc = SourceMgr.getComposedLoc(FID, *Offset); - if (*Offset == 0) // Case 1 or 3. - return SourceMgr.getMacroArgExpandedLocation(InputLoc); - SourceLocation Before = SourceMgr.getComposedLoc(FID, *Offset - 1); - - Before = Lexer::GetBeginningOfToken(Before, SourceMgr, AST.getLangOpts()); - Token Tok; - if (Before.isValid() && - !Lexer::getRawToken(Before, Tok, SourceMgr, AST.getLangOpts(), false) && - Tok.is(tok::raw_identifier)) - return SourceMgr.getMacroArgExpandedLocation(Before); // Case 2. - return SourceMgr.getMacroArgExpandedLocation(InputLoc); // Case 1 or 3. -} - } // namespace clangd namespace tidy { // Force the linker to link in Clang-tidy modules. Modified: clang-tools-extra/trunk/clangd/ClangdUnit.h URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/ClangdUnit.h?rev=370768&r1=370767&r2=370768&view=diff ============================================================================== --- clang-tools-extra/trunk/clangd/ClangdUnit.h (original) +++ clang-tools-extra/trunk/clangd/ClangdUnit.h Tue Sep 3 08:34:47 2019 @@ -187,11 +187,6 @@ buildAST(PathRef FileName, std::unique_p const ParseInputs &Inputs, std::shared_ptr<const PreambleData> Preamble); -/// Get the beginning SourceLocation at a specified \p Pos. -/// May be invalid if Pos is, or if there's no identifier. -SourceLocation getBeginningOfIdentifier(const ParsedAST &Unit, - const Position &Pos, const FileID FID); - /// For testing/debugging purposes. Note that this method deserializes all /// unserialized Decls, so use with care. void dumpAST(ParsedAST &AST, llvm::raw_ostream &OS); Modified: clang-tools-extra/trunk/clangd/CodeComplete.h URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/CodeComplete.h?rev=370768&r1=370767&r2=370768&view=diff ============================================================================== --- clang-tools-extra/trunk/clangd/CodeComplete.h (original) +++ clang-tools-extra/trunk/clangd/CodeComplete.h Tue Sep 3 08:34:47 2019 @@ -15,7 +15,6 @@ #ifndef LLVM_CLANG_TOOLS_EXTRA_CLANGD_CODECOMPLETE_H #define LLVM_CLANG_TOOLS_EXTRA_CLANGD_CODECOMPLETE_H -#include "ClangdUnit.h" #include "Headers.h" #include "Logger.h" #include "Path.h" @@ -36,6 +35,7 @@ namespace clang { class NamedDecl; namespace clangd { +struct PreambleData; struct CodeCompleteOptions { /// Returns options that can be passed to clang's completion engine. Modified: clang-tools-extra/trunk/clangd/Selection.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/Selection.cpp?rev=370768&r1=370767&r2=370768&view=diff ============================================================================== --- clang-tools-extra/trunk/clangd/Selection.cpp (original) +++ clang-tools-extra/trunk/clangd/Selection.cpp Tue Sep 3 08:34:47 2019 @@ -7,7 +7,6 @@ //===----------------------------------------------------------------------===// #include "Selection.h" -#include "ClangdUnit.h" #include "Logger.h" #include "SourceCode.h" #include "clang/AST/ASTTypeTraits.h" @@ -17,6 +16,7 @@ #include "clang/Basic/SourceLocation.h" #include "clang/Basic/SourceManager.h" #include "clang/Basic/TokenKinds.h" +#include "clang/Lex/Lexer.h" #include "clang/Tooling/Syntax/Tokens.h" #include "llvm/ADT/STLExtras.h" #include "llvm/Support/raw_ostream.h" Modified: clang-tools-extra/trunk/clangd/Selection.h URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/Selection.h?rev=370768&r1=370767&r2=370768&view=diff ============================================================================== --- clang-tools-extra/trunk/clangd/Selection.h (original) +++ clang-tools-extra/trunk/clangd/Selection.h Tue Sep 3 08:34:47 2019 @@ -40,7 +40,6 @@ namespace clang { namespace clangd { -class ParsedAST; // A selection can partially or completely cover several AST nodes. // The SelectionTree contains nodes that are covered, and their parents. Modified: clang-tools-extra/trunk/clangd/SourceCode.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/SourceCode.cpp?rev=370768&r1=370767&r2=370768&view=diff ============================================================================== --- clang-tools-extra/trunk/clangd/SourceCode.cpp (original) +++ clang-tools-extra/trunk/clangd/SourceCode.cpp Tue Sep 3 08:34:47 2019 @@ -229,6 +229,39 @@ llvm::Optional<Range> getTokenRange(cons return halfOpenToRange(SM, CharSourceRange::getCharRange(TokLoc, End)); } +SourceLocation getBeginningOfIdentifier(const Position &Pos, + const SourceManager &SM, + const LangOptions &LangOpts) { + FileID FID = SM.getMainFileID(); + auto Offset = positionToOffset(SM.getBufferData(FID), Pos); + if (!Offset) { + log("getBeginningOfIdentifier: {0}", Offset.takeError()); + return SourceLocation(); + } + + // GetBeginningOfToken(pos) is almost what we want, but does the wrong thing + // if the cursor is at the end of the identifier. + // Instead, we lex at GetBeginningOfToken(pos - 1). The cases are: + // 1) at the beginning of an identifier, we'll be looking at something + // that isn't an identifier. + // 2) at the middle or end of an identifier, we get the identifier. + // 3) anywhere outside an identifier, we'll get some non-identifier thing. + // We can't actually distinguish cases 1 and 3, but returning the original + // location is correct for both! + SourceLocation InputLoc = SM.getComposedLoc(FID, *Offset); + if (*Offset == 0) // Case 1 or 3. + return SM.getMacroArgExpandedLocation(InputLoc); + SourceLocation Before = SM.getComposedLoc(FID, *Offset - 1); + + Before = Lexer::GetBeginningOfToken(Before, SM, LangOpts); + Token Tok; + if (Before.isValid() && + !Lexer::getRawToken(Before, Tok, SM, LangOpts, false) && + Tok.is(tok::raw_identifier)) + return SM.getMacroArgExpandedLocation(Before); // Case 2. + return SM.getMacroArgExpandedLocation(InputLoc); // Case 1 or 3. +} + bool isValidFileRange(const SourceManager &Mgr, SourceRange R) { if (!R.getBegin().isValid() || !R.getEnd().isValid()) return false; Modified: clang-tools-extra/trunk/clangd/SourceCode.h URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/SourceCode.h?rev=370768&r1=370767&r2=370768&view=diff ============================================================================== --- clang-tools-extra/trunk/clangd/SourceCode.h (original) +++ clang-tools-extra/trunk/clangd/SourceCode.h Tue Sep 3 08:34:47 2019 @@ -75,6 +75,13 @@ llvm::Optional<Range> getTokenRange(cons llvm::Expected<SourceLocation> sourceLocationInMainFile(const SourceManager &SM, Position P); +/// Get the beginning SourceLocation at a specified \p Pos in the main file. +/// May be invalid if Pos is, or if there's no identifier. +/// FIXME: this returns the macro-expansion location, but it shouldn't. +SourceLocation getBeginningOfIdentifier(const Position &Pos, + const SourceManager &SM, + const LangOptions &LangOpts); + /// Returns true iff \p Loc is inside the main file. This function handles /// file & macro locations. For macro locations, returns iff the macro is being /// expanded inside the main file. Modified: clang-tools-extra/trunk/clangd/XRefs.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/XRefs.cpp?rev=370768&r1=370767&r2=370768&view=diff ============================================================================== --- clang-tools-extra/trunk/clangd/XRefs.cpp (original) +++ clang-tools-extra/trunk/clangd/XRefs.cpp Tue Sep 3 08:34:47 2019 @@ -254,8 +254,8 @@ std::vector<LocatedSymbol> locateSymbolA } } - SourceLocation SourceLocationBeg = - getBeginningOfIdentifier(AST, Pos, SM.getMainFileID()); + SourceLocation SourceLocationBeg = getBeginningOfIdentifier( + Pos, AST.getSourceManager(), AST.getASTContext().getLangOpts()); // Macros are simple: there's no declaration/definition distinction. // As a consequence, there's no need to look them up in the index either. @@ -408,10 +408,10 @@ std::vector<DocumentHighlight> findDocum Position Pos) { const SourceManager &SM = AST.getSourceManager(); // FIXME: show references to macro within file? - auto References = - findRefs(getDeclAtPosition( - AST, getBeginningOfIdentifier(AST, Pos, SM.getMainFileID())), - AST); + auto References = findRefs( + getDeclAtPosition(AST, getBeginningOfIdentifier( + Pos, SM, AST.getASTContext().getLangOpts())), + AST); // FIXME: we may get multiple DocumentHighlights with the same location and // different kinds, deduplicate them. @@ -876,7 +876,7 @@ llvm::Optional<HoverInfo> getHover(Parse const SymbolIndex *Index) { llvm::Optional<HoverInfo> HI; SourceLocation SourceLocationBeg = getBeginningOfIdentifier( - AST, Pos, AST.getSourceManager().getMainFileID()); + Pos, AST.getSourceManager(), AST.getASTContext().getLangOpts()); if (auto M = locateMacroAt(SourceLocationBeg, AST.getPreprocessor())) { HI = getHoverContents(*M, AST); @@ -918,7 +918,8 @@ std::vector<Location> findReferences(Par elog("Failed to get a path for the main file, so no references"); return Results; } - auto Loc = getBeginningOfIdentifier(AST, Pos, SM.getMainFileID()); + auto Loc = + getBeginningOfIdentifier(Pos, SM, AST.getASTContext().getLangOpts()); // TODO: should we handle macros, too? auto Decls = getDeclAtPosition(AST, Loc); @@ -974,8 +975,8 @@ std::vector<Location> findReferences(Par std::vector<SymbolDetails> getSymbolInfo(ParsedAST &AST, Position Pos) { const SourceManager &SM = AST.getSourceManager(); - - auto Loc = getBeginningOfIdentifier(AST, Pos, SM.getMainFileID()); + auto Loc = + getBeginningOfIdentifier(Pos, SM, AST.getASTContext().getLangOpts()); std::vector<SymbolDetails> Results; @@ -1146,7 +1147,7 @@ static void fillSuperTypes(const CXXReco const CXXRecordDecl *findRecordTypeAt(ParsedAST &AST, Position Pos) { SourceLocation SourceLocationBeg = getBeginningOfIdentifier( - AST, Pos, AST.getSourceManager().getMainFileID()); + Pos, AST.getSourceManager(), AST.getASTContext().getLangOpts()); auto Decls = getDeclAtPosition(AST, SourceLocationBeg); if (Decls.empty()) return nullptr; Modified: clang-tools-extra/trunk/clangd/index/FileIndex.h URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/index/FileIndex.h?rev=370768&r1=370767&r2=370768&view=diff ============================================================================== --- clang-tools-extra/trunk/clangd/index/FileIndex.h (original) +++ clang-tools-extra/trunk/clangd/index/FileIndex.h Tue Sep 3 08:34:47 2019 @@ -15,10 +15,10 @@ #ifndef LLVM_CLANG_TOOLS_EXTRA_CLANGD_INDEX_FILEINDEX_H #define LLVM_CLANG_TOOLS_EXTRA_CLANGD_INDEX_FILEINDEX_H -#include "ClangdUnit.h" #include "Index.h" #include "MemIndex.h" #include "Merge.h" +#include "Path.h" #include "index/CanonicalIncludes.h" #include "index/Symbol.h" #include "clang/Lex/Preprocessor.h" @@ -26,6 +26,7 @@ namespace clang { namespace clangd { +class ParsedAST; /// Select between in-memory index implementations, which have tradeoffs. enum class IndexType { Modified: clang-tools-extra/trunk/clangd/refactor/Rename.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/refactor/Rename.cpp?rev=370768&r1=370767&r2=370768&view=diff ============================================================================== --- clang-tools-extra/trunk/clangd/refactor/Rename.cpp (original) +++ clang-tools-extra/trunk/clangd/refactor/Rename.cpp Tue Sep 3 08:34:47 2019 @@ -8,7 +8,9 @@ #include "refactor/Rename.h" #include "AST.h" +#include "ClangdUnit.h" #include "Logger.h" +#include "SourceCode.h" #include "index/SymbolCollector.h" #include "clang/Tooling/Refactoring/Rename/RenamingAction.h" #include "clang/Tooling/Refactoring/Rename/USRFinder.h" @@ -151,8 +153,8 @@ findOccurrencesWithinFile(ParsedAST &AST llvm::Expected<tooling::Replacements> renameWithinFile(ParsedAST &AST, llvm::StringRef File, Position Pos, llvm::StringRef NewName, const SymbolIndex *Index) { - SourceLocation SourceLocationBeg = clangd::getBeginningOfIdentifier( - AST, Pos, AST.getSourceManager().getMainFileID()); + SourceLocation SourceLocationBeg = getBeginningOfIdentifier( + Pos, AST.getSourceManager(), AST.getASTContext().getLangOpts()); // FIXME: renaming macros is not supported yet, the macro-handling code should // be moved to rename tooling library. if (locateMacroAt(SourceLocationBeg, AST.getPreprocessor())) Modified: clang-tools-extra/trunk/clangd/refactor/Rename.h URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/refactor/Rename.h?rev=370768&r1=370767&r2=370768&view=diff ============================================================================== --- clang-tools-extra/trunk/clangd/refactor/Rename.h (original) +++ clang-tools-extra/trunk/clangd/refactor/Rename.h Tue Sep 3 08:34:47 2019 @@ -9,12 +9,14 @@ #ifndef LLVM_CLANG_TOOLS_EXTRA_CLANGD_REFACTOR_RENAME_H #define LLVM_CLANG_TOOLS_EXTRA_CLANGD_REFACTOR_RENAME_H -#include "ClangdUnit.h" +#include "Protocol.h" #include "clang/Tooling/Core/Replacement.h" #include "llvm/Support/Error.h" namespace clang { namespace clangd { +class ParsedAST; +class SymbolIndex; /// Renames all occurrences of the symbol at \p Pos to \p NewName. /// Occurrences outside the current file are not modified. Modified: clang-tools-extra/trunk/clangd/unittests/ClangdUnitTests.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/unittests/ClangdUnitTests.cpp?rev=370768&r1=370767&r2=370768&view=diff ============================================================================== --- clang-tools-extra/trunk/clangd/unittests/ClangdUnitTests.cpp (original) +++ clang-tools-extra/trunk/clangd/unittests/ClangdUnitTests.cpp Tue Sep 3 08:34:47 2019 @@ -30,45 +30,6 @@ using ::testing::ElementsAre; using ::testing::ElementsAreArray; using ::testing::AllOf; -TEST(ClangdUnitTest, GetBeginningOfIdentifier) { - std::string Preamble = R"cpp( -struct Bar { int func(); }; -#define MACRO(X) void f() { X; } -Bar* bar; - )cpp"; - // First ^ is the expected beginning, last is the search position. - for (std::string Text : std::vector<std::string>{ - "int ^f^oo();", // inside identifier - "int ^foo();", // beginning of identifier - "int ^foo^();", // end of identifier - "int foo(^);", // non-identifier - "^int foo();", // beginning of file (can't back up) - "int ^f0^0();", // after a digit (lexing at N-1 is wrong) - "int ^λλ^λ();", // UTF-8 handled properly when backing up - - // identifier in macro arg - "MACRO(bar->^func())", // beginning of identifier - "MACRO(bar->^fun^c())", // inside identifier - "MACRO(bar->^func^())", // end of identifier - "MACRO(^bar->func())", // begin identifier - "MACRO(^bar^->func())", // end identifier - "^MACRO(bar->func())", // beginning of macro name - "^MAC^RO(bar->func())", // inside macro name - "^MACRO^(bar->func())", // end of macro name - }) { - std::string WithPreamble = Preamble + Text; - Annotations TestCase(WithPreamble); - auto AST = TestTU::withCode(TestCase.code()).build(); - const auto &SourceMgr = AST.getSourceManager(); - SourceLocation Actual = getBeginningOfIdentifier( - AST, TestCase.points().back(), SourceMgr.getMainFileID()); - Position ActualPos = offsetToPosition( - TestCase.code(), - SourceMgr.getFileOffset(SourceMgr.getSpellingLoc(Actual))); - EXPECT_EQ(TestCase.points().front(), ActualPos) << Text; - } -} - MATCHER_P(DeclNamed, Name, "") { if (NamedDecl *ND = dyn_cast<NamedDecl>(arg)) if (ND->getName() == Name) Modified: clang-tools-extra/trunk/clangd/unittests/SourceCodeTests.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/unittests/SourceCodeTests.cpp?rev=370768&r1=370767&r2=370768&view=diff ============================================================================== --- clang-tools-extra/trunk/clangd/unittests/SourceCodeTests.cpp (original) +++ clang-tools-extra/trunk/clangd/unittests/SourceCodeTests.cpp Tue Sep 3 08:34:47 2019 @@ -312,6 +312,45 @@ TEST(SourceCodeTests, SourceLocationInMa } } +TEST(ClangdUnitTest, GetBeginningOfIdentifier) { + std::string Preamble = R"cpp( +struct Bar { int func(); }; +#define MACRO(X) void f() { X; } +Bar* bar; + )cpp"; + // First ^ is the expected beginning, last is the search position. + for (std::string Text : std::vector<std::string>{ + "int ^f^oo();", // inside identifier + "int ^foo();", // beginning of identifier + "int ^foo^();", // end of identifier + "int foo(^);", // non-identifier + "^int foo();", // beginning of file (can't back up) + "int ^f0^0();", // after a digit (lexing at N-1 is wrong) + "int ^λλ^λ();", // UTF-8 handled properly when backing up + + // identifier in macro arg + "MACRO(bar->^func())", // beginning of identifier + "MACRO(bar->^fun^c())", // inside identifier + "MACRO(bar->^func^())", // end of identifier + "MACRO(^bar->func())", // begin identifier + "MACRO(^bar^->func())", // end identifier + "^MACRO(bar->func())", // beginning of macro name + "^MAC^RO(bar->func())", // inside macro name + "^MACRO^(bar->func())", // end of macro name + }) { + std::string WithPreamble = Preamble + Text; + Annotations TestCase(WithPreamble); + auto AST = TestTU::withCode(TestCase.code()).build(); + const auto &SourceMgr = AST.getSourceManager(); + SourceLocation Actual = getBeginningOfIdentifier( + TestCase.points().back(), SourceMgr, AST.getASTContext().getLangOpts()); + Position ActualPos = offsetToPosition( + TestCase.code(), + SourceMgr.getFileOffset(SourceMgr.getSpellingLoc(Actual))); + EXPECT_EQ(TestCase.points().front(), ActualPos) << Text; + } +} + TEST(SourceCodeTests, CollectIdentifiers) { auto Style = format::getLLVMStyle(); auto IDs = collectIdentifiers(R"cpp( @@ -417,8 +456,8 @@ TEST(SourceCodeTests, GetMacros) { )cpp"); TestTU TU = TestTU::withCode(Code.code()); auto AST = TU.build(); - auto Loc = getBeginningOfIdentifier(AST, Code.point(), - AST.getSourceManager().getMainFileID()); + auto Loc = getBeginningOfIdentifier(Code.point(), AST.getSourceManager(), + AST.getASTContext().getLangOpts()); auto Result = locateMacroAt(Loc, AST.getPreprocessor()); ASSERT_TRUE(Result); EXPECT_THAT(*Result, MacroName("MACRO")); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits