diff --git a/dist/changes-4.3.1.md b/dist/changes-4.3.1.md index e8412e02597..018f3a461d8 100644 --- a/dist/changes-4.3.1.md +++ b/dist/changes-4.3.1.md @@ -7,25 +7,108 @@ you can check out from the public Git repository. For example: git clone git://code.qt.io/qt-creator/qt-creator.git git log --cherry-pick --pretty=oneline v4.3.0..v4.3.1 +General + +* Fixed that wizards overwrote existing files even when told not to do so + (QTCREATORBUG-18284) + +Editing + +* Fixed memory leak in code completion (QTCREATORBUG-18326) + +All Projects + +* Fixed that links in `Application Output` stopped working after application + stops (QTCREATORBUG-18134) +* Fixed that `Application Output` was no longer editable (QTCREATORBUG-18418) + +QMake Projects + +* Fixed `Add Library` (QTCREATORBUG-18263) + +CMake Projects + +* Fixed crash when restoring session with multiple CMake projects + (QTCREATORBUG-18258) +* Fixed that `test` target was missing (QTCREATORBUG-18323) +* Fixed that `STATIC` and `INTERNAL` variables were shown in project + configuration +* Fixed that CMake `message`s were not shown in `Issues` pane + (QTCREATORBUG-18318) +* Fixed issues with CMake variables that contain `//` or `#` + (QTCREATORBUG-18385) +* Fixed that deployment information could contain empty items + (QTCREATORBUG-18406) +* Fixed that targets were duplicated when importing project (QTCREATORBUG-18409) +* Fixed that building application failed first time and after build error + when using CMake < 3.7 (QTCREATORBUG-18290, QTCREATORBUG-18382) + +Qbs Projects + +* Fixed crash when renaming files (QTCREATORBUG-18440) + +Autotools Projects + +* Fixed regressions in project tree (QTCREATORBUG-18371) + +C++ Support + +* Fixed crash when requesting refactoring operations on invalid code + (QTCREATORBUG-18355) + +QML Support + +* Fixed crash when changing kit environment (QTCREATORBUG-18335) + +Valgrind + +* Fixed crash when running analyzer for iOS and Android (QTCREATORBUG-18254) + Version Control Systems +* Fixed filtering of untracked files in commit editor + when multiple projects are open * Git * Fixed that ref names were missing for `Show` +* Mercurial + * Fixed extra options in diff and log (QTCREATORBUG-17987) * Gerrit * Fixed parsing output from Gerrit 2.14 +Test Integration + +* Fixed that changing QML file triggered full rescan for tests + (QTCREATORBUG-18315) +* Fixed issues with multiple build targets + (QTCREATORBUG-17783, QTCREATORBUG-18357) + Platform Specific Windows * Fixed checking whether example should be copied to writable location (QTCREATORBUG-18184) +* Fixed issues with MSVC2017 and CMake (QTCREATORBUG-17925) + +macOS + +* Fixed performance issue on HiDPI displays (QTBUG-61384) WinRT * Fixed running MSVC 2017 based applications (QTCREATORBUG-18288) +Android + +* Fixed detection of MIPS64 toolchains +* Fixed that 64-bit ABIs were missing in AVD creation dialog + iOS +* Fixed running on iOS 10.3 devices (QTCREATORBUG-18380) * Fixed crash that could occur at startup while device is connected (QTCREATORBUG-18226) + +BareMetal + +* Fixed crash on shutdown diff --git a/src/plugins/autotest/gtest/gtesttreeitem.cpp b/src/plugins/autotest/gtest/gtesttreeitem.cpp index 5550e576429..3437ffd7eaa 100644 --- a/src/plugins/autotest/gtest/gtesttreeitem.cpp +++ b/src/plugins/autotest/gtest/gtesttreeitem.cpp @@ -286,5 +286,17 @@ QString GTestTreeItem::nameSuffix() const return suffix; } +QSet GTestTreeItem::internalTargets() const +{ + QSet result; + const auto cppMM = CppTools::CppModelManager::instance(); + const auto projectInfo = cppMM->projectInfo(ProjectExplorer::SessionManager::startupProject()); + for (const CppTools::ProjectPart::Ptr projectPart : projectInfo.projectParts()) { + if (projectPart->projectFile == proFile()) + result.insert(projectPart->buildSystemTarget); + } + return result; +} + } // namespace Internal } // namespace Autotest diff --git a/src/plugins/autotest/gtest/gtesttreeitem.h b/src/plugins/autotest/gtest/gtesttreeitem.h index f20264e17e3..b732840ce81 100644 --- a/src/plugins/autotest/gtest/gtesttreeitem.h +++ b/src/plugins/autotest/gtest/gtesttreeitem.h @@ -66,6 +66,7 @@ public: GTestTreeItem::TestStates state, const QString &proFile) const; QString nameSuffix() const; + QSet internalTargets() const override; private: bool modifyTestSetContent(const GTestParseResult *result); diff --git a/src/plugins/autotest/testconfiguration.cpp b/src/plugins/autotest/testconfiguration.cpp index 52723a5b642..8440348d7d2 100644 --- a/src/plugins/autotest/testconfiguration.cpp +++ b/src/plugins/autotest/testconfiguration.cpp @@ -86,7 +86,12 @@ void TestConfiguration::completeTestInformation(int runMode) && targWithProjectFile.at(1).startsWith(bti.projectFilePath.toString()); }); }); - const Utils::FileName executable = targetInfo.targetFilePath; // empty if BTI is default created + QString executable = targetInfo.targetFilePath.toString(); // empty if BTI default created + if (Utils::HostOsInfo::isWindowsHost() && !executable.isEmpty() + && !executable.toLower().endsWith(".exe")) { + executable = Utils::HostOsInfo::withExecutableSuffix(executable); + } + for (RunConfiguration *runConfig : target->runConfigurations()) { if (!isLocal(runConfig)) // TODO add device support continue; @@ -99,13 +104,18 @@ void TestConfiguration::completeTestInformation(int runMode) StandardRunnable stdRunnable = runnable.as(); // TODO this might pick up the wrong executable m_executableFile = stdRunnable.executable; + if (Utils::HostOsInfo::isWindowsHost() && !m_executableFile.isEmpty() + && !m_executableFile.toLower().endsWith(".exe")) { + m_executableFile = Utils::HostOsInfo::withExecutableSuffix(m_executableFile); + } m_displayName = runConfig->displayName(); m_workingDir = Utils::FileUtils::normalizePathName(stdRunnable.workingDirectory); m_environment = stdRunnable.environment; m_project = project; if (runMode == TestRunner::Debug) m_runConfig = new TestRunConfiguration(runConfig->target(), this); - break; + if (m_executableFile == executable) // we can find a better runConfig if no match + break; } } // RunConfiguration for this target could be explicitly removed or not created at all @@ -117,12 +127,7 @@ void TestConfiguration::completeTestInformation(int runMode) if (runnable.is()) { StandardRunnable stdRunnable = runnable.as(); m_environment = stdRunnable.environment; - // when guessing we might have no extension - const QString &exeString = executable.toString(); - if (Utils::HostOsInfo::isWindowsHost() && !exeString.toLower().endsWith(".exe")) - m_executableFile = Utils::HostOsInfo::withExecutableSuffix(exeString); - else - m_executableFile = exeString; + m_executableFile = executable; m_project = project; m_guessedConfiguration = true; m_guessedFrom = rc->displayName(); diff --git a/src/plugins/qbsprojectmanager/qbsproject.cpp b/src/plugins/qbsprojectmanager/qbsproject.cpp index 251c4f08b57..295a70690f5 100644 --- a/src/plugins/qbsprojectmanager/qbsproject.cpp +++ b/src/plugins/qbsprojectmanager/qbsproject.cpp @@ -247,8 +247,8 @@ bool QbsProject::ensureWriteableQbsFile(const QString &file) } bool QbsProject::addFilesToProduct(const QStringList &filePaths, - const qbs::ProductData &productData, - const qbs::GroupData &groupData, QStringList *notAdded) + const qbs::ProductData productData, + const qbs::GroupData groupData, QStringList *notAdded) { QTC_ASSERT(m_qbsProject.isValid(), return false); QStringList allPaths = groupData.allFilePaths(); @@ -272,8 +272,8 @@ bool QbsProject::addFilesToProduct(const QStringList &filePaths, } bool QbsProject::removeFilesFromProduct(const QStringList &filePaths, - const qbs::ProductData &productData, - const qbs::GroupData &groupData, + const qbs::ProductData productData, + const qbs::GroupData groupData, QStringList *notRemoved) { QTC_ASSERT(m_qbsProject.isValid(), return false); @@ -300,8 +300,8 @@ bool QbsProject::removeFilesFromProduct(const QStringList &filePaths, } bool QbsProject::renameFileInProduct(const QString &oldPath, const QString &newPath, - const qbs::ProductData &productData, - const qbs::GroupData &groupData) + const qbs::ProductData productData, + const qbs::GroupData groupData) { if (newPath.isEmpty()) return false; diff --git a/src/plugins/qbsprojectmanager/qbsproject.h b/src/plugins/qbsprojectmanager/qbsproject.h index 82f20ab2445..500761380bd 100644 --- a/src/plugins/qbsprojectmanager/qbsproject.h +++ b/src/plugins/qbsprojectmanager/qbsproject.h @@ -66,14 +66,19 @@ public: QStringList filesGeneratedFrom(const QString &sourceFile) const override; bool isProjectEditable() const; - bool addFilesToProduct(const QStringList &filePaths, const qbs::ProductData &productData, - const qbs::GroupData &groupData, QStringList *notAdded); + // qbs::ProductData and qbs::GroupData are held by the nodes in the project tree. + // These methods change those trees and invalidate the lot, so pass in copies of + // the data we are interested in! + // The overhead is not as big as it seems at first glance: These all are handles + // for shared data. + bool addFilesToProduct(const QStringList &filePaths, const qbs::ProductData productData, + const qbs::GroupData groupData, QStringList *notAdded); bool removeFilesFromProduct(const QStringList &filePaths, - const qbs::ProductData &productData, const qbs::GroupData &groupData, + const qbs::ProductData productData, const qbs::GroupData groupData, QStringList *notRemoved); bool renameFileInProduct(const QString &oldPath, - const QString &newPath, const qbs::ProductData &productData, - const qbs::GroupData &groupData); + const QString &newPath, const qbs::ProductData productData, + const qbs::GroupData groupData); qbs::BuildJob *build(const qbs::BuildOptions &opts, QStringList products, QString &error); qbs::CleanJob *clean(const qbs::CleanOptions &opts, const QStringList &productNames, diff --git a/src/plugins/qmldesigner/components/texteditor/texteditorwidget.cpp b/src/plugins/qmldesigner/components/texteditor/texteditorwidget.cpp index d82fabfaf0a..591164138f3 100644 --- a/src/plugins/qmldesigner/components/texteditor/texteditorwidget.cpp +++ b/src/plugins/qmldesigner/components/texteditor/texteditorwidget.cpp @@ -175,14 +175,18 @@ void TextEditorWidget::setBlockCurserSelectionSyncronisation(bool b) bool TextEditorWidget::eventFilter( QObject *, QEvent *event) { - static std::vector overrideKeys = { Qt::Key_Delete, Qt::Key_Backspace, Qt::Key_Left, - Qt::Key_Right, Qt::Key_Up, Qt::Key_Down, Qt::Key_Insert, + static std::vector overrideKeys = { Qt::Key_Delete, Qt::Key_Backspace, Qt::Key_Insert, Qt::Key_Escape }; static std::vector overrideSequences = { QKeySequence::SelectAll, QKeySequence::Cut, - QKeySequence::Copy, QKeySequence::Delete, - QKeySequence::Paste, QKeySequence::Undo, - QKeySequence::Redo, QKeySequence(Qt::CTRL + Qt::ALT) }; + QKeySequence::Copy, QKeySequence::Delete, + QKeySequence::Paste, QKeySequence::Undo, + QKeySequence::Redo, QKeySequence(Qt::CTRL + Qt::ALT), + QKeySequence(Qt::Key_Left + Qt::CTRL), + QKeySequence(Qt::Key_Right + Qt::CTRL), + QKeySequence(Qt::Key_Up + Qt::CTRL), + QKeySequence(Qt::Key_Down + Qt::CTRL) + }; if (event->type() == QEvent::ShortcutOverride) { QKeyEvent *keyEvent = static_cast(event); diff --git a/src/plugins/qmljseditor/qmljseditorplugin.cpp b/src/plugins/qmljseditor/qmljseditorplugin.cpp index d8fceb01d3c..3b9a50866f5 100644 --- a/src/plugins/qmljseditor/qmljseditorplugin.cpp +++ b/src/plugins/qmljseditor/qmljseditorplugin.cpp @@ -260,10 +260,16 @@ void QmlJSEditorPlugin::reformatFile() return; const QString &newText = QmlJS::reformat(document); - QTextCursor tc(m_currentDocument->document()); - tc.movePosition(QTextCursor::Start); - tc.movePosition(QTextCursor::End, QTextCursor::KeepAnchor); - tc.insertText(newText); + QmlJSEditorWidget *widget = EditorManager::currentEditor() + ? qobject_cast(EditorManager::currentEditor()->widget()) + : nullptr; + if (widget) { + const int position = widget->position(); + m_currentDocument->document()->setPlainText(newText); + widget->setCursorPosition(position); + } else { + m_currentDocument->document()->setPlainText(newText); + } } }