Convert NT paths to DOSPath when resolving Symlinks

GetFinalPathNameByHandleW returns NTPaths (\\?\ Paths) which is an issue
as they don't match the paths stored in the internal dictionaries which
are DOS paths.
This commit is contained in:
Gwen Mittertreiner
2019-08-16 14:00:24 -07:00
parent cd3ada5abb
commit e587c3255c
2 changed files with 9 additions and 64 deletions

View File

@@ -911,36 +911,10 @@ void SwiftLangSupport::printMemberDeclDescription(const swift::ValueDecl *VD,
std::string SwiftLangSupport::resolvePathSymlinks(StringRef FilePath) {
std::string InputPath = FilePath;
#if !defined(_WIN32)
char full_path[MAXPATHLEN];
if (const char *path = realpath(InputPath.c_str(), full_path))
return path;
return InputPath;
#else
wchar_t full_path[MAX_PATH] = {0};
llvm::SmallVector<llvm::UTF16, 50> utf16Path;
llvm::convertUTF8ToUTF16String(InputPath.c_str(), utf16Path);
HANDLE fileHandle = CreateFileW(
(LPCWSTR)utf16Path.data(), 0, FILE_SHARE_READ | FILE_SHARE_WRITE, nullptr,
OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, nullptr);
if (fileHandle == INVALID_HANDLE_VALUE)
llvm::SmallString<256> output;
if (llvm::sys::fs::real_path(InputPath, output))
return InputPath;
DWORD numChars = GetFinalPathNameByHandleW(fileHandle, full_path, MAX_PATH,
FILE_NAME_NORMALIZED);
CloseHandle(fileHandle);
std::string utf8Path;
if (numChars > 0 && numChars <= MAX_PATH) {
llvm::ArrayRef<char> pathRef((const char *)full_path,
(const char *)(full_path + numChars));
return llvm::convertUTF16ToUTF8String(pathRef, utf8Path) ? utf8Path
: InputPath;
}
return InputPath;
#endif
return output.str();
}
void SwiftLangSupport::getStatistics(StatisticsReceiver receiver) {