kadircet created this revision.
Herald added subscribers: cfe-commits, usaxena95, arphaman, jkorous, MaskRay, 
ilya-biryukov.
Herald added a project: clang.
kadircet added a child revision: D79881: [clangd] locateMacroAt returns 
definition range instead of MacroInfo.

Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D79879

Files:
  clang-tools-extra/clangd/AST.cpp
  clang-tools-extra/clangd/AST.h
  clang-tools-extra/clangd/CodeComplete.cpp
  clang-tools-extra/clangd/CollectMacros.cpp
  clang-tools-extra/clangd/XRefs.cpp
  clang-tools-extra/clangd/index/SymbolCollector.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,9 @@
       const auto *Id = syntax::spelledIdentifierTouching(*Loc, AST.getTokens());
       ASSERT_TRUE(Id);
       auto Macro = locateMacroAt(*Id, PP);
-      assert(Macro);
-      auto SID = getSymbolID(Macro->Name, Macro->Info, SM);
+      assert(Macro && Macro->Info);
+      auto SID = getSymbolID(Macro->Name, Macro->Info->getDefinitionLoc(), SM);
+      assert(SID);
 
       EXPECT_THAT(ExpectedRefs,
                   UnorderedElementsAreArray(ActualMacroRefs.MacroRefs[*SID]))
Index: clang-tools-extra/clangd/index/SymbolCollector.cpp
===================================================================
--- clang-tools-extra/clangd/index/SymbolCollector.cpp
+++ clang-tools-extra/clangd/index/SymbolCollector.cpp
@@ -387,7 +387,7 @@
   if (SM.isWrittenInBuiltinFile(DefLoc))
     return true;
 
-  auto ID = getSymbolID(Name->getName(), MI, SM);
+  auto ID = getSymbolID(Name->getName(), DefLoc, SM);
   if (!ID)
     return true;
 
@@ -510,14 +510,16 @@
     // First, drop header guards. We can't identify these until EOF.
     for (const IdentifierInfo *II : IndexedMacros) {
       if (const auto *MI = PP->getMacroDefinition(II).getMacroInfo())
-        if (auto ID = getSymbolID(II->getName(), MI, PP->getSourceManager()))
+        if (auto ID = getSymbolID(II->getName(), MI->getDefinitionLoc(),
+                                  PP->getSourceManager()))
           if (MI->isUsedForHeaderGuard())
             Symbols.erase(*ID);
     }
     // Now increment refcounts.
     for (const IdentifierInfo *II : ReferencedMacros) {
       if (const auto *MI = PP->getMacroDefinition(II).getMacroInfo())
-        if (auto ID = getSymbolID(II->getName(), MI, PP->getSourceManager()))
+        if (auto ID = getSymbolID(II->getName(), MI->getDefinitionLoc(),
+                                  PP->getSourceManager()))
           IncRef(*ID);
     }
   }
Index: clang-tools-extra/clangd/XRefs.cpp
===================================================================
--- clang-tools-extra/clangd/XRefs.cpp
+++ clang-tools-extra/clangd/XRefs.cpp
@@ -753,9 +753,10 @@
   }
 
   RefsRequest Req;
-  if (Macro) {
+  if (Macro && Macro->Info) {
     // Handle references to macro.
-    if (auto MacroSID = getSymbolID(Macro->Name, Macro->Info, SM)) {
+    if (auto MacroSID =
+            getSymbolID(Macro->Name, Macro->Info->getDefinitionLoc(), SM)) {
       // Collect macro references from main file.
       const auto &IDToRefs = AST.getMacros().MacroRefs;
       auto Refs = IDToRefs.find(*MacroSID);
Index: clang-tools-extra/clangd/CollectMacros.cpp
===================================================================
--- clang-tools-extra/clangd/CollectMacros.cpp
+++ clang-tools-extra/clangd/CollectMacros.cpp
@@ -7,8 +7,10 @@
 //===----------------------------------------------------------------------===//
 
 #include "CollectMacros.h"
+#include "index/SymbolID.h"
 #include "clang/Basic/SourceLocation.h"
 #include "clang/Lex/Lexer.h"
+#include "llvm/ADT/Optional.h"
 
 namespace clang {
 namespace clangd {
@@ -25,7 +27,10 @@
   Out.Names.insert(Name);
   auto Range = halfOpenToRange(
       SM, CharSourceRange::getCharRange(Loc, MacroNameTok.getEndLoc()));
-  if (auto SID = getSymbolID(Name, MI, SM))
+  llvm::Optional<SymbolID> SID;
+  if (MI)
+    SID = getSymbolID(Name, MI->getDefinitionLoc(), SM);
+  if (SID)
     Out.MacroRefs[*SID].push_back(Range);
   else
     Out.UnknownMacros.push_back(Range);
Index: clang-tools-extra/clangd/CodeComplete.cpp
===================================================================
--- clang-tools-extra/clangd/CodeComplete.cpp
+++ clang-tools-extra/clangd/CodeComplete.cpp
@@ -503,9 +503,12 @@
     return clang::clangd::getSymbolID(R.Declaration);
   }
   case CodeCompletionResult::RK_Macro:
-    return clang::clangd::getSymbolID(R.Macro->getName(), R.MacroDefInfo, SM);
+    if (!R.MacroDefInfo)
+      return llvm::None;
+    return clang::clangd::getSymbolID(R.Macro->getName(),
+                                      R.MacroDefInfo->getDefinitionLoc(), SM);
   case CodeCompletionResult::RK_Keyword:
-    return None;
+    return llvm::None;
   }
   llvm_unreachable("unknown CodeCompletionResult kind");
 }
Index: clang-tools-extra/clangd/AST.h
===================================================================
--- clang-tools-extra/clangd/AST.h
+++ clang-tools-extra/clangd/AST.h
@@ -75,7 +75,7 @@
 /// could change these semantics in the future by reimplementing this funcure
 /// (e.g. avoid USR for macros).
 llvm::Optional<SymbolID> getSymbolID(const llvm::StringRef MacroName,
-                                     const MacroInfo *MI,
+                                     SourceLocation DefLoc,
                                      const SourceManager &SM);
 
 /// Returns a QualType as string. The result doesn't contain unwritten scopes
Index: clang-tools-extra/clangd/AST.cpp
===================================================================
--- clang-tools-extra/clangd/AST.cpp
+++ clang-tools-extra/clangd/AST.cpp
@@ -290,12 +290,10 @@
 }
 
 llvm::Optional<SymbolID> getSymbolID(const llvm::StringRef MacroName,
-                                     const MacroInfo *MI,
+                                     SourceLocation DefLoc,
                                      const SourceManager &SM) {
-  if (MI == nullptr)
-    return None;
   llvm::SmallString<128> USR;
-  if (index::generateUSRForMacro(MacroName, MI->getDefinitionLoc(), SM, USR))
+  if (index::generateUSRForMacro(MacroName, DefLoc, SM, USR))
     return None;
   return SymbolID(USR);
 }
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to