[clang-tools-extra] r344604 - [clangd] Allow disble down traversals from root.

Eric Liu via cfe-commits cfe-commits at lists.llvm.org
Tue Oct 16 03:41:17 PDT 2018


Author: ioeric
Date: Tue Oct 16 03:41:17 2018
New Revision: 344604

URL: http://llvm.org/viewvc/llvm-project?rev=344604&view=rev
Log:
[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

Modified:
    clang-tools-extra/trunk/clangd/FileDistance.cpp
    clang-tools-extra/trunk/clangd/FileDistance.h
    clang-tools-extra/trunk/unittests/clangd/FileDistanceTests.cpp

Modified: clang-tools-extra/trunk/clangd/FileDistance.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/FileDistance.cpp?rev=344604&r1=344603&r2=344604&view=diff
==============================================================================
--- clang-tools-extra/trunk/clangd/FileDistance.cpp (original)
+++ clang-tools-extra/trunk/clangd/FileDistance.cpp Tue Oct 16 03:41:17 2018
@@ -54,6 +54,7 @@ static SmallString<128> canonicalize(Str
 }
 
 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<Sou
   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(StringRe
   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;

Modified: clang-tools-extra/trunk/clangd/FileDistance.h
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/FileDistance.h?rev=344604&r1=344603&r2=344604&view=diff
==============================================================================
--- clang-tools-extra/trunk/clangd/FileDistance.h (original)
+++ clang-tools-extra/trunk/clangd/FileDistance.h Tue Oct 16 03:41:17 2018
@@ -56,6 +56,7 @@ struct FileDistanceOptions {
   unsigned UpCost = 2;      // |foo/bar.h -> foo|
   unsigned DownCost = 1;    // |foo -> foo/bar.h|
   unsigned IncludeCost = 2; // |foo.cc -> included_header.h|
+  bool AllowDownTraversalFromRoot = true; // | / -> /a |
 };
 
 struct SourceParams {
@@ -70,6 +71,7 @@ struct SourceParams {
 class FileDistance {
 public:
   static constexpr unsigned Unreachable = std::numeric_limits<unsigned>::max();
+  static const llvm::hash_code RootHash;
 
   FileDistance(llvm::StringMap<SourceParams> Sources,
                const FileDistanceOptions &Opts = {});

Modified: clang-tools-extra/trunk/unittests/clangd/FileDistanceTests.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/unittests/clangd/FileDistanceTests.cpp?rev=344604&r1=344603&r2=344604&view=diff
==============================================================================
--- clang-tools-extra/trunk/unittests/clangd/FileDistanceTests.cpp (original)
+++ clang-tools-extra/trunk/unittests/clangd/FileDistanceTests.cpp Tue Oct 16 03:41:17 2018
@@ -95,6 +95,20 @@ TEST(FileDistance, LimitUpTraversals) {
   EXPECT_EQ(D.distance("/a/b/z"), 2u);
 }
 
+TEST(FileDistance, DisallowDownTraversalsFromRoot) {
+  FileDistanceOptions Opts;
+  Opts.UpCost = Opts.DownCost = 1;
+  Opts.AllowDownTraversalFromRoot = false;
+  SourceParams CostLots;
+  CostLots.Cost = 100;
+
+  FileDistance D({{"/", SourceParams()}, {"/a/b/c", CostLots}}, Opts);
+  EXPECT_EQ(D.distance("/"), 0u);
+  EXPECT_EQ(D.distance("/a"), 102u);
+  EXPECT_EQ(D.distance("/a/b"), 101u);
+  EXPECT_EQ(D.distance("/x"), FileDistance::Unreachable);
+}
+
 } // namespace
 } // namespace clangd
 } // namespace clang




More information about the cfe-commits mailing list