From 969d65971378e4744967ace7de2a99ada86feabf Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Wed, 29 Sep 2021 18:07:54 +0200 Subject: [PATCH 01/19] QmlDesigner: Allow resolvedUrl in ui.qml files MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I220582466ffe62392b78419b9a2f6b83cf73f9af Reviewed-by: Henning Gründl --- src/libs/qmljs/qmljscheck.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/qmljs/qmljscheck.cpp b/src/libs/qmljs/qmljscheck.cpp index 8b390048cc5..f91b587fb07 100644 --- a/src/libs/qmljs/qmljscheck.cpp +++ b/src/libs/qmljs/qmljscheck.cpp @@ -1745,7 +1745,7 @@ bool Check::visit(CallExpression *ast) static const QStringList colorFunctions = {"lighter", "darker", "rgba", "tint", "hsla", "hsva"}; static const QStringList qtFunction = {"point", "rect", "size", "vector2d", "vector3d", "vector4d", "quaternion" "matrix4x4", "formatDate", - "formatDateTime", "formatTime"}; + "formatDateTime", "formatTime", "resolvedUrl"}; const bool whiteListedFunction = translationFunctions.contains(name) || whiteListedFunctions.contains(name) || colorFunctions.contains(name) || qtFunction.contains(name); From 502afc754beb50d12d35b2de34cf2c9d1c5f91d4 Mon Sep 17 00:00:00 2001 From: Henning Gruendl Date: Wed, 29 Sep 2021 12:16:19 +0200 Subject: [PATCH 02/19] QmlDesigner: Fix ColorEditor gradient controls Fix ColorEditor gradient controls not updating their value on changing the gradient or selecting another item containing a gradient. Task-number: QDS-5183 Change-Id: Icbec41f8db90f1e9c4ff0f3564ad6ed1df667f0f Reviewed-by: Thomas Hartmann --- .../imports/HelperWidgets/ColorEditor.qml | 14 ++++++++++++++ .../HelperWidgets/GradientPropertySpinBox.qml | 8 +++++--- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ColorEditor.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ColorEditor.qml index d07812f02fd..8006be8ffa1 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ColorEditor.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ColorEditor.qml @@ -1075,6 +1075,20 @@ SecondColumnLayout { Layout.fillWidth: true spacing: 0 + Connections { + target: ceMode + function onActivated() { + spinBox.readValue() + } + } + + Connections { + target: modelNodeBackend + function onSelectionChanged() { + spinBox.readValue() + } + } + GradientPropertySpinBox { id: spinBox implicitWidth: StudioTheme.Values.controlGap diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/GradientPropertySpinBox.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/GradientPropertySpinBox.qml index a1c3251335c..65b6c14c73d 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/GradientPropertySpinBox.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/GradientPropertySpinBox.qml @@ -45,6 +45,10 @@ Item { onFocusChanged: restoreCursor() + function readValue() { + spinBox.realValue = gradientLine.model.readGradientProperty(wrapper.propertyName) + } + StudioControls.RealSpinBox { id: spinBox @@ -56,9 +60,7 @@ Item { realStepSize: 1 decimals: 0 - Component.onCompleted: { - spinBox.realValue = gradientLine.model.readGradientProperty(wrapper.propertyName) - } + Component.onCompleted: wrapper.readValue() onCompressedRealValueModified: { gradientLine.model.setGradientProperty(wrapper.propertyName, spinBox.realValue) } From c026a100a41dc1001587efcb8ac3653bf586b2eb Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Tue, 28 Sep 2021 17:55:21 +0200 Subject: [PATCH 03/19] QmlDesigner: Do not mark file as changed for "formeditorColor" Task-number: QDS-4044 Change-Id: I52a3707edeee8c2204fb67d8101d2a0e99af06ae Reviewed-by: Qt CI Bot Reviewed-by: Thomas Hartmann --- src/plugins/qmldesigner/designercore/model/rewriterview.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/qmldesigner/designercore/model/rewriterview.cpp b/src/plugins/qmldesigner/designercore/model/rewriterview.cpp index a1107504533..5191aac4db0 100644 --- a/src/plugins/qmldesigner/designercore/model/rewriterview.cpp +++ b/src/plugins/qmldesigner/designercore/model/rewriterview.cpp @@ -448,7 +448,7 @@ void RewriterView::auxiliaryDataChanged(const ModelNode &node, const PropertyNam return; if (node.isRootNode()) { - if (name == "width" || name == "height" || name == "autoSize") + if (name == "width" || name == "height" || name == "autoSize" || name == "formeditorColor") return; } From 5d843fc4f7f071b760fdde5a21ae32264a362c48 Mon Sep 17 00:00:00 2001 From: Johanna Vanhatapio Date: Thu, 30 Sep 2021 14:57:35 +0300 Subject: [PATCH 04/19] Doc: Update info about the light components Task-number: QDS-4888 Change-Id: I2a25ab5c6e8c8ce985ad73d3f52a638857d0e127 Reviewed-by: Leena Miettinen (cherry picked from commit c75df591ed0884f08e9352d6d2c5d285a4b31300) Reviewed-by: Eike Ziller --- .../images/studio-3d-area-light.png | Bin 21349 -> 21349 bytes .../images/studio-3d-directional-light.png | Bin 19122 -> 19122 bytes .../images/studio-3d-point-light.png | Bin 21503 -> 21503 bytes .../images/studio-3d-spot-light.png | Bin 25519 -> 25519 bytes .../qtdesignstudio-3d-lights.qdoc | 87 +++++++++++++----- 5 files changed, 64 insertions(+), 23 deletions(-) diff --git a/doc/qtdesignstudio/images/studio-3d-area-light.png b/doc/qtdesignstudio/images/studio-3d-area-light.png index d31661e992335c5c2547e06d63fb9483a0bd1ae9..24fbfcbe33e6db0d89483aa42fa17de252a7e460 100644 GIT binary patch delta 17163 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 C)e@=z delta 16444 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 Date: Thu, 30 Sep 2021 21:46:18 +0200 Subject: [PATCH 05/19] ProjectExplorer: One more usage of fromUserInfo The recent projects are handled as QString, and hit FilePath in ProjectExplorerPluginPrivate::openRecentProject(), the first time. This quick fix is using fromUserInfo. A proper solution will be to change the API and data structures around recent projects to use FileApi. Change-Id: I668cd11020833659e9b7af9e1f8314fb1f404293 Reviewed-by: hjk --- src/plugins/projectexplorer/projectexplorer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp index 852b5c27e87..f7fe67d213d 100644 --- a/src/plugins/projectexplorer/projectexplorer.cpp +++ b/src/plugins/projectexplorer/projectexplorer.cpp @@ -3313,7 +3313,7 @@ void ProjectExplorerPluginPrivate::openRecentProject(const QString &fileName) { if (!fileName.isEmpty()) { ProjectExplorerPlugin::OpenProjectResult result - = ProjectExplorerPlugin::openProject(FilePath::fromString(fileName)); + = ProjectExplorerPlugin::openProject(FilePath::fromUserInput(fileName)); if (!result) ProjectExplorerPlugin::showOpenProjectError(result); } From 6907d9c6b4183d39203003514e445122e1833207 Mon Sep 17 00:00:00 2001 From: Cristian Adam Date: Mon, 4 Oct 2021 10:39:29 +0200 Subject: [PATCH 06/19] GitHub Actions: Update LLVM/Clang to version 13.0.0 Change-Id: I6f1b008da3ee511ab5494d7e8b0556036b14e64c Reviewed-by: Eike Ziller --- .github/workflows/build_cmake.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build_cmake.yml b/.github/workflows/build_cmake.yml index 1971d93c736..e3a77501192 100644 --- a/.github/workflows/build_cmake.yml +++ b/.github/workflows/build_cmake.yml @@ -4,7 +4,7 @@ on: [push, pull_request] env: QT_VERSION: 5.15.2 - CLANG_VERSION: 120 + CLANG_VERSION: 130 ELFUTILS_VERSION: 0.175 CMAKE_VERSION: 3.21.1 NINJA_VERSION: 1.10.2 @@ -286,9 +286,9 @@ jobs: set(libclang "libclang-release_${clang_version}-based-windows-vs2019_32.7z") endif() elseif ("${{ runner.os }}" STREQUAL "Linux") - set(libclang "libclang-release_${clang_version}-based-linux-Ubuntu18.04-gcc9.3-x86_64.7z") + set(libclang "libclang-release_${clang_version}-based-linux-Ubuntu20.04-gcc9.3-x86_64.7z") elseif ("${{ runner.os }}" STREQUAL "macOS") - set(libclang "libclang-release_${clang_version}-based-mac.7z") + set(libclang "libclang-release_${clang_version}-based-macos-universal.7z") endif() set(libclang_url "https://\${qt_mirror}/development_releases/prebuilt/libclang/${libclang}") From 95259ae79de12fcf80f5784f732ac7558248c275 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Mon, 4 Oct 2021 09:40:33 +0200 Subject: [PATCH 07/19] CMakePM: Be more graceful regarding cmake tools Otherwise we may easily lose registered tools if the device is currently not available. This happens e.g. if the docker daemon is not running. Change-Id: I10156d749bf33d7d789c3fad78bf3acdf1f6fd74 Reviewed-by: hjk Reviewed-by: Cristian Adam --- src/plugins/cmakeprojectmanager/cmaketoolsettingsaccessor.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/cmakeprojectmanager/cmaketoolsettingsaccessor.cpp b/src/plugins/cmakeprojectmanager/cmaketoolsettingsaccessor.cpp index ff4e6d331eb..acd9422fc74 100644 --- a/src/plugins/cmakeprojectmanager/cmaketoolsettingsaccessor.cpp +++ b/src/plugins/cmakeprojectmanager/cmaketoolsettingsaccessor.cpp @@ -213,7 +213,7 @@ void CMakeToolSettingsAccessor::saveCMakeTools(const QList &cmakeTo for (const CMakeTool *item : cmakeTools) { Utils::FilePath fi = item->cmakeExecutable(); - if (fi.isExecutableFile()) { + if (fi.needsDevice() || fi.isExecutableFile()) { // be graceful for device related stuff QVariantMap tmp = item->toMap(); if (tmp.isEmpty()) continue; From 3a02e0372984dee44aacc3f1ae83e163cab3ad54 Mon Sep 17 00:00:00 2001 From: hjk Date: Mon, 4 Oct 2021 10:59:41 +0200 Subject: [PATCH 08/19] Utils: Add an Environment::searchInDirectories And use it in the local branch for FilePath::searchInDirectory which so far erroneously also looked into the system environment's path. Change-Id: I60316831b74a55dee84fbf4b54c0eecc49dd8dde Reviewed-by: Eike Ziller --- src/libs/utils/environment.cpp | 53 +++++++++++++++++++++++----------- src/libs/utils/environment.h | 6 ++-- src/libs/utils/filepath.cpp | 2 +- 3 files changed, 39 insertions(+), 22 deletions(-) diff --git a/src/libs/utils/environment.cpp b/src/libs/utils/environment.cpp index db178852676..2d3d6edf3b4 100644 --- a/src/libs/utils/environment.cpp +++ b/src/libs/utils/environment.cpp @@ -136,8 +136,10 @@ void Environment::setupEnglishOutput() set("LANGUAGE", "en_US:en"); } -FilePath Environment::searchInDirectory(const QStringList &execs, const FilePath &directory, - QSet &alreadyChecked) +static FilePath searchInDirectory(const Environment &env, + const QStringList &execs, + const FilePath &directory, + QSet &alreadyChecked) { const int checkedCount = alreadyChecked.count(); alreadyChecked.insert(directory); @@ -199,17 +201,19 @@ QString Environment::expandedValueForKey(const QString &key) const return expandVariables(value(key)); } -FilePath Environment::searchInPath(const QString &executable, - const FilePaths &additionalDirs, - const PathFilter &func) const +static FilePath searchInDirectoriesHelper(const Environment &env, + const QString &executable, + const FilePaths &dirs, + const Environment::PathFilter &func, + bool usePath) { if (executable.isEmpty()) return FilePath(); - const QString exec = QDir::cleanPath(expandVariables(executable)); + const QString exec = QDir::cleanPath(env.expandVariables(executable)); const QFileInfo fi(exec); - const QStringList execs = appendExeExtensions(exec); + const QStringList execs = env.appendExeExtensions(exec); if (fi.isAbsolute()) { for (const QString &path : execs) { @@ -221,23 +225,38 @@ FilePath Environment::searchInPath(const QString &executable, } QSet alreadyChecked; - for (const FilePath &dir : additionalDirs) { - FilePath tmp = searchInDirectory(execs, dir, alreadyChecked); + for (const FilePath &dir : dirs) { + FilePath tmp = searchInDirectory(env, execs, dir, alreadyChecked); if (!tmp.isEmpty() && (!func || func(tmp))) return tmp; } - if (executable.contains('/')) - return FilePath(); + if (usePath) { + if (executable.contains('/')) + return FilePath(); - for (const FilePath &p : path()) { - FilePath tmp = searchInDirectory(execs, p, alreadyChecked); - if (!tmp.isEmpty() && (!func || func(tmp))) - return tmp; + for (const FilePath &p : env.path()) { + FilePath tmp = searchInDirectory(env, execs, p, alreadyChecked); + if (!tmp.isEmpty() && (!func || func(tmp))) + return tmp; + } } return FilePath(); } +FilePath Environment::searchInDirectories(const QString &executable, + const FilePaths &dirs) const +{ + return searchInDirectoriesHelper(*this, executable, dirs, {}, false); +} + +FilePath Environment::searchInPath(const QString &executable, + const FilePaths &additionalDirs, + const PathFilter &func) const +{ + return searchInDirectoriesHelper(*this, executable, additionalDirs, func, true); +} + FilePaths Environment::findAllInPath(const QString &executable, const FilePaths &additionalDirs, const Environment::PathFilter &func) const @@ -262,14 +281,14 @@ FilePaths Environment::findAllInPath(const QString &executable, QSet result; QSet alreadyChecked; for (const FilePath &dir : additionalDirs) { - FilePath tmp = searchInDirectory(execs, dir, alreadyChecked); + FilePath tmp = searchInDirectory(*this, execs, dir, alreadyChecked); if (!tmp.isEmpty() && (!func || func(tmp))) result << tmp; } if (!executable.contains('/')) { for (const FilePath &p : path()) { - FilePath tmp = searchInDirectory(execs, p, alreadyChecked); + FilePath tmp = searchInDirectory(*this, execs, p, alreadyChecked); if (!tmp.isEmpty() && (!func || func(tmp))) result << tmp; } diff --git a/src/libs/utils/environment.h b/src/libs/utils/environment.h index c20ed67f7df..9cfa64faba4 100644 --- a/src/libs/utils/environment.h +++ b/src/libs/utils/environment.h @@ -63,6 +63,8 @@ public: FilePath searchInPath(const QString &executable, const FilePaths &additionalDirs = FilePaths(), const PathFilter &func = PathFilter()) const; + FilePath searchInDirectories(const QString &executable, + const FilePaths &dirs) const; FilePaths findAllInPath(const QString &executable, const FilePaths &additionalDirs = FilePaths(), const PathFilter &func = PathFilter()) const; @@ -80,10 +82,6 @@ public: static void modifySystemEnvironment(const EnvironmentItems &list); // use with care!!! static void setSystemEnvironment(const Environment &environment); // don't use at all!!! - -private: - static FilePath searchInDirectory(const QStringList &execs, const FilePath &directory, - QSet &alreadyChecked); }; class QTCREATOR_UTILS_EXPORT EnvironmentChange final diff --git a/src/libs/utils/filepath.cpp b/src/libs/utils/filepath.cpp index 3602a6c304f..fd68683acee 100644 --- a/src/libs/utils/filepath.cpp +++ b/src/libs/utils/filepath.cpp @@ -1208,7 +1208,7 @@ FilePath FilePath::searchInDirectories(const FilePaths &dirs) const QTC_ASSERT(s_deviceHooks.searchInPath, return {}); return s_deviceHooks.searchInPath(*this, dirs); } - return Environment::systemEnvironment().searchInPath(path(), dirs); + return Environment::systemEnvironment().searchInDirectories(path(), dirs); } FilePath FilePath::searchInPath(const QList &additionalDirs) const From 2f8b541fe55737edbaa4e73dcaa7c5072bf72d1d Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Wed, 29 Sep 2021 14:23:42 +0200 Subject: [PATCH 09/19] Replace QHash with std::unordered_map inside ProFileCache It looks like it happens that while holding a reference to ProFileCache::parsed_files elements we are modifying this container by adding / removing items. In general it's undefined behavior. In addition some other fixes have been made. Comments inside the code. Task-number: QTCREATORBUG-26351 Change-Id: I7f98c813ff6b7bd612757e7a14a5e6835affd21e Reviewed-by: Eike Ziller Reviewed-by: Qt CI Bot Reviewed-by: Christian Kandeler --- src/shared/proparser/qmakeparser.cpp | 152 ++++++++++++++++++++------- src/shared/proparser/qmakeparser.h | 11 +- 2 files changed, 119 insertions(+), 44 deletions(-) diff --git a/src/shared/proparser/qmakeparser.cpp b/src/shared/proparser/qmakeparser.cpp index f42d2181477..12233ae19c5 100644 --- a/src/shared/proparser/qmakeparser.cpp +++ b/src/shared/proparser/qmakeparser.cpp @@ -49,9 +49,9 @@ ProFileCache::ProFileCache() ProFileCache::~ProFileCache() { - foreach (const Entry &ent, parsed_files) - if (ent.pro) - ent.pro->deref(); + for (const auto &keyValuePair : parsed_files) + if (keyValuePair.second.pro) + keyValuePair.second.pro->deref(); QMakeVfs::deref(); } @@ -73,19 +73,36 @@ void ProFileCache::discardFile(int id) auto it = parsed_files.find(id); if (it != parsed_files.end()) { #ifdef PROPARSER_THREAD_SAFE - if (it->locker) { - if (!it->locker->done) { - ++it->locker->waiters; - it->locker->cond.wait(&mutex); - if (!--it->locker->waiters) { - delete it->locker; - it->locker = 0; + Entry &entry = it->second; + Entry::Locker *locker = entry.locker; + if (locker) { // Either it's still being prepared or it's already done but someone + // else started waiting for it when it wasn't ready yet + // and is still waiting. + if (!locker->done) { + ++locker->waiters; + locker->cond.wait(&mutex); // Mutex is unlocked and relocked, + // everything may happen in this time window + it = parsed_files.find(id); // In meantime the iterator could have + // been invalidated, search for it again + Q_ASSERT(it != parsed_files.end()); // This would mean that some other + // waiter removed our entry, but only + // the last waiter should do it + if (!--locker->waiters) { + delete locker; + } else { + // There are still other waiters. Do nothing now. + locker->removeOnLastWaiter = true; + return; } + } else if (locker->waiters) { + // It's done but some waiters are still awaiting to be woken. + locker->removeOnLastWaiter = true; // Mark it for other waiters + return; } } #endif - if (it->pro) - it->pro->deref(); + if (entry.pro) + entry.pro->deref(); parsed_files.erase(it); } } @@ -95,26 +112,53 @@ void ProFileCache::discardFiles(const QString &prefix, QMakeVfs *vfs) #ifdef PROPARSER_THREAD_SAFE QMutexLocker lck(&mutex); #endif - auto it = parsed_files.begin(), end = parsed_files.end(); - while (it != end) { + auto it = parsed_files.begin(); + while (it != parsed_files.end()) { + const int id = it->first; // Note: this is empty for virtual files from other VFSes. - QString fn = vfs->fileNameForId(it.key()); + const QString fn = vfs->fileNameForId(id); if (fn.startsWith(prefix)) { #ifdef PROPARSER_THREAD_SAFE - if (it->locker) { - if (!it->locker->done) { - ++it->locker->waiters; - it->locker->cond.wait(&mutex); - if (!--it->locker->waiters) { - delete it->locker; - it->locker = 0; + bool continueFromScratch = false; + Entry &entry = it->second; + Entry::Locker *locker = entry.locker; + if (locker) { // Either it's still being prepared or it's already done but someone + // else started waiting for it when it wasn't ready yet + // and is still waiting. + if (!locker->done) { // It's still being prepared. + ++locker->waiters; + locker->cond.wait(&mutex); // Mutex is unlocked and relocked, + // everything may happen in this time window + it = parsed_files.find(id); // In meantime the iterator could have + // been invalidated, search for it again + Q_ASSERT(it != parsed_files.end()); // This would mean that some other + // waiter removed our entry, but only + // the last waiter should do it + if (!--locker->waiters) { + delete locker; // No more waiters, remove locker and entry + continueFromScratch = true; + } else { + // There are still other waiters. Do nothing now + locker->removeOnLastWaiter = true; + it = parsed_files.begin(); // Start from scratch, as new matching + // entries could have appeared. + // If we hit it again, we will skip it + // as the locker is already marked as done + continue; } + } else if (locker->waiters) { + // It's done but some waiters are still awaiting to be woken. + locker->removeOnLastWaiter = true; // Mark it for other waiters + ++it; // We skip it for now, other waiter will do the job + continue; } } #endif - if (it->pro) - it->pro->deref(); + if (entry.pro) + entry.pro->deref(); it = parsed_files.erase(it); + if (continueFromScratch) + it = parsed_files.begin(); } else { ++it; } @@ -187,20 +231,44 @@ ProFile *QMakeParser::parsedProFile(const QString &fileName, ParseFlags flags) if ((flags & ParseUseCache) && m_cache) { ProFileCache::Entry *ent; #ifdef PROPARSER_THREAD_SAFE - QMutexLocker locker(&m_cache->mutex); + QMutexLocker lck(&m_cache->mutex); #endif auto it = m_cache->parsed_files.find(id); if (it != m_cache->parsed_files.end()) { - ent = &*it; + ent = &it->second; #ifdef PROPARSER_THREAD_SAFE - if (ent->locker && !ent->locker->done) { - ++ent->locker->waiters; - QThreadPool::globalInstance()->releaseThread(); - ent->locker->cond.wait(locker.mutex()); - QThreadPool::globalInstance()->reserveThread(); - if (!--ent->locker->waiters) { - delete ent->locker; - ent->locker = 0; + ProFileCache::Entry::Locker *locker = ent->locker; + if (locker) { // Either it's still being prepared or it's already done but someone + // else started waiting for it when it wasn't ready yet + // and is still waiting. + if (!locker->done) { // It's still being prepared. + ++locker->waiters; + QThreadPool::globalInstance()->releaseThread(); + locker->cond.wait(lck.mutex()); // Mutex is unlocked and relocked, + // everything may happen in this time window + QThreadPool::globalInstance()->reserveThread(); + + it = m_cache->parsed_files.find(id); // In meantime the iterator could have + // been invalidated, search for it again + Q_ASSERT(it != m_cache->parsed_files.end()); // This would mean that some other + // waiter removed our entry, but only + // the last waiter should do it + const bool remove = locker->removeOnLastWaiter; // Some waiter marked this + // entry for removal. + if (!--locker->waiters) { // If we were the last waiter + delete locker; // we do it now + ent->locker = 0; + if (remove) { + if (ent->pro) + ent->pro->deref(); + m_cache->parsed_files.erase(it); + return nullptr; + } + } + if (remove) + return nullptr; + } else if (locker->removeOnLastWaiter) { + return nullptr; } } #endif @@ -210,7 +278,7 @@ ProFile *QMakeParser::parsedProFile(const QString &fileName, ParseFlags flags) ent = &m_cache->parsed_files[id]; #ifdef PROPARSER_THREAD_SAFE ent->locker = new ProFileCache::Entry::Locker; - locker.unlock(); + lck.unlock(); // We unlock the mutex and open a time window #endif QString contents; if (readFile(id, flags, &contents)) { @@ -222,11 +290,17 @@ ProFile *QMakeParser::parsedProFile(const QString &fileName, ParseFlags flags) } ent->pro = pro; #ifdef PROPARSER_THREAD_SAFE - locker.relock(); - if (ent->locker->waiters) { - ent->locker->done = true; + lck.relock(); // We relock it back and close the window. Someone could have added a new + // entry to the parsed_files list (or removed one). However, no one + // was awoken for our id in this time window. + it = m_cache->parsed_files.find(id); // In meantime the iterator could have + // been invalidated, search for it again + Q_ASSERT(it != m_cache->parsed_files.end()); // This would mean that our reference + // is also invalid + if (ent->locker->waiters) { // Someone runs getter or wants to remove it + ent->locker->done = true; // The structure is ready ent->locker->cond.wakeAll(); - } else { + } else { // No one was interested, remove locker as everything is ready now delete ent->locker; ent->locker = 0; } diff --git a/src/shared/proparser/qmakeparser.h b/src/shared/proparser/qmakeparser.h index 905b50608bd..f2bc076ce4a 100644 --- a/src/shared/proparser/qmakeparser.h +++ b/src/shared/proparser/qmakeparser.h @@ -29,13 +29,14 @@ #include "qmakevfs.h" #include "proitems.h" -#include #include #ifdef PROPARSER_THREAD_SAFE # include # include #endif +#include + QT_BEGIN_NAMESPACE class QMAKE_EXPORT QMakeParserHandler { @@ -208,16 +209,16 @@ private: ProFile *pro; #ifdef PROPARSER_THREAD_SAFE struct Locker { - Locker() : waiters(0), done(false) {} QWaitCondition cond; - int waiters; - bool done; + int waiters = 0; + bool done = false; + bool removeOnLastWaiter = false; }; Locker *locker; #endif }; - QHash parsed_files; + std::unordered_map parsed_files; #ifdef PROPARSER_THREAD_SAFE QMutex mutex; #endif From 480bdbd3af2abe97a9a9ef7379351d60aff65296 Mon Sep 17 00:00:00 2001 From: Assam Boudjelthia Date: Mon, 13 Sep 2021 04:20:29 +0300 Subject: [PATCH 10/19] Add search field for Android Sdk Manager The list of packages from the sdk manager can be too much to look at and search manually, thus a search field is very convenient to have here. The search is very simple, include any package that contains the search word into the result. Change-Id: Id222841162739d49562ad11bb0f3152041614ebc Reviewed-by: Alessandro Portale --- .../android/androidsdkmanagerwidget.cpp | 26 +++++++++++- .../android/androidsdkmanagerwidget.ui | 41 +++++++++---------- 2 files changed, 43 insertions(+), 24 deletions(-) diff --git a/src/plugins/android/androidsdkmanagerwidget.cpp b/src/plugins/android/androidsdkmanagerwidget.cpp index c4598351536..c576571d32c 100644 --- a/src/plugins/android/androidsdkmanagerwidget.cpp +++ b/src/plugins/android/androidsdkmanagerwidget.cpp @@ -59,10 +59,12 @@ public: PackageFilterModel(AndroidSdkModel* sdkModel); void setAcceptedPackageState(AndroidSdkPackage::PackageState state); + void setAcceptedSearchPackage(const QString &text); bool filterAcceptsRow(int source_row, const QModelIndex &sourceParent) const override; private: AndroidSdkPackage::PackageState m_packageState = AndroidSdkPackage::AnyValidState; + QString m_searchText; }; AndroidSdkManagerWidget::AndroidSdkManagerWidget(AndroidConfig &config, @@ -129,6 +131,15 @@ AndroidSdkManagerWidget::AndroidSdkManagerWidget(AndroidConfig &config, } }); + m_ui->searchField->setPlaceholderText("Filter"); + connect(m_ui->searchField, &QLineEdit::textChanged, [this, proxyModel](const QString &text) { + const bool isExpanded = m_ui->expandCheck->isChecked(); + proxyModel->setAcceptedSearchPackage(text); + m_sdkModel->resetSelection(); + // It is more convenient to expand the view with the results + m_ui->expandCheck->setChecked(!text.isEmpty()); + }); + connect(m_ui->applySelectionButton, &QPushButton::clicked, this, &AndroidSdkManagerWidget::onApplyButton); connect(m_ui->cancelButton, &QPushButton::clicked, this, @@ -469,6 +480,12 @@ void PackageFilterModel::setAcceptedPackageState(AndroidSdkPackage::PackageState invalidateFilter(); } +void PackageFilterModel::setAcceptedSearchPackage(const QString &name) +{ + m_searchText = name; + invalidateFilter(); +} + bool PackageFilterModel::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const { QModelIndex srcIndex = sourceModel()->index(sourceRow, 0, sourceParent); @@ -479,19 +496,24 @@ bool PackageFilterModel::filterAcceptsRow(int sourceRow, const QModelIndex &sour return (AndroidSdkPackage::PackageState)i.data(AndroidSdkModel::PackageStateRole).toInt(); }; + auto packageFound = [this](const QModelIndex& i) { + return i.data(AndroidSdkModel::packageNameColumn).toString() + .contains(m_searchText, Qt::CaseInsensitive); + }; + bool showTopLevel = false; if (!sourceParent.isValid()) { // Top Level items for (int row = 0; row < sourceModel()->rowCount(srcIndex); ++row) { QModelIndex childIndex = sourceModel()->index(row, 0, srcIndex); - if (m_packageState & packageState(childIndex)) { + if ((m_packageState & packageState(childIndex) && packageFound(childIndex))) { showTopLevel = true; break; } } } - return showTopLevel || (packageState(srcIndex) & m_packageState); + return showTopLevel || (packageState(srcIndex) & m_packageState) && packageFound(srcIndex); } OptionsDialog::OptionsDialog(AndroidSdkManager *sdkManager, const QStringList &args, diff --git a/src/plugins/android/androidsdkmanagerwidget.ui b/src/plugins/android/androidsdkmanagerwidget.ui index e49f7a792ef..3baa968402a 100644 --- a/src/plugins/android/androidsdkmanagerwidget.ui +++ b/src/plugins/android/androidsdkmanagerwidget.ui @@ -51,27 +51,7 @@ 4 - - - - - - - 0 - 0 - - - - Expand All - - - true - - - - - - + 20 @@ -81,7 +61,7 @@ - + @@ -149,6 +129,16 @@ + + + + + + + Expand All + + + @@ -234,6 +224,13 @@ + + + Utils::FancyLineEdit + QLineEdit +

utils/fancylineedit.h
+ + packagesView showAllRadio From 2de32e3aa8552007e47834170b457a902805cf10 Mon Sep 17 00:00:00 2001 From: Assam Boudjelthia Date: Mon, 20 Sep 2021 21:19:00 +0300 Subject: [PATCH 11/19] Android: make sure emulator device actions are emulator specific Actions like start, erase, and avd arguments are specific to emulator type devices, so make sure such actions are only in that case. Task-number: QTCREATORBUG-23991 Change-Id: I9d5ffbd733c31540ab4e3d2a617cad54e70f8f8e Reviewed-by: Alessandro Portale --- src/plugins/android/androiddevice.cpp | 82 ++++++++++++++++++++------- src/plugins/android/androiddevice.h | 9 ++- 2 files changed, 66 insertions(+), 25 deletions(-) diff --git a/src/plugins/android/androiddevice.cpp b/src/plugins/android/androiddevice.cpp index 38d6e09ad8b..bba148dda86 100644 --- a/src/plugins/android/androiddevice.cpp +++ b/src/plugins/android/androiddevice.cpp @@ -69,8 +69,8 @@ public: void updateDeviceFromUi() final {} static QString dialogTitle(); - static bool criticalDialog(const QString &error); - static bool questionDialog(const QString &question); + static bool criticalDialog(const QString &error, QWidget *parent = nullptr); + static bool questionDialog(const QString &question, QWidget *parent = nullptr); }; AndroidDeviceWidget::AndroidDeviceWidget(const IDevice::Ptr &device) @@ -114,10 +114,10 @@ QString AndroidDeviceWidget::dialogTitle() return tr("Android Device Manager"); } -bool AndroidDeviceWidget::criticalDialog(const QString &error) +bool AndroidDeviceWidget::criticalDialog(const QString &error, QWidget *parent) { qCDebug(androidDeviceLog) << error; - QMessageBox box(Core::ICore::dialogParent()); + QMessageBox box(parent ? parent : Core::ICore::dialogParent()); box.QDialog::setWindowTitle(dialogTitle()); box.setText(error); box.setIcon(QMessageBox::Critical); @@ -125,9 +125,9 @@ bool AndroidDeviceWidget::criticalDialog(const QString &error) return box.exec(); } -bool AndroidDeviceWidget::questionDialog(const QString &question) +bool AndroidDeviceWidget::questionDialog(const QString &question, QWidget *parent) { - QMessageBox box(Core::ICore::dialogParent()); + QMessageBox box(parent ? parent : Core::ICore::dialogParent()); box.QDialog::setWindowTitle(dialogTitle()); box.setText(question); box.setIcon(QMessageBox::Question); @@ -155,19 +155,56 @@ AndroidDevice::AndroidDevice() AndroidDeviceManager::instance()->updateDevicesListOnce(); }}); - addDeviceAction({tr("Start AVD"), [](const IDevice::Ptr &device, QWidget *parent) { - if (device->machineType() == IDevice::Emulator) - AndroidDeviceManager::instance()->startAvd(device); - }}); + addEmulatorActionsIfNotFound(); +} - addDeviceAction({tr("Erase AVD"), [](const IDevice::Ptr &device, QWidget *parent) { - if (device->machineType() == IDevice::Emulator) - AndroidDeviceManager::instance()->eraseAvd(device); - }}); +void AndroidDevice::addEmulatorActionsIfNotFound() +{ + static const QString startAvdAction = tr("Start AVD"); + static const QString eraseAvdAction = tr("Erase AVD"); + static const QString avdArgumentsAction = tr("AVD Arguments"); - addDeviceAction({tr("AVD Arguments"), [](const IDevice::Ptr &device, QWidget *parent) { - AndroidDeviceManager::instance()->setEmulatorArguments(); - }}); + bool hasStartAction = false; + bool hasEraseAction = false; + bool hasAvdArgumentsAction = false; + + for (const DeviceAction &item : deviceActions()) { + if (item.display == startAvdAction) + hasStartAction = true; + else if (item.display == eraseAvdAction) + hasEraseAction = true; + else if (item.display == avdArgumentsAction) + hasAvdArgumentsAction = true; + } + + if (machineType() == Emulator) { + if (!hasStartAction) { + addDeviceAction({startAvdAction, [](const IDevice::Ptr &device, QWidget *parent) { + AndroidDeviceManager::instance()->startAvd(device, parent); + }}); + } + + if (!hasEraseAction) { + addDeviceAction({eraseAvdAction, [](const IDevice::Ptr &device, QWidget *parent) { + AndroidDeviceManager::instance()->eraseAvd(device, parent); + }}); + } + + if (!hasAvdArgumentsAction) { + addDeviceAction({avdArgumentsAction, [](const IDevice::Ptr &device, QWidget *parent) { + Q_UNUSED(device) + AndroidDeviceManager::instance()->setEmulatorArguments(parent); + }}); + } + } +} + +void AndroidDevice::fromMap(const QVariantMap &map) +{ + IDevice::fromMap(map); + // Add Actions for Emulator is not added already. + // This is needed because actions for Emulators and physical devices are not the same. + addEmulatorActionsIfNotFound(); } IDevice::Ptr AndroidDevice::create() @@ -407,8 +444,9 @@ void AndroidDeviceManager::updateDevicesListOnce() } } -void AndroidDeviceManager::startAvd(const ProjectExplorer::IDevice::Ptr &device) +void AndroidDeviceManager::startAvd(const ProjectExplorer::IDevice::Ptr &device, QWidget *parent) { + Q_UNUSED(parent) const AndroidDevice *androidDev = static_cast(device.data()); const QString name = androidDev->avdName(); qCDebug(androidDeviceLog, "Starting Android AVD id \"%s\".", qPrintable(name)); @@ -422,7 +460,7 @@ void AndroidDeviceManager::startAvd(const ProjectExplorer::IDevice::Ptr &device) }); } -void AndroidDeviceManager::eraseAvd(const IDevice::Ptr &device) +void AndroidDeviceManager::eraseAvd(const IDevice::Ptr &device, QWidget *parent) { if (device.isNull()) return; @@ -432,7 +470,7 @@ void AndroidDeviceManager::eraseAvd(const IDevice::Ptr &device) const QString name = static_cast(device.data())->avdName(); const QString question = tr("Erase the Android AVD \"%1\"?\nThis cannot be undone.").arg(name); - if (!AndroidDeviceWidget::questionDialog(question)) + if (!AndroidDeviceWidget::questionDialog(question, parent)) return; qCDebug(androidDeviceLog) << QString("Erasing Android AVD \"%1\" from the system.").arg(name); @@ -460,12 +498,12 @@ void AndroidDeviceManager::handleAvdRemoved() } } -void AndroidDeviceManager::setEmulatorArguments() +void AndroidDeviceManager::setEmulatorArguments(QWidget *parent) { const QString helpUrl = "https://developer.android.com/studio/run/emulator-commandline#startup-options"; - QInputDialog dialog(Core::ICore::dialogParent()); + QInputDialog dialog(parent ? parent : Core::ICore::dialogParent()); dialog.setWindowTitle(tr("Emulator Command-line Startup Options")); dialog.setLabelText(tr("Emulator command-line startup options " "(Help Web Page):").arg(helpUrl)); diff --git a/src/plugins/android/androiddevice.h b/src/plugins/android/androiddevice.h index 5e6fabb43b6..31249e84808 100644 --- a/src/plugins/android/androiddevice.h +++ b/src/plugins/android/androiddevice.h @@ -46,6 +46,8 @@ class AndroidDevice final : public ProjectExplorer::IDevice public: AndroidDevice(); + void fromMap(const QVariantMap &map) override; + static IDevice::Ptr create(); static AndroidDeviceInfo androidDeviceInfoFromIDevice(const IDevice *dev); static void setAndroidDeviceInfoExtras(IDevice *dev, const AndroidDeviceInfo &info); @@ -74,6 +76,7 @@ public: AndroidConfig::OpenGl openGlStatus() const; private: + void addEmulatorActionsIfNotFound(); ProjectExplorer::IDevice::DeviceInfo deviceInformation() const override; ProjectExplorer::IDeviceWidget *createWidget() override; bool canAutoDetectPorts() const override; @@ -99,10 +102,10 @@ public: void updateDevicesList(); void updateDevicesListOnce(); - void startAvd(const ProjectExplorer::IDevice::Ptr &device); - void eraseAvd(const ProjectExplorer::IDevice::Ptr &device); + void startAvd(const ProjectExplorer::IDevice::Ptr &device, QWidget *parent = nullptr); + void eraseAvd(const ProjectExplorer::IDevice::Ptr &device, QWidget *parent = nullptr); - void setEmulatorArguments(); + void setEmulatorArguments(QWidget *parent = nullptr); private: AndroidDeviceManager(QObject *parent = nullptr); From b07e29eb79a3f2637a9b7aaca4dce566b4ace51b Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Mon, 4 Oct 2021 09:33:28 +0200 Subject: [PATCH 12/19] COIN: Build with Qt 6.2.0 final Change-Id: I91c7697b1fd7d8fa1a19f24bfc53efa23c415c65 Reviewed-by: Qt CI Bot Reviewed-by: Eike Ziller --- coin/instructions/common_environment.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coin/instructions/common_environment.yaml b/coin/instructions/common_environment.yaml index e8812895829..abd45f68d48 100644 --- a/coin/instructions/common_environment.yaml +++ b/coin/instructions/common_environment.yaml @@ -7,7 +7,7 @@ instructions: variableValue: "RelWithDebInfo" - type: EnvironmentVariable variableName: QTC_QT_BASE_URL - variableValue: "http://ci-files02-hki.intra.qt.io/packages/jenkins/archive/qt/6.2/6.2.0-rc-released/" + variableValue: "http://ci-files02-hki.intra.qt.io/packages/jenkins/archive/qt/6.2/6.2.0-final-released/" - type: EnvironmentVariable variableName: QTC_QT_MODULES variableValue: "qt5compat qtbase qtdeclarative qtimageformats qtquick3d qtquickcontrols2 qtquicktimeline qtserialport qtshadertools qtsvg qttools qttranslations" From a38a7033688ff00f0fd7e4a3049fb0c854de043b Mon Sep 17 00:00:00 2001 From: David Schulz Date: Fri, 1 Oct 2021 10:40:53 +0200 Subject: [PATCH 13/19] LanguageClient: Fix current document filter The DocumentSymbol is an hierarchical symbol format so we also need to take childrens into account when using the current document locator filter. Change-Id: I57f11e8f1781893613719102f87e5a2b2d0af941 Reviewed-by: Christian Kandeler --- src/plugins/languageclient/locatorfilter.cpp | 29 ++++++++++++++++---- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/src/plugins/languageclient/locatorfilter.cpp b/src/plugins/languageclient/locatorfilter.cpp index 5d2a583a27f..d5cac61d669 100644 --- a/src/plugins/languageclient/locatorfilter.cpp +++ b/src/plugins/languageclient/locatorfilter.cpp @@ -111,6 +111,15 @@ Core::LocatorFilterEntry generateLocatorEntry(const SymbolInformation &info, return entry; } +QList generateLocatorEntries(const SymbolInformation &info, + Core::ILocatorFilter *filter, + const QRegularExpression ®exp) +{ + if (!regexp.match(info.name()).hasMatch()) + return { generateLocatorEntry(info, filter) }; + return {}; +} + Core::LocatorFilterEntry generateLocatorEntry(const DocumentSymbol &info, Core::ILocatorFilter *filter) { @@ -125,6 +134,19 @@ Core::LocatorFilterEntry generateLocatorEntry(const DocumentSymbol &info, return entry; } +QList generateLocatorEntries(const DocumentSymbol &info, + Core::ILocatorFilter *filter, + const QRegularExpression ®exp) +{ + QList entries; + if (regexp.match(info.name()).hasMatch()) + entries << generateLocatorEntry(info, filter); + const QList children = info.children().value_or(QList()); + for (const DocumentSymbol &child : children) + entries << generateLocatorEntries(child, filter, regexp); + return entries; +} + template QList DocumentLocatorFilter::generateEntries(const QList &list, const QString &filter) @@ -138,11 +160,8 @@ QList DocumentLocatorFilter::generateEntries(const QLi if (!regexp.isValid()) return entries; - for (const T &item : list) { - QRegularExpressionMatch match = regexp.match(item.name()); - if (match.hasMatch()) - entries << generateLocatorEntry(item, this); - } + for (const T &item : list) + entries << generateLocatorEntries(item, this, regexp); return entries; } From ab16f2984b6661ea172d345b0ecc9a7ce33bf40c Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Mon, 4 Oct 2021 15:31:30 +0200 Subject: [PATCH 14/19] Work around QRegularExpression crashes on macOS with Rosetta MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Looks like the regular expression jitting is not reentrant when running under Rosetta for some reason. It was crashing when loading bigger subdir .pro files which regular expressions in it, like qtcreator.pro. Disable JIT if we run under Rosetta. Task-number: QTBUG-97085 Change-Id: Icbab1ca8f62afa9cc86045983e84087a7694b5ad Reviewed-by: Tor Arne Vestbø --- src/app/main.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/app/main.cpp b/src/app/main.cpp index d3946584e3c..c7270b3dec0 100644 --- a/src/app/main.cpp +++ b/src/app/main.cpp @@ -492,6 +492,11 @@ int main(int argc, char **argv) QApplication::setAttribute(Qt::AA_DontUseNativeMenuBar); } + if (Utils::HostOsInfo::isRunningUnderRosetta()) { + // work around QTBUG-97085: QRegularExpression jitting is not reentrant under Rosetta + qputenv("QT_ENABLE_REGEXP_JIT", "0"); + } + Utils::TemporaryDirectory::setMasterTemporaryDirectory(QDir::tempPath() + "/" + Core::Constants::IDE_CASED_ID + "-XXXXXX"); #ifdef Q_OS_MACOS From 2fcd764d56ab3e997c51966c000069b78bbf5e40 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Thu, 30 Sep 2021 13:19:50 +0200 Subject: [PATCH 15/19] ClangCodeModel: Add clangd-based document locator filter Change-Id: I2811be80e740cacf57eccd19e47560af746ad0c1 Reviewed-by: Qt CI Bot Reviewed-by: David Schulz --- src/plugins/clangcodemodel/CMakeLists.txt | 2 +- src/plugins/clangcodemodel/clangcodemodel.pro | 4 +- src/plugins/clangcodemodel/clangcodemodel.qbs | 4 +- src/plugins/clangcodemodel/clangdclient.cpp | 50 ++++----- src/plugins/clangcodemodel/clangdclient.h | 3 + ...orfilters.cpp => clangdlocatorfilters.cpp} | 105 +++++++++++++++++- ...ocatorfilters.h => clangdlocatorfilters.h} | 17 +++ .../clangmodelmanagersupport.cpp | 6 +- .../languageclient/languageclientutils.h | 2 +- src/plugins/languageclient/locatorfilter.cpp | 51 +++++---- src/plugins/languageclient/locatorfilter.h | 19 +++- 11 files changed, 207 insertions(+), 56 deletions(-) rename src/plugins/clangcodemodel/{clanggloballocatorfilters.cpp => clangdlocatorfilters.cpp} (67%) rename src/plugins/clangcodemodel/{clanggloballocatorfilters.h => clangdlocatorfilters.h} (79%) diff --git a/src/plugins/clangcodemodel/CMakeLists.txt b/src/plugins/clangcodemodel/CMakeLists.txt index 9336c29d830..ace1b99575c 100644 --- a/src/plugins/clangcodemodel/CMakeLists.txt +++ b/src/plugins/clangcodemodel/CMakeLists.txt @@ -36,7 +36,7 @@ add_qtc_plugin(ClangCodeModel clangfixitoperationsextractor.cpp clangfixitoperationsextractor.h clangfollowsymbol.cpp clangfollowsymbol.h clangfunctionhintmodel.cpp clangfunctionhintmodel.h - clanggloballocatorfilters.cpp clanggloballocatorfilters.h + clangdlocatorfilters.cpp clangdlocatorfilters.h clanghighlightingresultreporter.cpp clanghighlightingresultreporter.h clanghoverhandler.cpp clanghoverhandler.h clangisdiagnosticrelatedtolocation.h diff --git a/src/plugins/clangcodemodel/clangcodemodel.pro b/src/plugins/clangcodemodel/clangcodemodel.pro index 57eeb22d870..5675ea9d57e 100644 --- a/src/plugins/clangcodemodel/clangcodemodel.pro +++ b/src/plugins/clangcodemodel/clangcodemodel.pro @@ -43,7 +43,7 @@ SOURCES += \ clangoverviewmodel.cpp \ clangdclient.cpp \ clangdquickfixfactory.cpp \ - clanggloballocatorfilters.cpp \ + clangdlocatorfilters.cpp \ HEADERS += \ clangactivationsequencecontextprocessor.h \ @@ -85,7 +85,7 @@ HEADERS += \ clangoverviewmodel.h \ clangdclient.h \ clangdquickfixfactory.h \ - clanggloballocatorfilters.h \ + clangdlocatorfilters.h \ FORMS += clangprojectsettingswidget.ui diff --git a/src/plugins/clangcodemodel/clangcodemodel.qbs b/src/plugins/clangcodemodel/clangcodemodel.qbs index 42c3e4df9d1..7b6689ad45f 100644 --- a/src/plugins/clangcodemodel/clangcodemodel.qbs +++ b/src/plugins/clangcodemodel/clangcodemodel.qbs @@ -64,6 +64,8 @@ QtcPlugin { "clangdiagnosticmanager.h", "clangdiagnostictooltipwidget.cpp", "clangdiagnostictooltipwidget.h", + "clangdlocatorfilters.cpp", + "clangdlocatorfilters.h", "clangdquickfixfactory.cpp", "clangdquickfixfactory.h", "clangeditordocumentparser.cpp", @@ -78,8 +80,6 @@ QtcPlugin { "clangfollowsymbol.h", "clangfunctionhintmodel.cpp", "clangfunctionhintmodel.h", - "clanggloballocatorfilters.cpp", - "clanggloballocatorfilters.h", "clanghighlightingresultreporter.cpp", "clanghighlightingresultreporter.h", "clanghoverhandler.cpp", diff --git a/src/plugins/clangcodemodel/clangdclient.cpp b/src/plugins/clangcodemodel/clangdclient.cpp index 7a6c1045ec3..fea5314001e 100644 --- a/src/plugins/clangcodemodel/clangdclient.cpp +++ b/src/plugins/clangcodemodel/clangdclient.cpp @@ -978,31 +978,7 @@ ClangdClient::ClangdClient(Project *project, const Utils::FilePath &jsonDbDir) }; const auto hideDiagsHandler = []{ ClangDiagnosticManager::clearTaskHubIssues(); }; setDiagnosticsHandlers(textMarkCreator, hideDiagsHandler); - - static const auto symbolStringifier = [](SymbolKind kind, const QString &name, - const QString &detail) -> QString - { - switch (kind) { - case LanguageServerProtocol::SymbolKind::Constructor: - return name + detail; - case LanguageServerProtocol::SymbolKind::Method: - case LanguageServerProtocol::SymbolKind::Function: { - const int parenOffset = detail.indexOf(" ("); - if (parenOffset == -1) - return name; - return name + detail.mid(parenOffset + 1) + " -> " + detail.mid(0, parenOffset); - } - case LanguageServerProtocol::SymbolKind::Variable: - case LanguageServerProtocol::SymbolKind::Field: - case LanguageServerProtocol::SymbolKind::Constant: - if (detail.isEmpty()) - return name; - return name + " -> " + detail; - default: - return name; - } - }; - setSymbolStringifier(symbolStringifier); + setSymbolStringifier(displayNameFromDocumentSymbol); setSemanticTokensHandler([this](TextDocument *doc, const QList &tokens) { d->handleSemanticTokens(doc, tokens); }); @@ -1236,6 +1212,30 @@ bool ClangdClient::testingEnabled() const return d->isTesting; } +QString ClangdClient::displayNameFromDocumentSymbol(SymbolKind kind, const QString &name, + const QString &detail) +{ + switch (kind) { + case SymbolKind::Constructor: + return name + detail; + case SymbolKind::Method: + case LanguageServerProtocol::SymbolKind::Function: { + const int parenOffset = detail.indexOf(" ("); + if (parenOffset == -1) + return name; + return name + detail.mid(parenOffset + 1) + " -> " + detail.mid(0, parenOffset); + } + case SymbolKind::Variable: + case SymbolKind::Field: + case SymbolKind::Constant: + if (detail.isEmpty()) + return name; + return name + " -> " + detail; + default: + return name; + } +} + void ClangdClient::Private::handleFindUsagesResult(quint64 key, const QList &locations) { const auto refData = runningFindUsages.find(key); diff --git a/src/plugins/clangcodemodel/clangdclient.h b/src/plugins/clangcodemodel/clangdclient.h index bec77b9261e..03675516616 100644 --- a/src/plugins/clangcodemodel/clangdclient.h +++ b/src/plugins/clangcodemodel/clangdclient.h @@ -79,6 +79,9 @@ public: void enableTesting(); bool testingEnabled() const; + static QString displayNameFromDocumentSymbol(LanguageServerProtocol::SymbolKind kind, + const QString &name, const QString &detail); + signals: void indexingFinished(); void foundReferences(const QList &items); diff --git a/src/plugins/clangcodemodel/clanggloballocatorfilters.cpp b/src/plugins/clangcodemodel/clangdlocatorfilters.cpp similarity index 67% rename from src/plugins/clangcodemodel/clanggloballocatorfilters.cpp rename to src/plugins/clangcodemodel/clangdlocatorfilters.cpp index 4bc23a974a1..cafd7633d7d 100644 --- a/src/plugins/clangcodemodel/clanggloballocatorfilters.cpp +++ b/src/plugins/clangcodemodel/clangdlocatorfilters.cpp @@ -23,15 +23,17 @@ ** ****************************************************************************/ -#include "clanggloballocatorfilters.h" +#include "clangdlocatorfilters.h" #include "clangdclient.h" #include "clangmodelmanagersupport.h" +#include "clangcurrentdocumentfilter.h" #include #include #include #include +#include #include #include #include @@ -39,6 +41,8 @@ #include #include +using namespace LanguageServerProtocol; + namespace ClangCodeModel { namespace Internal { @@ -222,5 +226,104 @@ ClangFunctionsFilter::ClangFunctionsFilter() setDefaultIncludedByDefault(false); } +class CppCurrentDocumentFilter : public ClangCurrentDocumentFilter +{ +public: + CppCurrentDocumentFilter() + { + setId({}); + setDisplayName({}); + setDefaultShortcutString({}); + setEnabled(false); + setHidden(true); + } +}; + +class LspCurrentDocumentFilter : public LanguageClient::DocumentLocatorFilter +{ +public: + LspCurrentDocumentFilter() + { + setId({}); + setDisplayName({}); + setDefaultShortcutString({}); + setEnabled(false); + setHidden(true); + forceUse(); + } + +private: + Core::LocatorFilterEntry generateLocatorEntry(const DocumentSymbol &info, + const Core::LocatorFilterEntry &parent) override + { + Core::LocatorFilterEntry entry; + entry.filter = this; + entry.displayName = ClangdClient::displayNameFromDocumentSymbol( + static_cast(info.kind()), info.name(), + info.detail().value_or(QString())); + const Position &pos = info.range().start(); + entry.internalData = QVariant::fromValue(Utils::LineColumn(pos.line(), pos.character())); + entry.extraInfo = parent.extraInfo; + if (!entry.extraInfo.isEmpty()) + entry.extraInfo.append("::"); + entry.extraInfo.append(parent.displayName); + + // TODO: Can we extend clangd to send visibility information? + entry.displayIcon = LanguageClient::symbolIcon(info.kind()); + + return entry; + } +}; + +class ClangdCurrentDocumentFilter::Private +{ +public: + CppCurrentDocumentFilter cppFilter; + LspCurrentDocumentFilter lspFilter; + Core::ILocatorFilter *activeFilter = nullptr; +}; + + +ClangdCurrentDocumentFilter::ClangdCurrentDocumentFilter() : d(new Private) +{ + setId(CppEditor::Constants::CURRENT_DOCUMENT_FILTER_ID); + setDisplayName(CppEditor::Constants::CURRENT_DOCUMENT_FILTER_DISPLAY_NAME); + setDefaultShortcutString("."); + setPriority(High); + setDefaultIncludedByDefault(false); + setEnabled(false); + connect(Core::EditorManager::instance(), &Core::EditorManager::currentEditorChanged, + this, [this](const Core::IEditor *editor) { setEnabled(editor); }); +} + +ClangdCurrentDocumentFilter::~ClangdCurrentDocumentFilter() { delete d; } + +void ClangdCurrentDocumentFilter::prepareSearch(const QString &entry) +{ + const auto doc = TextEditor::TextDocument::currentTextDocument(); + QTC_ASSERT(doc, return); + if (const ClangdClient * const client = ClangModelManagerSupport::instance() + ->clientForFile(doc->filePath()); client && client->reachable()) { + d->activeFilter = &d->lspFilter; + } else { + d->activeFilter = &d->cppFilter; + } + d->activeFilter->prepareSearch(entry); +} + +QList ClangdCurrentDocumentFilter::matchesFor( + QFutureInterface &future, const QString &entry) +{ + QTC_ASSERT(d->activeFilter, return {}); + return d->activeFilter->matchesFor(future, entry); +} + +void ClangdCurrentDocumentFilter::accept(Core::LocatorFilterEntry selection, QString *newText, + int *selectionStart, int *selectionLength) const +{ + QTC_ASSERT(d->activeFilter, return); + d->activeFilter->accept(selection, newText, selectionStart, selectionLength); +} + } // namespace Internal } // namespace ClangCodeModel diff --git a/src/plugins/clangcodemodel/clanggloballocatorfilters.h b/src/plugins/clangcodemodel/clangdlocatorfilters.h similarity index 79% rename from src/plugins/clangcodemodel/clanggloballocatorfilters.h rename to src/plugins/clangcodemodel/clangdlocatorfilters.h index e01ac4b3568..28341a6a573 100644 --- a/src/plugins/clangcodemodel/clanggloballocatorfilters.h +++ b/src/plugins/clangcodemodel/clangdlocatorfilters.h @@ -60,5 +60,22 @@ public: ClangFunctionsFilter(); }; +class ClangdCurrentDocumentFilter : public Core::ILocatorFilter +{ +public: + ClangdCurrentDocumentFilter(); + ~ClangdCurrentDocumentFilter() override; + +private: + void prepareSearch(const QString &entry) override; + QList matchesFor(QFutureInterface &future, + const QString &entry) override; + void accept(Core::LocatorFilterEntry selection, QString *newText, + int *selectionStart, int *selectionLength) const override; + + class Private; + Private * const d; +}; + } // namespace Internal } // namespace ClangCodeModel diff --git a/src/plugins/clangcodemodel/clangmodelmanagersupport.cpp b/src/plugins/clangcodemodel/clangmodelmanagersupport.cpp index a2dca2aab35..52be361305a 100644 --- a/src/plugins/clangcodemodel/clangmodelmanagersupport.cpp +++ b/src/plugins/clangcodemodel/clangmodelmanagersupport.cpp @@ -26,12 +26,11 @@ #include "clangmodelmanagersupport.h" #include "clangconstants.h" -#include "clangcurrentdocumentfilter.h" #include "clangdclient.h" #include "clangdquickfixfactory.h" #include "clangeditordocumentprocessor.h" #include "clangfollowsymbol.h" -#include "clanggloballocatorfilters.h" +#include "clangdlocatorfilters.h" #include "clanghoverhandler.h" #include "clangoverviewmodel.h" #include "clangprojectsettings.h" @@ -113,8 +112,7 @@ ClangModelManagerSupport::ClangModelManagerSupport() m_instance = this; watchForExternalChanges(); - CppEditor::CppModelManager::instance()->setCurrentDocumentFilter( - std::make_unique()); + cppModelManager()->setCurrentDocumentFilter(std::make_unique()); cppModelManager()->setLocatorFilter(std::make_unique()); cppModelManager()->setClassesFilter(std::make_unique()); cppModelManager()->setFunctionsFilter(std::make_unique()); diff --git a/src/plugins/languageclient/languageclientutils.h b/src/plugins/languageclient/languageclientutils.h index d73e052590d..c8120766077 100644 --- a/src/plugins/languageclient/languageclientutils.h +++ b/src/plugins/languageclient/languageclientutils.h @@ -61,6 +61,6 @@ updateCodeActionRefactoringMarker(Client *client, const LanguageServerProtocol::CodeAction &action, const LanguageServerProtocol::DocumentUri &uri); void updateEditorToolBar(Core::IEditor *editor); -const QIcon symbolIcon(int type); +const QIcon LANGUAGECLIENT_EXPORT symbolIcon(int type); } // namespace LanguageClient diff --git a/src/plugins/languageclient/locatorfilter.cpp b/src/plugins/languageclient/locatorfilter.cpp index d5cac61d669..11588cc2ad2 100644 --- a/src/plugins/languageclient/locatorfilter.cpp +++ b/src/plugins/languageclient/locatorfilter.cpp @@ -63,8 +63,8 @@ void DocumentLocatorFilter::updateCurrentClient() TextEditor::TextDocument *document = TextEditor::TextDocument::currentTextDocument(); if (Client *client = LanguageClientManager::clientForDocument(document); - client && client->locatorsEnabled()) { - setEnabled(true); + client && (client->locatorsEnabled() || m_forced)) { + setEnabled(!m_forced); if (m_symbolCache != client->documentSymbolCache()) { disconnect(m_updateSymbolsConnection); m_symbolCache = client->documentSymbolCache(); @@ -98,8 +98,8 @@ void DocumentLocatorFilter::resetSymbols() m_currentSymbols.reset(); } -Core::LocatorFilterEntry generateLocatorEntry(const SymbolInformation &info, - Core::ILocatorFilter *filter) +static Core::LocatorFilterEntry generateLocatorEntry(const SymbolInformation &info, + Core::ILocatorFilter *filter) { Core::LocatorFilterEntry entry; entry.filter = filter; @@ -109,22 +109,31 @@ Core::LocatorFilterEntry generateLocatorEntry(const SymbolInformation &info, entry.displayIcon = symbolIcon(info.kind()); entry.internalData = QVariant::fromValue(info.location().toLink()); return entry; + } -QList generateLocatorEntries(const SymbolInformation &info, - Core::ILocatorFilter *filter, - const QRegularExpression ®exp) +Core::LocatorFilterEntry DocumentLocatorFilter::generateLocatorEntry(const SymbolInformation &info) { - if (!regexp.match(info.name()).hasMatch()) - return { generateLocatorEntry(info, filter) }; + return LanguageClient::generateLocatorEntry(info, this); +} + +QList DocumentLocatorFilter::generateLocatorEntries( + const SymbolInformation &info, const QRegularExpression ®exp, + const Core::LocatorFilterEntry &parent) +{ + Q_UNUSED(parent) + if (regexp.match(info.name()).hasMatch()) + return {generateLocatorEntry(info)}; return {}; } -Core::LocatorFilterEntry generateLocatorEntry(const DocumentSymbol &info, - Core::ILocatorFilter *filter) +Core::LocatorFilterEntry DocumentLocatorFilter::generateLocatorEntry( + const DocumentSymbol &info, + const Core::LocatorFilterEntry &parent) { + Q_UNUSED(parent) Core::LocatorFilterEntry entry; - entry.filter = filter; + entry.filter = this; entry.displayName = info.name(); if (Utils::optional detail = info.detail()) entry.extraInfo = detail.value_or(QString()); @@ -134,16 +143,20 @@ Core::LocatorFilterEntry generateLocatorEntry(const DocumentSymbol &info, return entry; } -QList generateLocatorEntries(const DocumentSymbol &info, - Core::ILocatorFilter *filter, - const QRegularExpression ®exp) +QList DocumentLocatorFilter::generateLocatorEntries( + const DocumentSymbol &info, const QRegularExpression ®exp, + const Core::LocatorFilterEntry &parent) { QList entries; - if (regexp.match(info.name()).hasMatch()) - entries << generateLocatorEntry(info, filter); const QList children = info.children().value_or(QList()); + const bool hasMatch = regexp.match(info.name()).hasMatch(); + Core::LocatorFilterEntry entry; + if (hasMatch || !children.isEmpty()) + entry = generateLocatorEntry(info, parent); + if (hasMatch) + entries << entry; for (const DocumentSymbol &child : children) - entries << generateLocatorEntries(child, filter, regexp); + entries << generateLocatorEntries(child, regexp, entry); return entries; } @@ -161,7 +174,7 @@ QList DocumentLocatorFilter::generateEntries(const QLi return entries; for (const T &item : list) - entries << generateLocatorEntries(item, this, regexp); + entries << generateLocatorEntries(item, regexp, {}); return entries; } diff --git a/src/plugins/languageclient/locatorfilter.h b/src/plugins/languageclient/locatorfilter.h index 6ef079ec45f..ebc35de57a7 100644 --- a/src/plugins/languageclient/locatorfilter.h +++ b/src/plugins/languageclient/locatorfilter.h @@ -26,6 +26,7 @@ #pragma once #include "client.h" +#include "languageclient_global.h" #include #include @@ -38,7 +39,7 @@ namespace Core { class IEditor; } namespace LanguageClient { -class DocumentLocatorFilter : public Core::ILocatorFilter +class LANGUAGECLIENT_EXPORT DocumentLocatorFilter : public Core::ILocatorFilter { Q_OBJECT public: @@ -57,6 +58,8 @@ signals: void symbolsUpToDate(QPrivateSignal); protected: + void forceUse() { m_forced = true; } + QPointer m_symbolCache; LanguageServerProtocol::DocumentUri m_currentUri; @@ -67,11 +70,25 @@ private: template QList generateEntries(const QList &list, const QString &filter); + QList generateLocatorEntries( + const LanguageServerProtocol::SymbolInformation &info, + const QRegularExpression ®exp, + const Core::LocatorFilterEntry &parent); + QList generateLocatorEntries( + const LanguageServerProtocol::DocumentSymbol &info, + const QRegularExpression ®exp, + const Core::LocatorFilterEntry &parent); + virtual Core::LocatorFilterEntry generateLocatorEntry( + const LanguageServerProtocol::DocumentSymbol &info, + const Core::LocatorFilterEntry &parent); + virtual Core::LocatorFilterEntry generateLocatorEntry( + const LanguageServerProtocol::SymbolInformation &info); QMutex m_mutex; QMetaObject::Connection m_updateSymbolsConnection; QMetaObject::Connection m_resetSymbolsConnection; Utils::optional m_currentSymbols; + bool m_forced = false; }; class LANGUAGECLIENT_EXPORT WorkspaceLocatorFilter : public Core::ILocatorFilter From 60fca0596adfc98af9e3ef4e657d90eec4af9486 Mon Sep 17 00:00:00 2001 From: Cristian Adam Date: Fri, 1 Oct 2021 16:32:47 +0200 Subject: [PATCH 16/19] ClangTools: Add header files to the list of files to be analyzed Now that the CMakeProjectManager is reporting the header files as source files, it makes sense to analyze the headers as source files. Note that the header type needs to change to source type since the "cxx-header" argument that will be send if the Kind is CxxHeader is handled by the compiler as an argument to produce a precompiled header, which is not what we want. Fixes: QTCREATORBUG-21452 Fixes: QTCREATORBUG-25644 Fixes: QTCREATORBUG-25782 Change-Id: Icd674962ff8312b8fbfa46491938eb721edd761d Reviewed-by: Christian Kandeler --- src/plugins/clangtools/clangtool.cpp | 7 +++-- .../clangtools/documentclangtoolrunner.cpp | 5 +-- src/plugins/cppeditor/cppprojectfile.cpp | 31 +++++++++++++++++++ src/plugins/cppeditor/cppprojectfile.h | 3 ++ 4 files changed, 42 insertions(+), 4 deletions(-) diff --git a/src/plugins/clangtools/clangtool.cpp b/src/plugins/clangtools/clangtool.cpp index 2825c643e4d..c8de027bce6 100644 --- a/src/plugins/clangtools/clangtool.cpp +++ b/src/plugins/clangtools/clangtool.cpp @@ -340,9 +340,12 @@ static FileInfos sortedFileInfos(const QVector if (file.path == CppEditor::CppModelManager::configurationFileName()) continue; - if (file.active && CppEditor::ProjectFile::isSource(file.kind)) { + if (file.active + && (CppEditor::ProjectFile::isSource(file.kind) + || CppEditor::ProjectFile::isHeader(file.kind))) { + ProjectFile::Kind sourceKind = CppEditor::ProjectFile::sourceKind(file.kind); fileInfos.emplace_back(Utils::FilePath::fromString(file.path), - file.kind, + sourceKind, projectPart); } } diff --git a/src/plugins/clangtools/documentclangtoolrunner.cpp b/src/plugins/clangtools/documentclangtoolrunner.cpp index 5ec59339201..d62b882d4a2 100644 --- a/src/plugins/clangtools/documentclangtoolrunner.cpp +++ b/src/plugins/clangtools/documentclangtoolrunner.cpp @@ -160,11 +160,12 @@ static FileInfo getFileInfo(const FilePath &file, Project *project) if (!projectFile.active) continue; // found the best candidate, early return + ProjectFile::Kind sourceKind = ProjectFile::sourceKind(projectFile.kind); if (projectPart->buildTargetType != BuildTargetType::Unknown) - return FileInfo(projectFilePath, projectFile.kind, projectPart); + return FileInfo(projectFilePath, sourceKind, projectPart); // found something but keep looking for better candidates if (candidate.projectPart.isNull()) - candidate = FileInfo(projectFilePath, projectFile.kind, projectPart); + candidate = FileInfo(projectFilePath, sourceKind, projectPart); } } diff --git a/src/plugins/cppeditor/cppprojectfile.cpp b/src/plugins/cppeditor/cppprojectfile.cpp index 382a0b7c056..fa3bf8c0238 100644 --- a/src/plugins/cppeditor/cppprojectfile.cpp +++ b/src/plugins/cppeditor/cppprojectfile.cpp @@ -87,6 +87,37 @@ bool ProjectFile::isAmbiguousHeader(const QString &filePath) return filePath.endsWith(".h"); } +ProjectFile::Kind ProjectFile::sourceForHeaderKind(ProjectFile::Kind kind) +{ + ProjectFile::Kind sourceKind; + switch (kind) { + case ProjectFile::CHeader: + sourceKind = ProjectFile::CSource; + break; + case ProjectFile::ObjCHeader: + sourceKind = ProjectFile::ObjCSource; + break; + case ProjectFile::ObjCXXHeader: + sourceKind = ProjectFile::ObjCXXSource; + break; + case ProjectFile::Unsupported: // no file extension, e.g. stl headers + case ProjectFile::AmbiguousHeader: + case ProjectFile::CXXHeader: + default: + sourceKind = ProjectFile::CXXSource; + } + + return sourceKind; +} + +ProjectFile::Kind ProjectFile::sourceKind(Kind kind) +{ + ProjectFile::Kind sourceKind = kind; + if (ProjectFile::isHeader(kind)) + sourceKind = ProjectFile::sourceForHeaderKind(kind); + return sourceKind; +} + bool ProjectFile::isHeader(ProjectFile::Kind kind) { switch (kind) { diff --git a/src/plugins/cppeditor/cppprojectfile.h b/src/plugins/cppeditor/cppprojectfile.h index f86c668d5ff..078b93cce9e 100644 --- a/src/plugins/cppeditor/cppprojectfile.h +++ b/src/plugins/cppeditor/cppprojectfile.h @@ -53,6 +53,9 @@ public: static Kind classifyByMimeType(const QString &mt); static Kind classify(const QString &filePath); + static Kind sourceForHeaderKind(Kind kind); + static Kind sourceKind(Kind kind); + static bool isSource(Kind kind); static bool isHeader(Kind kind); static bool isC(Kind kind); From 068c4e9b7b9de9cac4136f613fdfa7b8e9020d3b Mon Sep 17 00:00:00 2001 From: Joerg Bornemann Date: Fri, 1 Oct 2021 12:47:33 +0200 Subject: [PATCH 17/19] CMake: Work around Qt6::ATSPI2_nolink issue This works around QTBUG-97023. When building the Qt Creator super repo against the installer-provided Qt 6.2.0 on Linux, Qt6Gui creates an imported library target named Qt6::ATSPI2_nolink. This one must also be promoted to global scope. Otherwise, subsequent find_package(Qt6 COMPONENTS Gui) calls fail with Some (but not all) targets in this export set were already defined. Targets Defined: Qt6::Gui;Qt6::GuiPrivate Targets not yet defined: Qt6::ATSPI2_nolink Add Qt6::ATSPI2_nolink to the components that are promoted and aliased. Change-Id: I39c46e8f1c831e2fad2aa4e928b785da08a0407c Reviewed-by: Eike Ziller --- cmake/FindQt5.cmake | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cmake/FindQt5.cmake b/cmake/FindQt5.cmake index 4fde452733d..1931bf019c2 100644 --- a/cmake/FindQt5.cmake +++ b/cmake/FindQt5.cmake @@ -57,7 +57,8 @@ else() find_package(Qt6 CONFIG ${__arguments} ${Qt5_FIND_COMPONENTS}) endif() -foreach(comp IN LISTS Qt5_FIND_COMPONENTS) +set(__additional_imported_components ATSPI2_nolink) # Work around QTBUG-97023 +foreach(comp IN LISTS Qt5_FIND_COMPONENTS __additional_imported_components) if(TARGET Qt6::${comp}) if (NOT TARGET Qt5::${comp}) set_property(TARGET Qt6::${comp} PROPERTY IMPORTED_GLOBAL TRUE) From 111ca0964eafbecc77bbac2b71ccd82c00d82c40 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Fri, 1 Oct 2021 14:37:27 +0200 Subject: [PATCH 18/19] ClangCodeModel: Adapt test to upstream bugfix See https://reviews.llvm.org/D110825. Change-Id: I829a20a08cd0afd8d225e5c5e6d0aa2cf3b365d6 Reviewed-by: David Schulz --- src/plugins/clangcodemodel/test/clangdtests.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/plugins/clangcodemodel/test/clangdtests.cpp b/src/plugins/clangcodemodel/test/clangdtests.cpp index 20938701157..ac7ec7e2b4f 100644 --- a/src/plugins/clangcodemodel/test/clangdtests.cpp +++ b/src/plugins/clangcodemodel/test/clangdtests.cpp @@ -393,7 +393,8 @@ void ClangdTestFollowSymbol::test() timer.stop(); QCOMPARE(actualLink.targetFilePath, filePath(targetFile)); - QEXPECT_FAIL("union member ref", "https://github.com/clangd/clangd/issues/877", Abort); + if (client()->versionNumber() < QVersionNumber(14)) + QEXPECT_FAIL("union member ref", "https://github.com/clangd/clangd/issues/877", Abort); QCOMPARE(actualLink.targetLine, targetLine); QCOMPARE(actualLink.targetColumn + 1, targetColumn); } From 530a4cc17db0efaa599657a244453b6be7d5ac99 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Tue, 5 Oct 2021 06:49:22 +0200 Subject: [PATCH 19/19] ProParser: Fix build Amends 2f8b541fe557. Change-Id: I596d846e2d143e71f217e01b5c820ceb7a3ccada Reviewed-by: Jarek Kobus Reviewed-by: Eike Ziller --- src/shared/proparser/qmakeparser.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/shared/proparser/qmakeparser.cpp b/src/shared/proparser/qmakeparser.cpp index 12233ae19c5..043faf8d00c 100644 --- a/src/shared/proparser/qmakeparser.cpp +++ b/src/shared/proparser/qmakeparser.cpp @@ -72,8 +72,8 @@ void ProFileCache::discardFile(int id) #endif auto it = parsed_files.find(id); if (it != parsed_files.end()) { -#ifdef PROPARSER_THREAD_SAFE Entry &entry = it->second; +#ifdef PROPARSER_THREAD_SAFE Entry::Locker *locker = entry.locker; if (locker) { // Either it's still being prepared or it's already done but someone // else started waiting for it when it wasn't ready yet @@ -118,9 +118,9 @@ void ProFileCache::discardFiles(const QString &prefix, QMakeVfs *vfs) // Note: this is empty for virtual files from other VFSes. const QString fn = vfs->fileNameForId(id); if (fn.startsWith(prefix)) { -#ifdef PROPARSER_THREAD_SAFE bool continueFromScratch = false; Entry &entry = it->second; +#ifdef PROPARSER_THREAD_SAFE Entry::Locker *locker = entry.locker; if (locker) { // Either it's still being prepared or it's already done but someone // else started waiting for it when it wasn't ready yet