diff options
author | Eric Liu <ioeric@google.com> | 2018-10-16 10:41:17 +0000 |
---|---|---|
committer | Eric Liu <ioeric@google.com> | 2018-10-16 10:41:17 +0000 |
commit | 0c29722c609e9aabf585d798f5c9ccce369c09db (patch) | |
tree | ba975bafab0f9a23d059f3bc932dd091b93292d4 /clang-tools-extra/clangd/FileDistance.cpp | |
parent | e60eae425647e5f0dfe1ea6a3650ac229c2eeb8c (diff) | |
download | bcm5719-llvm-0c29722c609e9aabf585d798f5c9ccce369c09db.tar.gz bcm5719-llvm-0c29722c609e9aabf585d798f5c9ccce369c09db.zip |
[clangd] Allow disble down traversals from root.
Summary:
This is useful for symbo scope proximity, where down traversals from
the global scope if not desired.
Reviewers: sammccall
Subscribers: ilya-biryukov, MaskRay, jkorous, arphaman, kadircet, cfe-commits
Differential Revision: https://reviews.llvm.org/D53317
llvm-svn: 344604
Diffstat (limited to 'clang-tools-extra/clangd/FileDistance.cpp')
-rw-r--r-- | clang-tools-extra/clangd/FileDistance.cpp | 23 |
1 files changed, 16 insertions, 7 deletions
diff --git a/clang-tools-extra/clangd/FileDistance.cpp b/clang-tools-extra/clangd/FileDistance.cpp index e530ad5235d..2ae9043a0fc 100644 --- a/clang-tools-extra/clangd/FileDistance.cpp +++ b/clang-tools-extra/clangd/FileDistance.cpp @@ -54,6 +54,7 @@ static SmallString<128> canonicalize(StringRef Path) { } constexpr const unsigned FileDistance::Unreachable; +const llvm::hash_code FileDistance::RootHash = hash_value(StringRef("/")); FileDistance::FileDistance(StringMap<SourceParams> Sources, const FileDistanceOptions &Opts) @@ -99,15 +100,18 @@ FileDistance::FileDistance(StringMap<SourceParams> Sources, for (auto Child : DownEdges.lookup(hash_value(llvm::StringRef("")))) Next.push(Child); while (!Next.empty()) { - auto ParentCost = Cache.lookup(Next.front()); - for (auto Child : DownEdges.lookup(Next.front())) { - auto &ChildCost = - Cache.try_emplace(Child, Unreachable).first->getSecond(); - if (ParentCost + Opts.DownCost < ChildCost) - ChildCost = ParentCost + Opts.DownCost; + auto Parent = Next.front(); + Next.pop(); + auto ParentCost = Cache.lookup(Parent); + for (auto Child : DownEdges.lookup(Parent)) { + if (Parent != RootHash || Opts.AllowDownTraversalFromRoot) { + auto &ChildCost = + Cache.try_emplace(Child, Unreachable).first->getSecond(); + if (ParentCost + Opts.DownCost < ChildCost) + ChildCost = ParentCost + Opts.DownCost; + } Next.push(Child); } - Next.pop(); } } @@ -119,6 +123,11 @@ unsigned FileDistance::distance(StringRef Path) { for (StringRef Rest = Canonical; !Rest.empty(); Rest = parent_path(Rest, sys::path::Style::posix)) { auto Hash = hash_value(Rest); + if (Hash == RootHash && !Ancestors.empty() && + !Opts.AllowDownTraversalFromRoot) { + Cost = Unreachable; + break; + } auto It = Cache.find(Hash); if (It != Cache.end()) { Cost = It->second; |