diff options
Diffstat (limited to 'lldb/source/Commands/CommandCompletions.cpp')
-rw-r--r-- | lldb/source/Commands/CommandCompletions.cpp | 28 |
1 files changed, 15 insertions, 13 deletions
diff --git a/lldb/source/Commands/CommandCompletions.cpp b/lldb/source/Commands/CommandCompletions.cpp index 37f7bdfc139..7524c565d16 100644 --- a/lldb/source/Commands/CommandCompletions.cpp +++ b/lldb/source/Commands/CommandCompletions.cpp @@ -101,7 +101,6 @@ static int DiskFilesOrDirectories(const llvm::Twine &partial_name, if (CompletionBuffer.size() >= PATH_MAX) return matches.GetSize(); - namespace fs = llvm::sys::fs; namespace path = llvm::sys::path; llvm::StringRef SearchDir; @@ -178,11 +177,16 @@ static int DiskFilesOrDirectories(const llvm::Twine &partial_name, // SearchDir now contains the directory to search in, and Prefix contains the // text we want to match against items in that directory. + FileSystem &fs = FileSystem::Instance(); std::error_code EC; - fs::directory_iterator Iter(SearchDir, EC, false); - fs::directory_iterator End; + llvm::vfs::directory_iterator Iter = fs.DirBegin(SearchDir, EC); + llvm::vfs::directory_iterator End; for (; Iter != End && !EC; Iter.increment(EC)) { auto &Entry = *Iter; + llvm::ErrorOr<llvm::vfs::Status> Status = fs.GetStatus(Entry.path()); + + if (!Status) + continue; auto Name = path::filename(Entry.path()); @@ -190,20 +194,18 @@ static int DiskFilesOrDirectories(const llvm::Twine &partial_name, if (Name == "." || Name == ".." || !Name.startswith(PartialItem)) continue; - // We have a match. - - llvm::ErrorOr<fs::basic_file_status> st = Entry.status(); - if (!st) - continue; + bool is_dir = Status->isDirectory(); // If it's a symlink, then we treat it as a directory as long as the target // is a directory. - bool is_dir = fs::is_directory(*st); - if (fs::is_symlink_file(*st)) { - fs::file_status target_st; - if (!fs::status(Entry.path(), target_st)) - is_dir = fs::is_directory(target_st); + if (Status->isSymlink()) { + FileSpec symlink_filespec(Entry.path()); + FileSpec resolved_filespec; + auto error = fs.ResolveSymbolicLink(symlink_filespec, resolved_filespec); + if (error.Success()) + is_dir = fs.IsDirectory(symlink_filespec); } + if (only_directories && !is_dir) continue; |