diff --git a/src/clang_complete.cc b/src/clang_complete.cc index 67986f24..c54ca433 100644 --- a/src/clang_complete.cc +++ b/src/clang_complete.cc @@ -40,7 +40,7 @@ namespace { std::string StripFileType(const std::string &path) { SmallString<128> Ret; sys::path::append(Ret, sys::path::parent_path(path), sys::path::stem(path)); - return Ret.str(); + return sys::path::convert_to_slash(Ret); } bool LocationInRange(SourceLocation L, CharSourceRange R, diff --git a/src/clang_utils.cc b/src/clang_utils.cc index 6a92b73b..a58237e1 100644 --- a/src/clang_utils.cc +++ b/src/clang_utils.cc @@ -34,7 +34,7 @@ std::string FileName(const FileEntry &file) { if (!StartsWith(ret, g_config->projectRoot)) { SmallString<256> dest; sys::fs::real_path(ret, dest); - ret = dest.str(); + ret = sys::path::convert_to_slash(dest.str()); } return ret; } diff --git a/src/filesystem.cc b/src/filesystem.cc index 74eb836b..613666ad 100644 --- a/src/filesystem.cc +++ b/src/filesystem.cc @@ -59,7 +59,7 @@ void GetFilesInFolder(std::string folder, bool recursive, bool dir_prefix, if (sys::fs::is_regular_file(Status)) { if (!dir_prefix) path = path.substr(folder.size()); - handler(path); + handler(sys::path::convert_to_slash(path)); } else if (recursive && sys::fs::is_directory(Status) && !seen.count(ID = Status.getUniqueID())) { curr.push_back(path); diff --git a/src/indexer.cc b/src/indexer.cc index 3d9e2d67..703692aa 100644 --- a/src/indexer.cc +++ b/src/indexer.cc @@ -567,7 +567,7 @@ public: if (!llvm::sys::path::is_absolute(Path) && !SM.getFileManager().makeAbsolutePath(Path)) return -1; - it->second.second = Path.str(); + it->second.second = llvm::sys::path::convert_to_slash(Path.str()); } return it->second.first; } diff --git a/src/lsp.cc b/src/lsp.cc index afb0b76c..6fac3d6c 100644 --- a/src/lsp.cc +++ b/src/lsp.cc @@ -220,10 +220,15 @@ void lsDocumentUri::SetPath(const std::string &path) { } std::string lsDocumentUri::GetPath() const { - if (raw_uri.compare(0, 8, "file:///")) + if (raw_uri.compare(0, 7, "file://")) { + LOG_S(WARNING) + << "Received potentially bad URI (not starting with file://): " + << raw_uri; return raw_uri; + } std::string ret; #ifdef _WIN32 + // Skipping the initial "/" on Windows size_t i = 8; #else size_t i = 7; @@ -236,8 +241,14 @@ std::string lsDocumentUri::GetPath() const { ret.push_back(from_hex(raw_uri[i + 1]) * 16 + from_hex(raw_uri[i + 2])); i += 2; } else - ret.push_back(raw_uri[i] == '\\' ? '/' : raw_uri[i]); + ret.push_back(raw_uri[i]); } +#ifdef _WIN32 + std::replace(ret.begin(), ret.end(), '\\', '/'); + if (ret.size() > 1 && ret[0] >= 'a' && ret[0] <= 'z' && ret[1] == ':') { + ret[0] = toupper(ret[0]); + } +#endif return ret; } diff --git a/src/platform_win.cc b/src/platform_win.cc index be03055c..d324f6e5 100644 --- a/src/platform_win.cc +++ b/src/platform_win.cc @@ -35,14 +35,20 @@ std::string NormalizePath(const std::string &path) { TCHAR buffer[MAX_PATH] = TEXT(""); TCHAR **lpp_part = {NULL}; + std::string result; retval = GetFullPathName(path.c_str(), MAX_PATH, buffer, lpp_part); // fail, return original if (retval == 0) - return path; + result = path; + else + result = buffer; - std::string result = buffer; std::replace(result.begin(), result.end(), '\\', '/'); - // std::transform(result.begin(), result.end(), result.begin(), ::tolower); + // Normalize drive letter. + if (result.size() > 1 && result[0] >= 'a' && result[0] <= 'z' && + result[1] == ':') { + result[0] = toupper(result[0]); + } return result; } diff --git a/src/project.cc b/src/project.cc index 3cd4aa52..aa726d94 100644 --- a/src/project.cc +++ b/src/project.cc @@ -172,7 +172,8 @@ struct ProjectProcessor { HeaderSearchOptions &HeaderOpts = CI->getHeaderSearchOpts(); for (auto &E : HeaderOpts.UserEntries) { - std::string path = ResolveIfRelative(entry.directory, E.Path); + std::string path = + NormalizePath(ResolveIfRelative(entry.directory, E.Path)); switch (E.Group) { default: config->angle_dirs.insert(path); @@ -327,8 +328,9 @@ LoadEntriesFromDirectory(ProjectConfig *project, ProjectProcessor proc(project); for (tooling::CompileCommand &Cmd : CDB->getAllCompileCommands()) { Project::Entry entry; - entry.directory = std::move(Cmd.Directory); - entry.filename = ResolveIfRelative(entry.directory, Cmd.Filename); + entry.directory = NormalizePath(Cmd.Directory); + entry.filename = + NormalizePath(ResolveIfRelative(entry.directory, Cmd.Filename)); entry.args = std::move(Cmd.CommandLine); proc.Process(entry); if (Seen.insert(entry.filename).second) @@ -378,12 +380,14 @@ void Project::Load(const std::string &root_directory) { LOG_S(INFO) << "angle_include_dir: " << path; } - // Setup project entries. - std::lock_guard lock(mutex_); - path_to_entry_index.reserve(entries.size()); - for (size_t i = 0; i < entries.size(); ++i) { - entries[i].id = i; - path_to_entry_index[entries[i].filename] = i; + { + // Setup project entries. + std::lock_guard lock(mutex_); + path_to_entry_index.reserve(entries.size()); + for (size_t i = 0; i < entries.size(); ++i) { + entries[i].id = i; + path_to_entry_index[entries[i].filename] = i; + } } }