Skip to content

Commit e587c32

Browse files
committed
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.
1 parent cd3ada5 commit e587c32

File tree

2 files changed

+9
-64
lines changed

2 files changed

+9
-64
lines changed

tools/SourceKit/lib/SwiftLang/SwiftLangSupport.cpp

Lines changed: 3 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -911,36 +911,10 @@ void SwiftLangSupport::printMemberDeclDescription(const swift::ValueDecl *VD,
911911

912912
std::string SwiftLangSupport::resolvePathSymlinks(StringRef FilePath) {
913913
std::string InputPath = FilePath;
914-
#if !defined(_WIN32)
915-
char full_path[MAXPATHLEN];
916-
if (const char *path = realpath(InputPath.c_str(), full_path))
917-
return path;
918-
919-
return InputPath;
920-
#else
921-
wchar_t full_path[MAX_PATH] = {0};
922-
llvm::SmallVector<llvm::UTF16, 50> utf16Path;
923-
llvm::convertUTF8ToUTF16String(InputPath.c_str(), utf16Path);
924-
925-
HANDLE fileHandle = CreateFileW(
926-
(LPCWSTR)utf16Path.data(), 0, FILE_SHARE_READ | FILE_SHARE_WRITE, nullptr,
927-
OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, nullptr);
928-
929-
if (fileHandle == INVALID_HANDLE_VALUE)
914+
llvm::SmallString<256> output;
915+
if (llvm::sys::fs::real_path(InputPath, output))
930916
return InputPath;
931-
932-
DWORD numChars = GetFinalPathNameByHandleW(fileHandle, full_path, MAX_PATH,
933-
FILE_NAME_NORMALIZED);
934-
CloseHandle(fileHandle);
935-
std::string utf8Path;
936-
if (numChars > 0 && numChars <= MAX_PATH) {
937-
llvm::ArrayRef<char> pathRef((const char *)full_path,
938-
(const char *)(full_path + numChars));
939-
return llvm::convertUTF16ToUTF8String(pathRef, utf8Path) ? utf8Path
940-
: InputPath;
941-
}
942-
return InputPath;
943-
#endif
917+
return output.str();
944918
}
945919

946920
void SwiftLangSupport::getStatistics(StatisticsReceiver receiver) {

tools/SourceKit/tools/sourcekitd-test/sourcekitd-test.cpp

Lines changed: 6 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -49,35 +49,6 @@ using namespace sourcekitd_test;
4949
#if defined(_WIN32)
5050
namespace {
5151
int STDOUT_FILENO = _fileno(stdout);
52-
const constexpr size_t MAXPATHLEN = MAX_PATH + 1;
53-
char *realpath(const char *path, char *resolved_path) {
54-
wchar_t full_path[MAXPATHLEN] = {0};
55-
llvm::SmallVector<llvm::UTF16, 50> utf16Path;
56-
llvm::convertUTF8ToUTF16String(path, utf16Path);
57-
58-
HANDLE fileHandle = CreateFileW(
59-
(LPCWSTR)utf16Path.data(), 0, FILE_SHARE_READ | FILE_SHARE_WRITE, nullptr,
60-
OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, nullptr);
61-
62-
if (fileHandle == INVALID_HANDLE_VALUE)
63-
return nullptr;
64-
DWORD success = GetFinalPathNameByHandleW(fileHandle, full_path, MAX_PATH,
65-
FILE_NAME_NORMALIZED);
66-
CloseHandle(fileHandle);
67-
if (!success) return nullptr;
68-
69-
std::string utf8Path;
70-
llvm::ArrayRef<char> pathRef((const char *)full_path,
71-
(const char *)(full_path + MAX_PATH));
72-
if (!llvm::convertUTF16ToUTF8String(pathRef, utf8Path))
73-
return nullptr;
74-
75-
if (!resolved_path) {
76-
resolved_path = static_cast<char *>(malloc(utf8Path.length() + 1));
77-
}
78-
std::copy(std::begin(utf8Path), std::end(utf8Path), resolved_path);
79-
return resolved_path;
80-
}
8152
}
8253
#endif
8354

@@ -1445,9 +1416,9 @@ static void printCursorInfo(sourcekitd_variant_t Info, StringRef FilenameIn,
14451416
}
14461417

14471418
std::string Filename = FilenameIn;
1448-
char full_path[MAXPATHLEN];
1449-
if (const char *path = realpath(Filename.c_str(), full_path))
1450-
Filename = path;
1419+
llvm::SmallString<256> output;
1420+
if (!llvm::sys::fs::real_path(Filename, output))
1421+
Filename = output.str();
14511422

14521423
const char *Kind = sourcekitd_uid_get_string_ptr(KindUID);
14531424
const char *USR = sourcekitd_variant_dictionary_get_string(Info, KeyUSR);
@@ -1617,9 +1588,9 @@ static void printRangeInfo(sourcekitd_variant_t Info, StringRef FilenameIn,
16171588
}
16181589

16191590
std::string Filename = FilenameIn;
1620-
char full_path[MAXPATHLEN];
1621-
if (const char *path = realpath(Filename.c_str(), full_path))
1622-
Filename = path;
1591+
llvm::SmallString<256> output;
1592+
if (llvm::sys::fs::real_path(Filename, output))
1593+
Filename = output.str();
16231594

16241595
sourcekitd_variant_t OffsetObj =
16251596
sourcekitd_variant_dictionary_get_value(Info, KeyOffset);

0 commit comments

Comments
 (0)