diff options
Diffstat (limited to 'clangd/index/SymbolCollector.cpp')
-rw-r--r-- | clangd/index/SymbolCollector.cpp | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/clangd/index/SymbolCollector.cpp b/clangd/index/SymbolCollector.cpp index 5b364291..6b575ab6 100644 --- a/clangd/index/SymbolCollector.cpp +++ b/clangd/index/SymbolCollector.cpp @@ -56,6 +56,18 @@ std::string makeAbsolutePath(const SourceManager &SM, StringRef Path) { } return AbsolutePath.str(); } + +// Split a qualified symbol name into scope and unqualified name, e.g. given +// "a::b::c", return {"a::b", "c"}. Scope is empty if it doesn't exist. +std::pair<llvm::StringRef, llvm::StringRef> +splitQualifiedName(llvm::StringRef QName) { + assert(!QName.startswith("::") && "Qualified names should not start with ::"); + size_t Pos = QName.rfind("::"); + if (Pos == llvm::StringRef::npos) + return {StringRef(), QName}; + return {QName.substr(0, Pos), QName.substr(Pos + 2)}; +} + } // namespace // Always return true to continue indexing. @@ -86,7 +98,9 @@ bool SymbolCollector::handleDeclOccurence( SymbolLocation Location = { makeAbsolutePath(SM, SM.getFilename(D->getLocation())), SM.getFileOffset(D->getLocStart()), SM.getFileOffset(D->getLocEnd())}; - Symbols.insert({std::move(ID), ND->getQualifiedNameAsString(), + std::string QName = ND->getQualifiedNameAsString(); + auto ScopeAndName = splitQualifiedName(QName); + Symbols.insert({std::move(ID), ScopeAndName.second, ScopeAndName.first, index::getSymbolInfo(D), std::move(Location)}); } |