[Lldb-commits] [lldb] r300386 - Fix crash when completing in the current directory.

Zachary Turner via lldb-commits lldb-commits at lists.llvm.org
Fri Apr 14 19:44:53 PDT 2017


Author: zturner
Date: Fri Apr 14 21:44:53 2017
New Revision: 300386

URL: http://llvm.org/viewvc/llvm-project?rev=300386&view=rev
Log:
Fix crash when completing in the current directory.

Modified:
    lldb/trunk/source/Commands/CommandCompletions.cpp
    lldb/trunk/unittests/Interpreter/TestCompletion.cpp

Modified: lldb/trunk/source/Commands/CommandCompletions.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Commands/CommandCompletions.cpp?rev=300386&r1=300385&r2=300386&view=diff
==============================================================================
--- lldb/trunk/source/Commands/CommandCompletions.cpp (original)
+++ lldb/trunk/source/Commands/CommandCompletions.cpp Fri Apr 14 21:44:53 2017
@@ -176,7 +176,10 @@ static int DiskFilesOrDirectories(const
   if (PartialItem == ".")
     PartialItem = llvm::StringRef();
 
-  assert(!SearchDir.empty());
+  if (SearchDir.empty()) {
+    llvm::sys::fs::current_path(Storage);
+    SearchDir = Storage;
+  }
   assert(!PartialItem.contains(path::get_separator()));
 
   // SearchDir now contains the directory to search in, and Prefix contains the

Modified: lldb/trunk/unittests/Interpreter/TestCompletion.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/unittests/Interpreter/TestCompletion.cpp?rev=300386&r1=300385&r2=300386&view=diff
==============================================================================
--- lldb/trunk/unittests/Interpreter/TestCompletion.cpp (original)
+++ lldb/trunk/unittests/Interpreter/TestCompletion.cpp Fri Apr 14 21:44:53 2017
@@ -43,6 +43,8 @@ protected:
   /// be placed. It is removed at the end of the test suite.
   static SmallString<128> BaseDir;
 
+  static SmallString<128> OriginalWorkingDir;
+
   static SmallString<128> DirFoo;
   static SmallString<128> DirFooA;
   static SmallString<128> DirFooB;
@@ -58,7 +60,11 @@ protected:
   static SmallString<128> FileBar;
   static SmallString<128> FileBaz;
 
+  void SetUp() override { llvm::sys::fs::set_current_path(OriginalWorkingDir); }
+
   static void SetUpTestCase() {
+    llvm::sys::fs::current_path(OriginalWorkingDir);
+
     ASSERT_NO_ERROR(fs::createUniqueDirectory("FsCompletion", BaseDir));
     const char *DirNames[] = {"foo", "fooa", "foob",       "fooc",
                               "bar", "baz",  "test_folder"};
@@ -106,9 +112,33 @@ protected:
     }
     return false;
   }
+
+  void DoDirCompletions(const Twine &Prefix,
+                        StandardTildeExpressionResolver &Resolver,
+                        StringList &Results) {
+    // When a partial name matches, it returns all matches.  If it matches both
+    // a full name AND some partial names, it returns all of them.
+    uint32_t Count =
+        CommandCompletions::DiskDirectories(Prefix + "foo", Results, Resolver);
+    ASSERT_EQ(4u, Count);
+    ASSERT_EQ(Count, Results.GetSize());
+    EXPECT_TRUE(HasEquivalentFile(DirFoo, Results));
+    EXPECT_TRUE(HasEquivalentFile(DirFooA, Results));
+    EXPECT_TRUE(HasEquivalentFile(DirFooB, Results));
+    EXPECT_TRUE(HasEquivalentFile(DirFooC, Results));
+
+    // If it matches only partial names, it still works as expected.
+    Count = CommandCompletions::DiskDirectories(Twine(Prefix) + "b", Results,
+                                                Resolver);
+    ASSERT_EQ(2u, Count);
+    ASSERT_EQ(Count, Results.GetSize());
+    EXPECT_TRUE(HasEquivalentFile(DirBar, Results));
+    EXPECT_TRUE(HasEquivalentFile(DirBaz, Results));
+  }
 };
 
 SmallString<128> CompletionTest::BaseDir;
+SmallString<128> CompletionTest::OriginalWorkingDir;
 
 SmallString<128> CompletionTest::DirFoo;
 SmallString<128> CompletionTest::DirFooA;
@@ -132,8 +162,11 @@ TEST_F(CompletionTest, DirCompletionAbso
   // by asserting an exact result count, and verifying against known
   // folders.
 
+  std::string Prefixes[] = {(Twine(BaseDir) + "/").str(), ""};
+
   StandardTildeExpressionResolver Resolver;
   StringList Results;
+
   // When a directory is specified that doesn't end in a slash, it searches
   // for that directory, not items under it.
   size_t Count =
@@ -143,8 +176,7 @@ TEST_F(CompletionTest, DirCompletionAbso
   EXPECT_TRUE(HasEquivalentFile(BaseDir, Results));
 
   // When the same directory ends with a slash, it finds all children.
-  Count = CommandCompletions::DiskDirectories(Twine(BaseDir) + "/", Results,
-                                              Resolver);
+  Count = CommandCompletions::DiskDirectories(Prefixes[0], Results, Resolver);
   ASSERT_EQ(7u, Count);
   ASSERT_EQ(Count, Results.GetSize());
   EXPECT_TRUE(HasEquivalentFile(DirFoo, Results));
@@ -155,24 +187,9 @@ TEST_F(CompletionTest, DirCompletionAbso
   EXPECT_TRUE(HasEquivalentFile(DirBaz, Results));
   EXPECT_TRUE(HasEquivalentFile(DirTestFolder, Results));
 
-  // When a partial name matches, it returns all matches.  If it matches both
-  // a full name AND some partial names, it returns all of them.
-  Count = CommandCompletions::DiskDirectories(Twine(BaseDir) + "/foo", Results,
-                                              Resolver);
-  ASSERT_EQ(4u, Count);
-  ASSERT_EQ(Count, Results.GetSize());
-  EXPECT_TRUE(HasEquivalentFile(DirFoo, Results));
-  EXPECT_TRUE(HasEquivalentFile(DirFooA, Results));
-  EXPECT_TRUE(HasEquivalentFile(DirFooB, Results));
-  EXPECT_TRUE(HasEquivalentFile(DirFooC, Results));
-
-  // If it matches only partial names, it still works as expected.
-  Count = CommandCompletions::DiskDirectories(Twine(BaseDir) + "/b", Results,
-                                              Resolver);
-  ASSERT_EQ(2u, Count);
-  ASSERT_EQ(Count, Results.GetSize());
-  EXPECT_TRUE(HasEquivalentFile(DirBar, Results));
-  EXPECT_TRUE(HasEquivalentFile(DirBaz, Results));
+  DoDirCompletions(Twine(BaseDir) + "/", Resolver, Results);
+  llvm::sys::fs::set_current_path(BaseDir);
+  DoDirCompletions("", Resolver, Results);
 }
 
 TEST_F(CompletionTest, FileCompletionAbsolute) {




More information about the lldb-commits mailing list