[clang-tools-extra] Preserve original RemoteIndexPath to correctly trim index symbols paths depending on platform (PR #217745)
Oganesyan Levon via cfe-commits
cfe-commits at lists.llvm.org
Thu Aug 20 12:58:34 PDT 2026
https://github.com/ilev4ik created https://github.com/llvm/llvm-project/pull/217745
After using version after the fix here: #2646. I faced the next problem: symbols location slashes were converted to posix ones before trimming prefix
>From 46d82eee715080c2ce080cc5652a4c8cef95d03f Mon Sep 17 00:00:00 2001
From: Levon <ilev4ik at gmail.com>
Date: Thu, 20 Aug 2026 19:52:04 +0300
Subject: [PATCH 1/2] marshaller build on linux respects windows paths in
index.dex
---
.../clangd/index/remote/marshalling/Marshalling.cpp | 10 +++++++---
1 file changed, 7 insertions(+), 3 deletions(-)
diff --git a/clang-tools-extra/clangd/index/remote/marshalling/Marshalling.cpp b/clang-tools-extra/clangd/index/remote/marshalling/Marshalling.cpp
index db77b8caf5679..abb3fe0a9a98d 100644
--- a/clang-tools-extra/clangd/index/remote/marshalling/Marshalling.cpp
+++ b/clang-tools-extra/clangd/index/remote/marshalling/Marshalling.cpp
@@ -264,7 +264,9 @@ FuzzyFindRequest Marshaller::toProtobuf(const clangd::FuzzyFindRequest &From) {
RPCRequest.set_restricted_for_code_completion(From.RestrictForCodeCompletion);
for (const auto &Path : From.ProximityPaths) {
llvm::SmallString<256> RelativePath = llvm::StringRef(Path);
- if (replace_path_prefix(RelativePath, LocalIndexRoot, ""))
+ bool IsWindowsIndex = is_absolute(Path.substr(1), Style::windows);
+ if (replace_path_prefix(RelativePath, LocalIndexRoot, "",
+ IsWindowsIndex ? Style::windows : Style::native))
RPCRequest.add_proximity_paths(
convert_to_slash(RelativePath, Style::windows));
}
@@ -396,9 +398,11 @@ llvm::Expected<std::string> Marshaller::uriToRelativePath(llvm::StringRef URI) {
llvm::SmallString<256> Result = ParsedURI->body();
llvm::StringRef Path(Result);
// Check for Windows paths (URI=file:///X:/path => Body=/X:/path)
- if (is_absolute(Path.substr(1), Style::windows))
+ bool IsWindowsIndex = is_absolute(Path.substr(1), Style::windows);
+ if (IsWindowsIndex)
Result = Path.drop_front().str();
- if (!replace_path_prefix(Result, RemoteIndexRoot, ""))
+ if (!replace_path_prefix(Result, RemoteIndexRoot, "",
+ IsWindowsIndex ? Style::windows : Style::native))
return error("File path '{0}' doesn't start with '{1}'.", Result.str(),
RemoteIndexRoot);
assert(Result == convert_to_slash(Result, Style::windows));
>From e1123bf9cd68f705f3daf4fe592675208017dbd3 Mon Sep 17 00:00:00 2001
From: Levon <ilev4ik at gmail.com>
Date: Thu, 20 Aug 2026 22:44:18 +0300
Subject: [PATCH 2/2] preserve original RemoteIndexPath to correctly trim
prefix
---
.../index/remote/marshalling/Marshalling.cpp | 25 +++++++++++--------
.../unittests/remote/MarshallingTests.cpp | 9 ++-----
2 files changed, 17 insertions(+), 17 deletions(-)
diff --git a/clang-tools-extra/clangd/index/remote/marshalling/Marshalling.cpp b/clang-tools-extra/clangd/index/remote/marshalling/Marshalling.cpp
index abb3fe0a9a98d..a8302fd28776e 100644
--- a/clang-tools-extra/clangd/index/remote/marshalling/Marshalling.cpp
+++ b/clang-tools-extra/clangd/index/remote/marshalling/Marshalling.cpp
@@ -58,17 +58,22 @@ Marshaller::Marshaller(llvm::StringRef RemoteIndexRoot,
llvm::StringRef LocalIndexRoot)
: Strings(Arena) {
llvm::StringRef PosixSeparator = get_separator(Style::posix);
+ llvm::StringRef WindowsSeparator = get_separator(Style::windows);
+ const bool IsWindows = is_absolute(RemoteIndexRoot, Style::windows);
+ const bool IsPosix = is_absolute(RemoteIndexRoot, Style::posix);
if (!RemoteIndexRoot.empty()) {
- assert(is_absolute(RemoteIndexRoot, Style::posix) ||
- is_absolute(RemoteIndexRoot, Style::windows));
- this->RemoteIndexRoot = convert_to_slash(RemoteIndexRoot, Style::windows);
+ assert(IsPosix || IsWindows);
+ this->RemoteIndexRoot = RemoteIndexRoot;
llvm::StringRef Path(this->RemoteIndexRoot);
- if (!is_separator(this->RemoteIndexRoot.back(), Style::posix))
+ if (IsPosix && !is_separator(this->RemoteIndexRoot.back(), Style::posix))
this->RemoteIndexRoot += PosixSeparator;
+ else if (IsWindows &&
+ !is_separator(this->RemoteIndexRoot.back(), Style::windows))
+ this->RemoteIndexRoot += WindowsSeparator;
}
+
if (!LocalIndexRoot.empty()) {
- assert(is_absolute(LocalIndexRoot, Style::posix) ||
- is_absolute(LocalIndexRoot, Style::windows));
+ assert(IsPosix || IsWindows);
this->LocalIndexRoot = convert_to_slash(LocalIndexRoot, Style::windows);
llvm::StringRef Path(this->LocalIndexRoot);
if (!is_separator(this->LocalIndexRoot.back(), Style::posix))
@@ -266,7 +271,7 @@ FuzzyFindRequest Marshaller::toProtobuf(const clangd::FuzzyFindRequest &From) {
llvm::SmallString<256> RelativePath = llvm::StringRef(Path);
bool IsWindowsIndex = is_absolute(Path.substr(1), Style::windows);
if (replace_path_prefix(RelativePath, LocalIndexRoot, "",
- IsWindowsIndex ? Style::windows : Style::native))
+ IsWindowsIndex ? Style::windows : Style::posix))
RPCRequest.add_proximity_paths(
convert_to_slash(RelativePath, Style::windows));
}
@@ -402,11 +407,11 @@ llvm::Expected<std::string> Marshaller::uriToRelativePath(llvm::StringRef URI) {
if (IsWindowsIndex)
Result = Path.drop_front().str();
if (!replace_path_prefix(Result, RemoteIndexRoot, "",
- IsWindowsIndex ? Style::windows : Style::native))
+ IsWindowsIndex ? Style::windows : Style::posix))
return error("File path '{0}' doesn't start with '{1}'.", Result.str(),
RemoteIndexRoot);
- assert(Result == convert_to_slash(Result, Style::windows));
- return std::string(Result);
+
+ return std::string(convert_to_slash(Result, Style::windows));
}
clangd::SymbolLocation::Position
diff --git a/clang-tools-extra/clangd/unittests/remote/MarshallingTests.cpp b/clang-tools-extra/clangd/unittests/remote/MarshallingTests.cpp
index fe0dc4a67622c..4ce79cd310c0a 100644
--- a/clang-tools-extra/clangd/unittests/remote/MarshallingTests.cpp
+++ b/clang-tools-extra/clangd/unittests/remote/MarshallingTests.cpp
@@ -465,14 +465,9 @@ TEST(RemoteMarshallingTest, CrossPlatformPathsRoundTrip) {
Location.End.setLine(3);
Location.End.setColumn(4);
// Construct the URI as a Windows machine would have serialized it into the
- // index: file:///C:/remote/project/lib/File.cpp.
+ // index: file:///C:\remote\project\lib\File.cpp.
Location.FileURI =
- Strings
- .save("file:///" +
- convert_to_slash(RemoteIndexRoot,
- llvm::sys::path::Style::windows) +
- "lib/File.cpp")
- .begin();
+ Strings.save("file:///" + RemoteIndexRoot + "lib\\File.cpp").begin();
Ref.Location = Location;
auto Serialized = ProtobufMarshaller.toProtobuf(Ref);
More information about the cfe-commits
mailing list