Author: labath Date: Wed Mar 22 09:04:43 2017 New Revision: 298509 URL: http://llvm.org/viewvc/llvm-project?rev=298509&view=rev Log: Revert "Delete the remainder of platform specific code in FileSpec."
This reverts commit r298465 as it breaks TestLLVM.TestHomeDirectory.test_tilde_home_directory. Removed: lldb/trunk/unittests/Utility/Mocks/CMakeLists.txt lldb/trunk/unittests/Utility/Mocks/MockTildeExpressionResolver.cpp lldb/trunk/unittests/Utility/Mocks/MockTildeExpressionResolver.h lldb/trunk/unittests/Utility/TildeExpressionResolverTest.cpp Modified: lldb/trunk/include/lldb/Host/FileSpec.h lldb/trunk/include/lldb/Utility/TildeExpressionResolver.h lldb/trunk/source/API/SBDeclaration.cpp lldb/trunk/source/API/SBFileSpec.cpp lldb/trunk/source/API/SBFileSpecList.cpp lldb/trunk/source/API/SBLineEntry.cpp lldb/trunk/source/Host/common/FileSpec.cpp lldb/trunk/source/Host/windows/FileSystem.cpp lldb/trunk/source/Host/windows/HostInfoWindows.cpp lldb/trunk/source/Target/TargetList.cpp lldb/trunk/source/Utility/TildeExpressionResolver.cpp lldb/trunk/unittests/CMakeLists.txt lldb/trunk/unittests/Interpreter/CMakeLists.txt lldb/trunk/unittests/Interpreter/TestCompletion.cpp lldb/trunk/unittests/Utility/CMakeLists.txt Modified: lldb/trunk/include/lldb/Host/FileSpec.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Host/FileSpec.h?rev=298509&r1=298508&r2=298509&view=diff ============================================================================== --- lldb/trunk/include/lldb/Host/FileSpec.h (original) +++ lldb/trunk/include/lldb/Host/FileSpec.h Wed Mar 22 09:04:43 2017 @@ -17,6 +17,7 @@ // Other libraries and framework includes // Project includes +#include "lldb/Host/PosixApi.h" #include "lldb/Utility/ConstString.h" #include "lldb/lldb-private.h" @@ -538,6 +539,26 @@ public: ConstString GetLastPathComponent() const; + //------------------------------------------------------------------ + /// Resolves the user name at the beginning of \a src_path, and writes the + /// output + /// to \a dst_path. Note, \a src_path can contain other path components after + /// the + /// user name, they will be copied over, and if the path doesn't start with + /// "~" it + /// will also be copied over to \a dst_path. + /// + /// @param[in] src_path + /// Input path to be resolved. + /// + /// @param[in] dst_path + /// Buffer to store the resolved path. + //------------------------------------------------------------------ + static void ResolveUsername(llvm::SmallVectorImpl<char> &path); + + static size_t ResolvePartialUsername(llvm::StringRef partial_name, + StringList &matches); + enum EnumerateDirectoryResult { eEnumerateDirectoryResultNext, // Enumerate next entry in the current // directory Modified: lldb/trunk/include/lldb/Utility/TildeExpressionResolver.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Utility/TildeExpressionResolver.h?rev=298509&r1=298508&r2=298509&view=diff ============================================================================== --- lldb/trunk/include/lldb/Utility/TildeExpressionResolver.h (original) +++ lldb/trunk/include/lldb/Utility/TildeExpressionResolver.h Wed Mar 22 09:04:43 2017 @@ -44,11 +44,6 @@ public: /// \returns true if there were any matches, false otherwise. virtual bool ResolvePartial(llvm::StringRef Expr, llvm::StringSet<> &Output) = 0; - - /// \brief Resolve an entire path that begins with a tilde expression, - /// replacing the username portion with the matched result. - bool ResolveFullPath(llvm::StringRef Expr, - llvm::SmallVectorImpl<char> &Output); }; class StandardTildeExpressionResolver : public TildeExpressionResolver { Modified: lldb/trunk/source/API/SBDeclaration.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/API/SBDeclaration.cpp?rev=298509&r1=298508&r2=298509&view=diff ============================================================================== --- lldb/trunk/source/API/SBDeclaration.cpp (original) +++ lldb/trunk/source/API/SBDeclaration.cpp Wed Mar 22 09:04:43 2017 @@ -1,4 +1,5 @@ -//===-- SBDeclaration.cpp ----------------------------------------*- C++-*-===// +//===-- SBDeclaration.cpp -----------------------------------------*- C++ +//-*-===// // // The LLVM Compiler Infrastructure // @@ -9,7 +10,6 @@ #include "lldb/API/SBDeclaration.h" #include "lldb/API/SBStream.h" -#include "lldb/Host/PosixApi.h" #include "lldb/Symbol/Declaration.h" #include "lldb/Utility/Log.h" #include "lldb/Utility/Stream.h" Modified: lldb/trunk/source/API/SBFileSpec.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/API/SBFileSpec.cpp?rev=298509&r1=298508&r2=298509&view=diff ============================================================================== --- lldb/trunk/source/API/SBFileSpec.cpp (original) +++ lldb/trunk/source/API/SBFileSpec.cpp Wed Mar 22 09:04:43 2017 @@ -13,7 +13,6 @@ #include "lldb/API/SBFileSpec.h" #include "lldb/API/SBStream.h" #include "lldb/Host/FileSpec.h" -#include "lldb/Host/PosixApi.h" #include "lldb/Utility/Log.h" #include "lldb/Utility/Stream.h" Modified: lldb/trunk/source/API/SBFileSpecList.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/API/SBFileSpecList.cpp?rev=298509&r1=298508&r2=298509&view=diff ============================================================================== --- lldb/trunk/source/API/SBFileSpecList.cpp (original) +++ lldb/trunk/source/API/SBFileSpecList.cpp Wed Mar 22 09:04:43 2017 @@ -14,7 +14,6 @@ #include "lldb/API/SBStream.h" #include "lldb/Core/FileSpecList.h" #include "lldb/Host/FileSpec.h" -#include "lldb/Host/PosixApi.h" #include "lldb/Utility/Log.h" #include "lldb/Utility/Stream.h" Modified: lldb/trunk/source/API/SBLineEntry.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/API/SBLineEntry.cpp?rev=298509&r1=298508&r2=298509&view=diff ============================================================================== --- lldb/trunk/source/API/SBLineEntry.cpp (original) +++ lldb/trunk/source/API/SBLineEntry.cpp Wed Mar 22 09:04:43 2017 @@ -11,7 +11,6 @@ #include "lldb/API/SBLineEntry.h" #include "lldb/API/SBStream.h" -#include "lldb/Host/PosixApi.h" #include "lldb/Symbol/LineEntry.h" #include "lldb/Utility/Log.h" #include "lldb/Utility/StreamString.h" Modified: lldb/trunk/source/Host/common/FileSpec.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/common/FileSpec.cpp?rev=298509&r1=298508&r2=298509&view=diff ============================================================================== --- lldb/trunk/source/Host/common/FileSpec.cpp (original) +++ lldb/trunk/source/Host/common/FileSpec.cpp Wed Mar 22 09:04:43 2017 @@ -7,13 +7,21 @@ // //===----------------------------------------------------------------------===// +#include <fstream> +#include <set> +#include <string.h> + +#include "llvm/Config/llvm-config.h" +#ifndef LLVM_ON_WIN32 +#include <pwd.h> +#endif + #include "lldb/Host/FileSpec.h" #include "lldb/Utility/CleanUp.h" #include "lldb/Utility/RegularExpression.h" #include "lldb/Utility/Stream.h" #include "lldb/Utility/StreamString.h" #include "lldb/Utility/StringList.h" -#include "lldb/Utility/TildeExpressionResolver.h" #include "llvm/ADT/StringExtras.h" #include "llvm/ADT/StringRef.h" @@ -136,13 +144,115 @@ size_t ParentPathEnd(llvm::StringRef pat } // end anonymous namespace +// Resolves the username part of a path of the form ~user/other/directories, and +// writes the result into dst_path. This will also resolve "~" to the current +// user. +// If you want to complete "~" to the list of users, pass it to +// ResolvePartialUsername. +void FileSpec::ResolveUsername(llvm::SmallVectorImpl<char> &path) { +#ifndef LLVM_ON_WIN32 + if (path.empty() || path[0] != '~') + return; + + llvm::StringRef path_str(path.data(), path.size()); + size_t slash_pos = path_str.find('/', 1); + if (slash_pos == 1 || path.size() == 1) { + // A path of ~/ resolves to the current user's home dir + llvm::SmallString<64> home_dir; + // llvm::sys::path::home_directory() only checks if "HOME" is set in the + // environment and does nothing else to locate the user home directory + if (!llvm::sys::path::home_directory(home_dir)) { + struct passwd *pw = getpwuid(getuid()); + if (pw && pw->pw_dir && pw->pw_dir[0]) { + // Update our environemnt so llvm::sys::path::home_directory() works + // next time + setenv("HOME", pw->pw_dir, 0); + home_dir.assign(llvm::StringRef(pw->pw_dir)); + } else { + return; + } + } + + // Overwrite the ~ with the first character of the homedir, and insert + // the rest. This way we only trigger one move, whereas an insert + // followed by a delete (or vice versa) would trigger two. + path[0] = home_dir[0]; + path.insert(path.begin() + 1, home_dir.begin() + 1, home_dir.end()); + return; + } + + auto username_begin = path.begin() + 1; + auto username_end = (slash_pos == llvm::StringRef::npos) + ? path.end() + : (path.begin() + slash_pos); + size_t replacement_length = std::distance(path.begin(), username_end); + + llvm::SmallString<20> username(username_begin, username_end); + struct passwd *user_entry = ::getpwnam(username.c_str()); + if (user_entry != nullptr) { + // Copy over the first n characters of the path, where n is the smaller of + // the length + // of the home directory and the slash pos. + llvm::StringRef homedir(user_entry->pw_dir); + size_t initial_copy_length = std::min(homedir.size(), replacement_length); + auto src_begin = homedir.begin(); + auto src_end = src_begin + initial_copy_length; + std::copy(src_begin, src_end, path.begin()); + if (replacement_length > homedir.size()) { + // We copied the entire home directory, but the ~username portion of the + // path was + // longer, so there's characters that need to be removed. + path.erase(path.begin() + initial_copy_length, username_end); + } else if (replacement_length < homedir.size()) { + // We copied all the way up to the slash in the destination, but there's + // still more + // characters that need to be inserted. + path.insert(username_end, src_end, homedir.end()); + } + } else { + // Unable to resolve username (user doesn't exist?) + path.clear(); + } +#endif +} + +size_t FileSpec::ResolvePartialUsername(llvm::StringRef partial_name, + StringList &matches) { +#if !defined(LLVM_ON_WIN32) && !defined(__ANDROID__) + size_t extant_entries = matches.GetSize(); + + setpwent(); + struct passwd *user_entry; + partial_name = partial_name.drop_front(); + std::set<std::string> name_list; + + while ((user_entry = getpwent()) != NULL) { + if (llvm::StringRef(user_entry->pw_name).startswith(partial_name)) { + std::string tmp_buf("~"); + tmp_buf.append(user_entry->pw_name); + tmp_buf.push_back('/'); + name_list.insert(tmp_buf); + } + } + + for (auto &name : name_list) { + matches.AppendString(name); + } + return matches.GetSize() - extant_entries; +#else + // Resolving home directories is not supported, just copy the path... + return 0; +#endif // #ifdef LLVM_ON_WIN32 +} + void FileSpec::Resolve(llvm::SmallVectorImpl<char> &path) { if (path.empty()) return; - llvm::SmallString<32> Source(path.begin(), path.end()); - StandardTildeExpressionResolver Resolver; - Resolver.ResolveFullPath(Source, path); +#ifndef LLVM_ON_WIN32 + if (path[0] == '~') + ResolveUsername(path); +#endif // #ifdef LLVM_ON_WIN32 // Save a copy of the original path that's passed in llvm::SmallString<128> original_path(path.begin(), path.end()); Modified: lldb/trunk/source/Host/windows/FileSystem.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/windows/FileSystem.cpp?rev=298509&r1=298508&r2=298509&view=diff ============================================================================== --- lldb/trunk/source/Host/windows/FileSystem.cpp (original) +++ lldb/trunk/source/Host/windows/FileSystem.cpp Wed Mar 22 09:04:43 2017 @@ -15,7 +15,6 @@ #include "lldb/Host/FileSystem.h" #include "lldb/Host/windows/AutoHandle.h" -#include "lldb/Host/windows/PosixApi.h" #include "llvm/Support/ConvertUTF.h" #include "llvm/Support/FileSystem.h" Modified: lldb/trunk/source/Host/windows/HostInfoWindows.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/windows/HostInfoWindows.cpp?rev=298509&r1=298508&r2=298509&view=diff ============================================================================== --- lldb/trunk/source/Host/windows/HostInfoWindows.cpp (original) +++ lldb/trunk/source/Host/windows/HostInfoWindows.cpp Wed Mar 22 09:04:43 2017 @@ -14,7 +14,6 @@ #include <mutex> // std::once #include "lldb/Host/windows/HostInfoWindows.h" -#include "lldb/Host/windows/PosixApi.h" #include "llvm/ADT/SmallString.h" #include "llvm/Support/ConvertUTF.h" #include "llvm/Support/FileSystem.h" Modified: lldb/trunk/source/Target/TargetList.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/TargetList.cpp?rev=298509&r1=298508&r2=298509&view=diff ============================================================================== --- lldb/trunk/source/Target/TargetList.cpp (original) +++ lldb/trunk/source/Target/TargetList.cpp Wed Mar 22 09:04:43 2017 @@ -23,7 +23,6 @@ #include "lldb/Symbol/ObjectFile.h" #include "lldb/Target/Platform.h" #include "lldb/Target/Process.h" -#include "lldb/Utility/TildeExpressionResolver.h" // Other libraries and framework includes #include "llvm/ADT/SmallString.h" @@ -348,10 +347,10 @@ Error TargetList::CreateTargetInternal(D FileSpec file(user_exe_path, false); if (!file.Exists() && user_exe_path.startswith("~")) { // 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); + // links + // so we can't use the FileSpec constructor's resolve flag + llvm::SmallString<64> unglobbed_path(user_exe_path); + FileSpec::ResolveUsername(unglobbed_path); if (unglobbed_path.empty()) file = FileSpec(user_exe_path, false); Modified: lldb/trunk/source/Utility/TildeExpressionResolver.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Utility/TildeExpressionResolver.cpp?rev=298509&r1=298508&r2=298509&view=diff ============================================================================== --- lldb/trunk/source/Utility/TildeExpressionResolver.cpp (original) +++ lldb/trunk/source/Utility/TildeExpressionResolver.cpp Wed Mar 22 09:04:43 2017 @@ -68,22 +68,3 @@ bool StandardTildeExpressionResolver::Re return true; #endif } - -bool TildeExpressionResolver::ResolveFullPath( - StringRef Expr, llvm::SmallVectorImpl<char> &Output) { - Output.clear(); - if (!Expr.startswith("~")) { - Output.append(Expr.begin(), Expr.end()); - return false; - } - - namespace path = llvm::sys::path; - StringRef Left = - Expr.take_until([](char c) { return path::is_separator(c); }); - - if (!ResolveExact(Left, Output)) - return false; - - Output.append(Expr.begin() + Left.size(), Expr.end()); - return true; -} Modified: lldb/trunk/unittests/CMakeLists.txt URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/unittests/CMakeLists.txt?rev=298509&r1=298508&r2=298509&view=diff ============================================================================== --- lldb/trunk/unittests/CMakeLists.txt (original) +++ lldb/trunk/unittests/CMakeLists.txt Wed Mar 22 09:04:43 2017 @@ -2,7 +2,6 @@ add_custom_target(LLDBUnitTests) set_target_properties(LLDBUnitTests PROPERTIES FOLDER "LLDB tests") include_directories(${LLDB_SOURCE_ROOT}) -include_directories(${LLDB_PROJECT_ROOT}) set(LLDB_GTEST_COMMON_INCLUDE ${CMAKE_CURRENT_SOURCE_DIR}/gtest_common.h) if (MSVC) Modified: lldb/trunk/unittests/Interpreter/CMakeLists.txt URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/unittests/Interpreter/CMakeLists.txt?rev=298509&r1=298508&r2=298509&view=diff ============================================================================== --- lldb/trunk/unittests/Interpreter/CMakeLists.txt (original) +++ lldb/trunk/unittests/Interpreter/CMakeLists.txt Wed Mar 22 09:04:43 2017 @@ -4,7 +4,6 @@ add_lldb_unittest(InterpreterTests LINK_LIBS lldbInterpreter - lldbUtilityMocks ) target_link_libraries(InterpreterTests Modified: lldb/trunk/unittests/Interpreter/TestCompletion.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/unittests/Interpreter/TestCompletion.cpp?rev=298509&r1=298508&r2=298509&view=diff ============================================================================== --- lldb/trunk/unittests/Interpreter/TestCompletion.cpp (original) +++ lldb/trunk/unittests/Interpreter/TestCompletion.cpp Wed Mar 22 09:04:43 2017 @@ -8,6 +8,7 @@ //===----------------------------------------------------------------------===// #include "gtest/gtest.h" + #include "lldb/Interpreter/CommandCompletions.h" #include "lldb/Utility/StringList.h" #include "lldb/Utility/TildeExpressionResolver.h" @@ -17,8 +18,6 @@ #include "llvm/Support/Path.h" #include "llvm/Support/raw_ostream.h" -#include "unittests/Utility/Mocks/MockTildeExpressionResolver.h" - namespace fs = llvm::sys::fs; namespace path = llvm::sys::path; using namespace llvm; @@ -37,6 +36,74 @@ using namespace lldb_private; namespace { +class MockTildeExpressionResolver : public TildeExpressionResolver { + StringRef CurrentUser; + StringMap<StringRef> UserDirectories; + +public: + explicit MockTildeExpressionResolver(StringRef CurrentUser, StringRef HomeDir) + : CurrentUser(CurrentUser) { + UserDirectories.insert(std::make_pair(CurrentUser, HomeDir)); + } + + void AddKnownUser(StringRef User, StringRef HomeDir) { + assert(UserDirectories.find(User) == UserDirectories.end()); + UserDirectories.insert(std::make_pair(User, HomeDir)); + } + + void Clear() { + CurrentUser = StringRef(); + UserDirectories.clear(); + } + + void SetCurrentUser(StringRef User) { + assert(UserDirectories.find(User) != UserDirectories.end()); + CurrentUser = User; + } + + bool ResolveExact(StringRef Expr, SmallVectorImpl<char> &Output) override { + Output.clear(); + + assert(!llvm::any_of( + Expr, [](char c) { return llvm::sys::path::is_separator(c); })); + assert(Expr.empty() || Expr[0] == '~'); + Expr = Expr.drop_front(); + if (Expr.empty()) { + auto Dir = UserDirectories[CurrentUser]; + Output.append(Dir.begin(), Dir.end()); + return true; + } + + for (const auto &User : UserDirectories) { + if (User.getKey() != Expr) + continue; + Output.append(User.getValue().begin(), User.getValue().end()); + return true; + } + return false; + } + + bool ResolvePartial(StringRef Expr, StringSet<> &Output) override { + Output.clear(); + + assert(!llvm::any_of( + Expr, [](char c) { return llvm::sys::path::is_separator(c); })); + assert(Expr.empty() || Expr[0] == '~'); + Expr = Expr.drop_front(); + + SmallString<16> QualifiedName("~"); + for (const auto &User : UserDirectories) { + if (!User.getKey().startswith(Expr)) + continue; + QualifiedName.resize(1); + QualifiedName.append(User.getKey().begin(), User.getKey().end()); + Output.insert(QualifiedName); + } + + return !Output.empty(); + } +}; + class CompletionTest : public testing::Test { protected: /// Unique temporary directory in which all created filesystem entities must Modified: lldb/trunk/unittests/Utility/CMakeLists.txt URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/unittests/Utility/CMakeLists.txt?rev=298509&r1=298508&r2=298509&view=diff ============================================================================== --- lldb/trunk/unittests/Utility/CMakeLists.txt (original) +++ lldb/trunk/unittests/Utility/CMakeLists.txt Wed Mar 22 09:04:43 2017 @@ -1,5 +1,3 @@ -add_subdirectory(Mocks) - add_lldb_unittest(UtilityTests ConstStringTest.cpp ErrorTest.cpp @@ -7,14 +5,12 @@ add_lldb_unittest(UtilityTests NameMatchesTest.cpp StringExtractorTest.cpp TaskPoolTest.cpp - TildeExpressionResolverTest.cpp TimeoutTest.cpp UriParserTest.cpp VASprintfTest.cpp LINK_LIBS lldbUtility - lldbUtilityMocks LINK_COMPONENTS Support ) Removed: lldb/trunk/unittests/Utility/Mocks/CMakeLists.txt URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/unittests/Utility/Mocks/CMakeLists.txt?rev=298508&view=auto ============================================================================== --- lldb/trunk/unittests/Utility/Mocks/CMakeLists.txt (original) +++ lldb/trunk/unittests/Utility/Mocks/CMakeLists.txt (removed) @@ -1,9 +0,0 @@ -add_lldb_library(lldbUtilityMocks - MockTildeExpressionResolver.cpp - - LINK_LIBS - lldbUtility - - LINK_COMPONENTS - Support - ) Removed: lldb/trunk/unittests/Utility/Mocks/MockTildeExpressionResolver.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/unittests/Utility/Mocks/MockTildeExpressionResolver.cpp?rev=298508&view=auto ============================================================================== --- lldb/trunk/unittests/Utility/Mocks/MockTildeExpressionResolver.cpp (original) +++ lldb/trunk/unittests/Utility/Mocks/MockTildeExpressionResolver.cpp (removed) @@ -1,80 +0,0 @@ -//===----------------- MockTildeExpressionResolver.cpp ----------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -#include "MockTildeExpressionResolver.h" -#include "llvm/Support/Path.h" - -using namespace lldb_private; -using namespace llvm; - -MockTildeExpressionResolver::MockTildeExpressionResolver(StringRef CurrentUser, - StringRef HomeDir) - : CurrentUser(CurrentUser) { - UserDirectories.insert(std::make_pair(CurrentUser, HomeDir)); -} - -void MockTildeExpressionResolver::AddKnownUser(StringRef User, - StringRef HomeDir) { - assert(UserDirectories.find(User) == UserDirectories.end()); - UserDirectories.insert(std::make_pair(User, HomeDir)); -} - -void MockTildeExpressionResolver::Clear() { - CurrentUser = StringRef(); - UserDirectories.clear(); -} - -void MockTildeExpressionResolver::SetCurrentUser(StringRef User) { - assert(UserDirectories.find(User) != UserDirectories.end()); - CurrentUser = User; -} - -bool MockTildeExpressionResolver::ResolveExact(StringRef Expr, - SmallVectorImpl<char> &Output) { - Output.clear(); - - assert(!llvm::any_of( - Expr, [](char c) { return llvm::sys::path::is_separator(c); })); - assert(Expr.empty() || Expr[0] == '~'); - Expr = Expr.drop_front(); - if (Expr.empty()) { - auto Dir = UserDirectories[CurrentUser]; - Output.append(Dir.begin(), Dir.end()); - return true; - } - - for (const auto &User : UserDirectories) { - if (User.getKey() != Expr) - continue; - Output.append(User.getValue().begin(), User.getValue().end()); - return true; - } - return false; -} - -bool MockTildeExpressionResolver::ResolvePartial(StringRef Expr, - StringSet<> &Output) { - Output.clear(); - - assert(!llvm::any_of( - Expr, [](char c) { return llvm::sys::path::is_separator(c); })); - assert(Expr.empty() || Expr[0] == '~'); - Expr = Expr.drop_front(); - - SmallString<16> QualifiedName("~"); - for (const auto &User : UserDirectories) { - if (!User.getKey().startswith(Expr)) - continue; - QualifiedName.resize(1); - QualifiedName.append(User.getKey().begin(), User.getKey().end()); - Output.insert(QualifiedName); - } - - return !Output.empty(); -} Removed: lldb/trunk/unittests/Utility/Mocks/MockTildeExpressionResolver.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/unittests/Utility/Mocks/MockTildeExpressionResolver.h?rev=298508&view=auto ============================================================================== --- lldb/trunk/unittests/Utility/Mocks/MockTildeExpressionResolver.h (original) +++ lldb/trunk/unittests/Utility/Mocks/MockTildeExpressionResolver.h (removed) @@ -1,37 +0,0 @@ -//===--------------------- TildeExpressionResolver.h ------------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -#ifndef LLDB_UNITTESTS_UTILITY_MOCKS_MOCK_TILDE_EXPRESSION_RESOLVER_H -#define LLDB_UNITTESTS_UTILITY_MOCKS_MOCK_TILDE_EXPRESSION_RESOLVER_H - -#include "lldb/Utility/TildeExpressionResolver.h" - -#include "llvm/ADT/SmallString.h" -#include "llvm/ADT/StringMap.h" - -namespace lldb_private { -class MockTildeExpressionResolver : public TildeExpressionResolver { - llvm::StringRef CurrentUser; - llvm::StringMap<llvm::StringRef> UserDirectories; - -public: - MockTildeExpressionResolver(llvm::StringRef CurrentUser, - llvm::StringRef HomeDir); - - void AddKnownUser(llvm::StringRef User, llvm::StringRef HomeDir); - void Clear(); - void SetCurrentUser(llvm::StringRef User); - - bool ResolveExact(llvm::StringRef Expr, - llvm::SmallVectorImpl<char> &Output) override; - bool ResolvePartial(llvm::StringRef Expr, llvm::StringSet<> &Output) override; -}; -} - -#endif Removed: lldb/trunk/unittests/Utility/TildeExpressionResolverTest.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/unittests/Utility/TildeExpressionResolverTest.cpp?rev=298508&view=auto ============================================================================== --- lldb/trunk/unittests/Utility/TildeExpressionResolverTest.cpp (original) +++ lldb/trunk/unittests/Utility/TildeExpressionResolverTest.cpp (removed) @@ -1,36 +0,0 @@ -#include "gtest/gtest.h" - -#include "Mocks/MockTildeExpressionResolver.h" -#include "lldb/Utility/TildeExpressionResolver.h" - -#include "llvm/ADT/SmallString.h" - -using namespace llvm; -using namespace lldb_private; - -TEST(TildeExpressionResolver, ResolveFullPath) { - MockTildeExpressionResolver Resolver("James", "/james"); - Resolver.AddKnownUser("Kirk", "/kirk"); - Resolver.AddKnownUser("Lars", "/lars"); - Resolver.AddKnownUser("Jason", "/jason"); - Resolver.AddKnownUser("Larry", "/larry"); - - SmallString<32> Result; - ASSERT_TRUE(Resolver.ResolveFullPath("~", Result)); - EXPECT_EQ("/james", Result); - ASSERT_TRUE(Resolver.ResolveFullPath("~/", Result)); - EXPECT_EQ("/james/", Result); - - ASSERT_TRUE(Resolver.ResolveFullPath("~James/bar/baz", Result)); - EXPECT_EQ("/james/bar/baz", Result); - - ASSERT_TRUE(Resolver.ResolveFullPath("~Jason/", Result)); - EXPECT_EQ("/jason/", Result); - - ASSERT_TRUE(Resolver.ResolveFullPath("~Lars", Result)); - EXPECT_EQ("/lars", Result); - - ASSERT_FALSE(Resolver.ResolveFullPath("~Jaso", Result)); - ASSERT_FALSE(Resolver.ResolveFullPath("", Result)); - ASSERT_FALSE(Resolver.ResolveFullPath("Jason", Result)); -} _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits