summaryrefslogtreecommitdiff
path: root/lldb
diff options
context:
space:
mode:
authorJonas Devlieghere <jonas@devlieghere.com>2018-11-09 00:50:50 +0000
committerJonas Devlieghere <jonas@devlieghere.com>2018-11-09 00:50:50 +0000
commitb1ee7857983ea79ed21a59cf9ff99b3882296863 (patch)
treea05af38326bbebf77486445447585c6161f47ba0 /lldb
parentfa768a3e55524f5b117f57c5ba4ce44846976179 (diff)
[FileSystem] Make use of FS in TildeExpressionResolver
In order to call real_path from the TildeExpressionResolver we need access to the FileSystem. Since the resolver lives under utility we have to pass in the FS.
Diffstat (limited to 'lldb')
-rw-r--r--lldb/include/lldb/Host/FileSystem.h3
-rw-r--r--lldb/include/lldb/Utility/TildeExpressionResolver.h10
-rw-r--r--lldb/source/Commands/CommandCompletions.cpp2
-rw-r--r--lldb/source/Host/common/FileSystem.cpp9
-rw-r--r--lldb/source/Target/TargetList.cpp4
-rw-r--r--lldb/source/Utility/TildeExpressionResolver.cpp4
-rw-r--r--lldb/unittests/Host/FileSystemTest.cpp4
-rw-r--r--lldb/unittests/Interpreter/TestCompletion.cpp16
-rw-r--r--lldb/unittests/TestingSupport/MockTildeExpressionResolver.cpp5
-rw-r--r--lldb/unittests/TestingSupport/MockTildeExpressionResolver.h3
-rw-r--r--lldb/unittests/Utility/TildeExpressionResolverTest.cpp4
11 files changed, 43 insertions, 21 deletions
diff --git a/lldb/include/lldb/Host/FileSystem.h b/lldb/include/lldb/Host/FileSystem.h
index 730cbd2a421..c92454bd3ee 100644
--- a/lldb/include/lldb/Host/FileSystem.h
+++ b/lldb/include/lldb/Host/FileSystem.h
@@ -132,7 +132,8 @@ public:
void *callback_baton);
std::error_code GetRealPath(const llvm::Twine &path,
- llvm::SmallVectorImpl<char> &output) const;
+ llvm::SmallVectorImpl<char> &output,
+ bool expand_tilde) const;
private:
static llvm::Optional<FileSystem> &InstanceImpl();
diff --git a/lldb/include/lldb/Utility/TildeExpressionResolver.h b/lldb/include/lldb/Utility/TildeExpressionResolver.h
index ae6b4073f6a..6ac8da23749 100644
--- a/lldb/include/lldb/Utility/TildeExpressionResolver.h
+++ b/lldb/include/lldb/Utility/TildeExpressionResolver.h
@@ -18,8 +18,10 @@ template <typename T> class SmallVectorImpl;
}
namespace lldb_private {
+class FileSystem;
class TildeExpressionResolver {
public:
+ TildeExpressionResolver(FileSystem &fs) : m_fs(fs) {}
virtual ~TildeExpressionResolver();
/// Resolve a Tilde Expression contained according to bash rules.
@@ -52,14 +54,20 @@ public:
/// the username portion with the matched result.
bool ResolveFullPath(llvm::StringRef Expr,
llvm::SmallVectorImpl<char> &Output);
+
+protected:
+ FileSystem &m_fs;
};
class StandardTildeExpressionResolver : public TildeExpressionResolver {
public:
+ StandardTildeExpressionResolver(FileSystem &fs)
+ : TildeExpressionResolver(fs) {}
+
bool ResolveExact(llvm::StringRef Expr,
llvm::SmallVectorImpl<char> &Output) override;
bool ResolvePartial(llvm::StringRef Expr, llvm::StringSet<> &Output) override;
};
-}
+} // namespace lldb_private
#endif // #ifndef LLDB_UTILITY_TILDE_EXPRESSION_RESOLVER_H
diff --git a/lldb/source/Commands/CommandCompletions.cpp b/lldb/source/Commands/CommandCompletions.cpp
index af699a543d4..2f569721025 100644
--- a/lldb/source/Commands/CommandCompletions.cpp
+++ b/lldb/source/Commands/CommandCompletions.cpp
@@ -231,7 +231,7 @@ static int DiskFilesOrDirectories(const llvm::Twine &partial_name,
static int DiskFilesOrDirectories(CompletionRequest &request,
bool only_directories) {
request.SetWordComplete(false);
- StandardTildeExpressionResolver resolver;
+ StandardTildeExpressionResolver resolver(FileSystem::Instance());
StringList matches;
DiskFilesOrDirectories(request.GetCursorArgumentPrefix(), only_directories,
matches, resolver);
diff --git a/lldb/source/Host/common/FileSystem.cpp b/lldb/source/Host/common/FileSystem.cpp
index a9ed5bd1847..c1f98c1ad65 100644
--- a/lldb/source/Host/common/FileSystem.cpp
+++ b/lldb/source/Host/common/FileSystem.cpp
@@ -183,8 +183,9 @@ std::error_code FileSystem::MakeAbsolute(FileSpec &file_spec) const {
}
std::error_code FileSystem::GetRealPath(const Twine &path,
- SmallVectorImpl<char> &output) const {
- return m_fs->getRealPath(path, output);
+ SmallVectorImpl<char> &output,
+ bool expand_tilde) const {
+ return m_fs->getRealPath(path, output, expand_tilde);
}
void FileSystem::Resolve(SmallVectorImpl<char> &path) {
@@ -193,8 +194,8 @@ void FileSystem::Resolve(SmallVectorImpl<char> &path) {
// Resolve tilde.
SmallString<128> original_path(path.begin(), path.end());
- StandardTildeExpressionResolver Resolver;
- Resolver.ResolveFullPath(original_path, path);
+ StandardTildeExpressionResolver resolver(*this);
+ resolver.ResolveFullPath(original_path, path);
// Try making the path absolute if it exists.
SmallString<128> absolute_path(path.begin(), path.end());
diff --git a/lldb/source/Target/TargetList.cpp b/lldb/source/Target/TargetList.cpp
index 5720777af37..b0653dd02e7 100644
--- a/lldb/source/Target/TargetList.cpp
+++ b/lldb/source/Target/TargetList.cpp
@@ -351,8 +351,8 @@ Status TargetList::CreateTargetInternal(Debugger &debugger,
// we want to expand the tilde but we don't want to resolve any symbolic
// links so we can't use the FileSpec constructor's resolve flag
llvm::SmallString<64> unglobbed_path;
- StandardTildeExpressionResolver Resolver;
- Resolver.ResolveFullPath(user_exe_path, unglobbed_path);
+ StandardTildeExpressionResolver resolver(FileSystem::Instance());
+ resolver.ResolveFullPath(user_exe_path, unglobbed_path);
if (unglobbed_path.empty())
file = FileSpec(user_exe_path);
diff --git a/lldb/source/Utility/TildeExpressionResolver.cpp b/lldb/source/Utility/TildeExpressionResolver.cpp
index ae947059d8b..8f3d04f90f0 100644
--- a/lldb/source/Utility/TildeExpressionResolver.cpp
+++ b/lldb/source/Utility/TildeExpressionResolver.cpp
@@ -8,13 +8,13 @@
//===----------------------------------------------------------------------===//
#include "lldb/Utility/TildeExpressionResolver.h"
+#include "lldb/Host/FileSystem.h"
#include <assert.h> // for assert
#include <system_error> // for error_code
#include "llvm/ADT/STLExtras.h" // for any_of
#include "llvm/ADT/SmallVector.h" // for SmallVectorImpl
-#include "llvm/Support/FileSystem.h"
#include "llvm/Support/Path.h"
#include "llvm/Support/raw_ostream.h" // for fs
@@ -37,7 +37,7 @@ bool StandardTildeExpressionResolver::ResolveExact(
assert(!llvm::any_of(Expr, [](char c) { return path::is_separator(c); }));
assert(Expr.empty() || Expr[0] == '~');
- return !fs::real_path(Expr, Output, true);
+ return !m_fs.GetRealPath(Expr, Output, true);
}
bool StandardTildeExpressionResolver::ResolvePartial(StringRef Expr,
diff --git a/lldb/unittests/Host/FileSystemTest.cpp b/lldb/unittests/Host/FileSystemTest.cpp
index 76ac83fe18b..c8972786ad4 100644
--- a/lldb/unittests/Host/FileSystemTest.cpp
+++ b/lldb/unittests/Host/FileSystemTest.cpp
@@ -69,8 +69,8 @@ public:
return std::error_code();
}
// Map any symlink to "/symlink".
- std::error_code getRealPath(const Twine &Path,
- SmallVectorImpl<char> &Output) const override {
+ std::error_code getRealPath(const Twine &Path, SmallVectorImpl<char> &Output,
+ bool ExpandTilde) const override {
auto I = FilesAndDirs.find(Path.str());
if (I == FilesAndDirs.end())
return make_error_code(llvm::errc::no_such_file_or_directory);
diff --git a/lldb/unittests/Interpreter/TestCompletion.cpp b/lldb/unittests/Interpreter/TestCompletion.cpp
index e781de04e02..b170179287a 100644
--- a/lldb/unittests/Interpreter/TestCompletion.cpp
+++ b/lldb/unittests/Interpreter/TestCompletion.cpp
@@ -7,9 +7,11 @@
//
//===----------------------------------------------------------------------===//
+#include "lldb/Host/FileSystem.h"
#include "lldb/Interpreter/CommandCompletions.h"
#include "lldb/Utility/StringList.h"
#include "lldb/Utility/TildeExpressionResolver.h"
+
#include "gmock/gmock.h"
#include "gtest/gtest.h"
@@ -65,6 +67,8 @@ protected:
SmallString<128> FileBaz;
void SetUp() override {
+ FileSystem::Initialize();
+
// chdir back into the original working dir this test binary started with.
// A previous test may have have changed the working dir.
ASSERT_NO_ERROR(fs::set_current_path(OriginalWorkingDir));
@@ -105,7 +109,10 @@ protected:
ASSERT_NO_ERROR(fs::current_path(OriginalWorkingDir));
}
- void TearDown() override { ASSERT_NO_ERROR(fs::remove_directories(BaseDir)); }
+ void TearDown() override {
+ ASSERT_NO_ERROR(fs::remove_directories(BaseDir));
+ FileSystem::Terminate();
+ }
static bool HasEquivalentFile(const Twine &Path, const StringList &Paths) {
for (size_t I = 0; I < Paths.GetSize(); ++I) {
@@ -158,7 +165,7 @@ TEST_F(CompletionTest, DirCompletionAbsolute) {
std::string Prefixes[] = {(Twine(BaseDir) + "/").str(), ""};
- StandardTildeExpressionResolver Resolver;
+ StandardTildeExpressionResolver Resolver(FileSystem::Instance());
StringList Results;
// When a directory is specified that doesn't end in a slash, it searches
@@ -197,7 +204,7 @@ TEST_F(CompletionTest, FileCompletionAbsolute) {
// all check this by asserting an exact result count, and verifying against
// known folders.
- StandardTildeExpressionResolver Resolver;
+ StandardTildeExpressionResolver Resolver(FileSystem::Instance());
StringList Results;
// When an item is specified that doesn't end in a slash but exactly matches
// one item, it returns that item.
@@ -248,7 +255,8 @@ TEST_F(CompletionTest, FileCompletionAbsolute) {
}
TEST_F(CompletionTest, DirCompletionUsername) {
- MockTildeExpressionResolver Resolver("James", BaseDir);
+ MockTildeExpressionResolver Resolver(FileSystem::Instance(), "James",
+ BaseDir);
Resolver.AddKnownUser("Kirk", DirFooB);
Resolver.AddKnownUser("Lars", DirFooC);
Resolver.AddKnownUser("Jason", DirFoo);
diff --git a/lldb/unittests/TestingSupport/MockTildeExpressionResolver.cpp b/lldb/unittests/TestingSupport/MockTildeExpressionResolver.cpp
index 832836682b5..20790180624 100644
--- a/lldb/unittests/TestingSupport/MockTildeExpressionResolver.cpp
+++ b/lldb/unittests/TestingSupport/MockTildeExpressionResolver.cpp
@@ -13,9 +13,10 @@
using namespace lldb_private;
using namespace llvm;
-MockTildeExpressionResolver::MockTildeExpressionResolver(StringRef CurrentUser,
+MockTildeExpressionResolver::MockTildeExpressionResolver(FileSystem &fs,
+ StringRef CurrentUser,
StringRef HomeDir)
- : CurrentUser(CurrentUser) {
+ : TildeExpressionResolver(fs), CurrentUser(CurrentUser) {
UserDirectories.insert(std::make_pair(CurrentUser, HomeDir));
}
diff --git a/lldb/unittests/TestingSupport/MockTildeExpressionResolver.h b/lldb/unittests/TestingSupport/MockTildeExpressionResolver.h
index 18be1102e1f..45a3796fdb8 100644
--- a/lldb/unittests/TestingSupport/MockTildeExpressionResolver.h
+++ b/lldb/unittests/TestingSupport/MockTildeExpressionResolver.h
@@ -16,12 +16,13 @@
#include "llvm/ADT/StringMap.h"
namespace lldb_private {
+class FileSystem;
class MockTildeExpressionResolver : public TildeExpressionResolver {
llvm::StringRef CurrentUser;
llvm::StringMap<llvm::StringRef> UserDirectories;
public:
- MockTildeExpressionResolver(llvm::StringRef CurrentUser,
+ MockTildeExpressionResolver(FileSystem &fs, llvm::StringRef CurrentUser,
llvm::StringRef HomeDir);
void AddKnownUser(llvm::StringRef User, llvm::StringRef HomeDir);
diff --git a/lldb/unittests/Utility/TildeExpressionResolverTest.cpp b/lldb/unittests/Utility/TildeExpressionResolverTest.cpp
index bc1ca7a4481..eb4812619c3 100644
--- a/lldb/unittests/Utility/TildeExpressionResolverTest.cpp
+++ b/lldb/unittests/Utility/TildeExpressionResolverTest.cpp
@@ -1,6 +1,7 @@
#include "gtest/gtest.h"
#include "TestingSupport/MockTildeExpressionResolver.h"
+#include "lldb/Host/FileSystem.h"
#include "lldb/Utility/TildeExpressionResolver.h"
#include "llvm/ADT/SmallString.h"
@@ -9,7 +10,8 @@ using namespace llvm;
using namespace lldb_private;
TEST(TildeExpressionResolver, ResolveFullPath) {
- MockTildeExpressionResolver Resolver("James", "/james");
+ FileSystem fs;
+ MockTildeExpressionResolver Resolver(fs, "James", "/james");
Resolver.AddKnownUser("Kirk", "/kirk");
Resolver.AddKnownUser("Lars", "/lars");
Resolver.AddKnownUser("Jason", "/jason");