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