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) { _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits