diff --git a/clang-tools-extra/clangd/Hover.cpp b/clang-tools-extra/clangd/Hover.cpp --- a/clang-tools-extra/clangd/Hover.cpp +++ b/clang-tools-extra/clangd/Hover.cpp @@ -553,8 +553,8 @@ // FIXME: Populate parameters // Try to get the full definition, not just the name - SourceLocation StartLoc = Macro.Info->getDefinitionLoc(); - SourceLocation EndLoc = Macro.Info->getDefinitionEndLoc(); + SourceLocation StartLoc = Macro.DefRange.getBegin(); + SourceLocation EndLoc = Macro.DefRange.getEnd(); if (EndLoc.isValid()) { EndLoc = Lexer::getLocForEndOfToken(EndLoc, 0, SM, AST.getLangOpts()); bool Invalid; diff --git a/clang-tools-extra/clangd/SourceCode.h b/clang-tools-extra/clangd/SourceCode.h --- a/clang-tools-extra/clangd/SourceCode.h +++ b/clang-tools-extra/clangd/SourceCode.h @@ -291,7 +291,7 @@ struct DefinedMacro { llvm::StringRef Name; - const MacroInfo *Info; + CharSourceRange DefRange; }; /// Gets the macro referenced by \p SpelledTok. It must be a spelled token /// aligned to the beginning of an identifier. diff --git a/clang-tools-extra/clangd/SourceCode.cpp b/clang-tools-extra/clangd/SourceCode.cpp --- a/clang-tools-extra/clangd/SourceCode.cpp +++ b/clang-tools-extra/clangd/SourceCode.cpp @@ -961,7 +961,11 @@ Loc = Loc.getLocWithOffset(-1); MacroDefinition MacroDef = PP.getMacroDefinitionAtLoc(IdentifierInfo, Loc); if (auto *MI = MacroDef.getMacroInfo()) - return DefinedMacro{IdentifierInfo->getName(), MI}; + return DefinedMacro{ + IdentifierInfo->getName(), + // MacroInfo::getDefinitionEndLoc returns the location for last token. + CharSourceRange::getTokenRange(MI->getDefinitionLoc(), + MI->getDefinitionEndLoc())}; return None; } diff --git a/clang-tools-extra/clangd/XRefs.cpp b/clang-tools-extra/clangd/XRefs.cpp --- a/clang-tools-extra/clangd/XRefs.cpp +++ b/clang-tools-extra/clangd/XRefs.cpp @@ -206,8 +206,8 @@ locateMacroReferent(const syntax::Token &TouchedIdentifier, ParsedAST &AST, llvm::StringRef MainFilePath) { if (auto M = locateMacroAt(TouchedIdentifier, AST.getPreprocessor())) { - if (auto Loc = makeLocation(AST.getASTContext(), - M->Info->getDefinitionLoc(), MainFilePath)) { + if (auto Loc = makeLocation(AST.getASTContext(), M->DefRange.getBegin(), + MainFilePath)) { LocatedSymbol Macro; Macro.Name = std::string(M->Name); Macro.PreferredDeclaration = *Loc; @@ -753,10 +753,10 @@ } RefsRequest Req; - if (Macro && Macro->Info) { + if (Macro) { // Handle references to macro. if (auto MacroSID = - getSymbolID(Macro->Name, Macro->Info->getDefinitionLoc(), SM)) { + getSymbolID(Macro->Name, Macro->DefRange.getBegin(), SM)) { // Collect macro references from main file. const auto &IDToRefs = AST.getMacros().MacroRefs; auto Refs = IDToRefs.find(*MacroSID); @@ -875,8 +875,8 @@ SymbolDetails NewMacro; NewMacro.name = std::string(M->Name); llvm::SmallString<32> USR; - if (!index::generateUSRForMacro(NewMacro.name, M->Info->getDefinitionLoc(), - SM, USR)) { + if (!index::generateUSRForMacro(NewMacro.name, M->DefRange.getBegin(), SM, + USR)) { NewMacro.USR = std::string(USR.str()); NewMacro.ID = SymbolID(NewMacro.USR); } diff --git a/clang-tools-extra/clangd/unittests/CollectMacrosTests.cpp b/clang-tools-extra/clangd/unittests/CollectMacrosTests.cpp --- a/clang-tools-extra/clangd/unittests/CollectMacrosTests.cpp +++ b/clang-tools-extra/clangd/unittests/CollectMacrosTests.cpp @@ -92,8 +92,8 @@ const auto *Id = syntax::spelledIdentifierTouching(*Loc, AST.getTokens()); ASSERT_TRUE(Id); auto Macro = locateMacroAt(*Id, PP); - assert(Macro && Macro->Info); - auto SID = getSymbolID(Macro->Name, Macro->Info->getDefinitionLoc(), SM); + assert(Macro); + auto SID = getSymbolID(Macro->Name, Macro->DefRange.getBegin(), SM); assert(SID); EXPECT_THAT(ExpectedRefs,