[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