diff --git a/clang-tools-extra/clangd/GlobalCompilationDatabase.cpp b/clang-tools-extra/clangd/GlobalCompilationDatabase.cpp --- a/clang-tools-extra/clangd/GlobalCompilationDatabase.cpp +++ b/clang-tools-extra/clangd/GlobalCompilationDatabase.cpp @@ -41,34 +41,6 @@ namespace clang { namespace clangd { -namespace { - -// Variant of parent_path that operates only on absolute paths. -PathRef absoluteParent(PathRef Path) { - assert(llvm::sys::path::is_absolute(Path)); -#if defined(_WIN32) - // llvm::sys says "C:\" is absolute, and its parent is "C:" which is relative. - // This unhelpful behavior seems to have been inherited from boost. - if (llvm::sys::path::relative_path(Path).empty()) { - return PathRef(); - } -#endif - PathRef Result = llvm::sys::path::parent_path(Path); - assert(Result.empty() || llvm::sys::path::is_absolute(Result)); - return Result; -} - -// Runs the given action on all parent directories of filename, starting from -// deepest directory and going up to root. Stops whenever action succeeds. -void actOnAllParentDirectories(PathRef FileName, - llvm::function_ref Action) { - for (auto Path = absoluteParent(FileName); !Path.empty() && !Action(Path); - Path = absoluteParent(Path)) - ; -} - -} // namespace - tooling::CompileCommand GlobalCompilationDatabase::getFallbackCommand(PathRef File) const { std::vector Argv = {"clang"}; diff --git a/clang-tools-extra/clangd/support/Path.h b/clang-tools-extra/clangd/support/Path.h --- a/clang-tools-extra/clangd/support/Path.h +++ b/clang-tools-extra/clangd/support/Path.h @@ -28,6 +28,10 @@ std::string maybeCaseFoldPath(PathRef Path); bool pathEqual(PathRef, PathRef); +// Runs the given action on all parent directories of filename, starting from +// deepest directory and going up to root. Stops whenever action succeeds. +void actOnAllParentDirectories(PathRef FileName, + llvm::function_ref Action); } // namespace clangd } // namespace clang diff --git a/clang-tools-extra/clangd/support/Path.cpp b/clang-tools-extra/clangd/support/Path.cpp --- a/clang-tools-extra/clangd/support/Path.cpp +++ b/clang-tools-extra/clangd/support/Path.cpp @@ -7,8 +7,27 @@ //===----------------------------------------------------------------------===// #include "support/Path.h" +#include "llvm/Support/Path.h" + namespace clang { namespace clangd { +namespace { +// Variant of parent_path that operates only on absolute paths. +PathRef absoluteParent(PathRef Path) { + assert(llvm::sys::path::is_absolute(Path)); +#if defined(_WIN32) + // llvm::sys says "C:\" is absolute, and its parent is "C:" which is relative. + // This unhelpful behavior seems to have been inherited from boost. + if (llvm::sys::path::relative_path(Path).empty()) { + return PathRef(); + } +#endif + PathRef Result = llvm::sys::path::parent_path(Path); + assert(Result.empty() || llvm::sys::path::is_absolute(Result)); + return Result; +} + +} // namespace std::string maybeCaseFoldPath(PathRef Path) { #if defined(_WIN32) || defined(__APPLE__) @@ -26,5 +45,11 @@ #endif } +void actOnAllParentDirectories(PathRef FileName, + llvm::function_ref Action) { + for (auto Path = absoluteParent(FileName); !Path.empty() && !Action(Path); + Path = absoluteParent(Path)) + ; +} } // namespace clangd } // namespace clang