[PATCH] D79881: [clangd] locateMacroAt returns definition range instead of MacroInfo

Kadir Cetinkaya via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Wed May 13 09:44:36 PDT 2020


kadircet created this revision.
Herald added subscribers: cfe-commits, usaxena95, arphaman, jkorous, MaskRay, ilya-biryukov.
Herald added a project: clang.

Depends on D79879 <https://reviews.llvm.org/D79879>.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D79881

Files:
  clang-tools-extra/clangd/Hover.cpp
  clang-tools-extra/clangd/SourceCode.cpp
  clang-tools-extra/clangd/SourceCode.h
  clang-tools-extra/clangd/XRefs.cpp
  clang-tools-extra/clangd/unittests/CollectMacrosTests.cpp


Index: clang-tools-extra/clangd/unittests/CollectMacrosTests.cpp
===================================================================
--- clang-tools-extra/clangd/unittests/CollectMacrosTests.cpp
+++ 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,
Index: clang-tools-extra/clangd/XRefs.cpp
===================================================================
--- clang-tools-extra/clangd/XRefs.cpp
+++ 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);
     }
Index: clang-tools-extra/clangd/SourceCode.h
===================================================================
--- clang-tools-extra/clangd/SourceCode.h
+++ 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.
Index: clang-tools-extra/clangd/SourceCode.cpp
===================================================================
--- clang-tools-extra/clangd/SourceCode.cpp
+++ 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;
 }
 
Index: clang-tools-extra/clangd/Hover.cpp
===================================================================
--- clang-tools-extra/clangd/Hover.cpp
+++ 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;


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D79881.263756.patch
Type: text/x-patch
Size: 4258 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20200513/db5bcb38/attachment-0001.bin>


More information about the cfe-commits mailing list