• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
MockTildeExpressionResolver(StringRef CurrentUser,StringRef HomeDir)15 MockTildeExpressionResolver::MockTildeExpressionResolver(StringRef CurrentUser,
16                                                          StringRef HomeDir)
17     : CurrentUser(CurrentUser) {
18   UserDirectories.insert(std::make_pair(CurrentUser, HomeDir));
19 }
20 
AddKnownUser(StringRef User,StringRef HomeDir)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 
Clear()27 void MockTildeExpressionResolver::Clear() {
28   CurrentUser = StringRef();
29   UserDirectories.clear();
30 }
31 
SetCurrentUser(StringRef User)32 void MockTildeExpressionResolver::SetCurrentUser(StringRef User) {
33   assert(UserDirectories.find(User) != UserDirectories.end());
34   CurrentUser = User;
35 }
36 
ResolveExact(StringRef Expr,SmallVectorImpl<char> & Output)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 
ResolvePartial(StringRef Expr,StringSet<> & Output)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