From e430bfa05ab7b76d0278282e90ab55e0f0b26998 Mon Sep 17 00:00:00 2001 From: Alexis Murzeau Date: Sun, 26 Apr 2020 21:51:07 +0200 Subject: [PATCH] LSP: Fix error when opening a file with spaces in its path When doing Follow Symbol Under Cursor to a file that has a path with spaces, QtCreator will show a message box with an error. The issue is that the resolved file path can still have %20 encoding after the QUrl::toString convertion to QString. This is because toString does not support QUrl::FullyDecoded and fallback to PrettyDecoded instead which won't replace %20 with a space. To fix this, QUrl::fromPercentEncoding must be used. Also, an existing use of QUrl::fromPercentEncoding is changed to have an utf-8 input QByteArray instead of local8Bit as fromPercentEncoding convert %-encoded values to raw values and then convert the result from utf-8 to unicode QString. Change-Id: I784bcc30a67b45dcd218170854d480ebeef4237e Reviewed-by: David Schulz --- src/libs/languageserverprotocol/lsptypes.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/libs/languageserverprotocol/lsptypes.cpp b/src/libs/languageserverprotocol/lsptypes.cpp index 2a34a53fc61..4aa9963f1a3 100644 --- a/src/libs/languageserverprotocol/lsptypes.cpp +++ b/src/libs/languageserverprotocol/lsptypes.cpp @@ -399,12 +399,22 @@ Utils::Link Location::toLink() const { if (!isValid(nullptr)) return Utils::Link(); + + // QUrl::FullyDecoded is not supported by QUrl::toString. + // Ensure %xx like %20 are really decoded using fromPercentEncoding + // Else, a path with spaces would keep its %20 which would cause failure + // to open the file by the text editor. This is the cases with compilers in + // C:\Programs Files on Windows. auto file = uri().toString(QUrl::FullyDecoded | QUrl::PreferLocalFile); + + // fromPercentEncoding convert %xx encoding to raw values and then interpret + // the result as utf-8, so toUtf8() must be used here. + file = QUrl::fromPercentEncoding(file.toUtf8()); return Utils::Link(file, range().start().line() + 1, range().start().character()); } DocumentUri::DocumentUri(const QString &other) - : QUrl(QUrl::fromPercentEncoding(other.toLocal8Bit())) + : QUrl(QUrl::fromPercentEncoding(other.toUtf8())) { } DocumentUri::DocumentUri(const Utils::FilePath &other)