From 46eccf229c368602c4b6178601a09b8cf7651552 Mon Sep 17 00:00:00 2001 From: Marcus Tillmanns Date: Fri, 2 Dec 2022 13:30:29 +0100 Subject: [PATCH] Docker: Add clangd executable option Change-Id: I93fbd9a7a6b0189ca31cc05b35df9d1636da29a3 Reviewed-by: Christian Kandeler Reviewed-by: Qt CI Bot Reviewed-by: --- src/plugins/docker/dockerdevice.cpp | 3 +++ src/plugins/docker/dockerdevice.h | 5 +++-- src/plugins/docker/dockerdevicewidget.cpp | 19 +++++++++++++++++++ src/plugins/docker/dockerdevicewidget.h | 2 ++ 4 files changed, 27 insertions(+), 2 deletions(-) diff --git a/src/plugins/docker/dockerdevice.cpp b/src/plugins/docker/dockerdevice.cpp index f8fad9efe66..839b26eabc0 100644 --- a/src/plugins/docker/dockerdevice.cpp +++ b/src/plugins/docker/dockerdevice.cpp @@ -682,6 +682,7 @@ const char DockerDeviceUseOutsideUser[] = "DockerDeviceUseUidGid"; const char DockerDeviceMappedPaths[] = "DockerDeviceMappedPaths"; const char DockerDeviceKeepEntryPoint[] = "DockerDeviceKeepEntryPoint"; const char DockerDeviceEnableLldbFlags[] = "DockerDeviceEnableLldbFlags"; +const char DockerDeviceClangDExecutable[] = "DockerDeviceClangDExecutable"; void DockerDevice::fromMap(const QVariantMap &map) { @@ -696,6 +697,7 @@ void DockerDevice::fromMap(const QVariantMap &map) data.mounts = map.value(DockerDeviceMappedPaths).toStringList(); data.keepEntryPoint = map.value(DockerDeviceKeepEntryPoint).toBool(); data.enableLldbFlags = map.value(DockerDeviceEnableLldbFlags).toBool(); + data.clangdExecutable = FilePath::fromUrl(map.value(DockerDeviceClangDExecutable).toUrl()); d->setData(data); } @@ -712,6 +714,7 @@ QVariantMap DockerDevice::toMap() const map.insert(DockerDeviceMappedPaths, data.mounts); map.insert(DockerDeviceKeepEntryPoint, data.keepEntryPoint); map.insert(DockerDeviceEnableLldbFlags, data.enableLldbFlags); + map.insert(DockerDeviceClangDExecutable, data.clangdExecutable.toUrl()); return map; } diff --git a/src/plugins/docker/dockerdevice.h b/src/plugins/docker/dockerdevice.h index 015ea806556..7bf12d961f2 100644 --- a/src/plugins/docker/dockerdevice.h +++ b/src/plugins/docker/dockerdevice.h @@ -21,8 +21,8 @@ public: { return imageId == other.imageId && repo == other.repo && tag == other.tag && useLocalUidGid == other.useLocalUidGid && mounts == other.mounts - && keepEntryPoint == other.keepEntryPoint - && enableLldbFlags == other.enableLldbFlags; + && keepEntryPoint == other.keepEntryPoint && enableLldbFlags == other.enableLldbFlags + && clangdExecutable == other.clangdExecutable; } bool operator!=(const DockerDeviceData &other) const { return !(*this == other); } @@ -49,6 +49,7 @@ public: QStringList mounts = {Core::DocumentManager::projectsDirectory().toString()}; bool keepEntryPoint = false; bool enableLldbFlags = false; + Utils::FilePath clangdExecutable; }; class DockerDevice : public ProjectExplorer::IDevice diff --git a/src/plugins/docker/dockerdevicewidget.cpp b/src/plugins/docker/dockerdevicewidget.cpp index fe6fbbfb0b8..fddc7a7356f 100644 --- a/src/plugins/docker/dockerdevicewidget.cpp +++ b/src/plugins/docker/dockerdevicewidget.cpp @@ -11,6 +11,7 @@ #include #include #include +#include #include #include @@ -100,6 +101,19 @@ DockerDeviceWidget::DockerDeviceWidget(const IDevice::Ptr &device) dockerDevice->setData(m_data); }); + auto clangDLabel = new QLabel(Tr::tr("Clangd Executable:")); + + m_clangdExecutable = new PathChooser(); + m_clangdExecutable->setExpectedKind(PathChooser::ExistingCommand); + m_clangdExecutable->setHistoryCompleter("Docker.ClangdExecutable.History"); + m_clangdExecutable->setAllowPathFromDevice(true); + m_clangdExecutable->setFilePath(m_data.clangdExecutable); + + connect(m_clangdExecutable, &PathChooser::rawPathChanged, this, [this, dockerDevice]() { + m_data.clangdExecutable = m_clangdExecutable->filePath(); + dockerDevice->setData(m_data); + }); + auto pathListLabel = new InfoLabel(Tr::tr("Paths to mount:")); pathListLabel->setAdditionalToolTip(Tr::tr("Source directory list should not be empty.")); @@ -163,6 +177,10 @@ DockerDeviceWidget::DockerDeviceWidget(const IDevice::Ptr &device) logView->clear(); dockerDevice->updateContainerAccess(); + const FilePath clangdPath = dockerDevice->rootPath().withNewPath("clangd").searchInPath(); + if (!clangdPath.isEmpty()) + m_clangdExecutable->setFilePath(clangdPath); + m_kitItemDetector.autoDetect(dockerDevice->id().toString(), searchPaths()); if (DockerApi::instance()->dockerDaemonAvailable().value_or(false) == false) @@ -193,6 +211,7 @@ DockerDeviceWidget::DockerDeviceWidget(const IDevice::Ptr &device) m_runAsOutsideUser, br, m_keepEntryPoint, br, m_enableLldbFlags, br, + clangDLabel, m_clangdExecutable, br, Column { pathListLabel, m_pathsListEdit, diff --git a/src/plugins/docker/dockerdevicewidget.h b/src/plugins/docker/dockerdevicewidget.h index 16aef78f656..4dc39d63003 100644 --- a/src/plugins/docker/dockerdevicewidget.h +++ b/src/plugins/docker/dockerdevicewidget.h @@ -10,6 +10,7 @@ #include #include +#include #include QT_BEGIN_NAMESPACE @@ -38,6 +39,7 @@ private: QCheckBox *m_runAsOutsideUser; QCheckBox *m_keepEntryPoint; QCheckBox *m_enableLldbFlags; + Utils::PathChooser *m_clangdExecutable; Utils::PathListEditor *m_pathsListEdit; KitDetector m_kitItemDetector;