1 //===-- MockTildeExpressionResolver.cpp -----------------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #include "MockTildeExpressionResolver.h" 10 #include "llvm/Support/Path.h" 11 12 using namespace lldb_private; 13 using namespace llvm; 14 15 MockTildeExpressionResolver::MockTildeExpressionResolver(StringRef CurrentUser, 16 StringRef HomeDir) 17 : CurrentUser(CurrentUser) { 18 UserDirectories.insert(std::make_pair(CurrentUser, HomeDir)); 19 } 20 21 void MockTildeExpressionResolver::AddKnownUser(StringRef User, 22 StringRef HomeDir) { 23 assert(UserDirectories.find(User) == UserDirectories.end()); 24 UserDirectories.insert(std::make_pair(User, HomeDir)); 25 } 26 27 void MockTildeExpressionResolver::Clear() { 28 CurrentUser = StringRef(); 29 UserDirectories.clear(); 30 } 31 32 void MockTildeExpressionResolver::SetCurrentUser(StringRef User) { 33 assert(UserDirectories.find(User) != UserDirectories.end()); 34 CurrentUser = User; 35 } 36 37 bool MockTildeExpressionResolver::ResolveExact(StringRef Expr, 38 SmallVectorImpl<char> &Output) { 39 Output.clear(); 40 41 assert(!llvm::any_of( 42 Expr, [](char c) { return llvm::sys::path::is_separator(c); })); 43 assert(Expr.empty() || Expr[0] == '~'); 44 Expr = Expr.drop_front(); 45 if (Expr.empty()) { 46 auto Dir = UserDirectories[CurrentUser]; 47 Output.append(Dir.begin(), Dir.end()); 48 return true; 49 } 50 51 for (const auto &User : UserDirectories) { 52 if (User.getKey() != Expr) 53 continue; 54 Output.append(User.getValue().begin(), User.getValue().end()); 55 return true; 56 } 57 return false; 58 } 59 60 bool MockTildeExpressionResolver::ResolvePartial(StringRef Expr, 61 StringSet<> &Output) { 62 Output.clear(); 63 64 assert(!llvm::any_of( 65 Expr, [](char c) { return llvm::sys::path::is_separator(c); })); 66 assert(Expr.empty() || Expr[0] == '~'); 67 Expr = Expr.drop_front(); 68 69 SmallString<16> QualifiedName("~"); 70 for (const auto &User : UserDirectories) { 71 if (!User.getKey().startswith(Expr)) 72 continue; 73 QualifiedName.resize(1); 74 QualifiedName.append(User.getKey().begin(), User.getKey().end()); 75 Output.insert(QualifiedName); 76 } 77 78 return !Output.empty(); 79 } 80