forked from qt-creator/qt-creator
Merge remote-tracking branch 'origin/4.3'
Conflicts: src/shared/qbs Change-Id: I521ed7703298062d3860ddce3c82444bedd49e60
This commit is contained in:
83
dist/changes-4.3.1.md
vendored
83
dist/changes-4.3.1.md
vendored
@@ -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 clone git://code.qt.io/qt-creator/qt-creator.git
|
||||||
git log --cherry-pick --pretty=oneline v4.3.0..v4.3.1
|
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
|
Version Control Systems
|
||||||
|
|
||||||
|
* Fixed filtering of untracked files in commit editor
|
||||||
|
when multiple projects are open
|
||||||
* Git
|
* Git
|
||||||
* Fixed that ref names were missing for `Show`
|
* Fixed that ref names were missing for `Show`
|
||||||
|
* Mercurial
|
||||||
|
* Fixed extra options in diff and log (QTCREATORBUG-17987)
|
||||||
* Gerrit
|
* Gerrit
|
||||||
* Fixed parsing output from Gerrit 2.14
|
* 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
|
Platform Specific
|
||||||
|
|
||||||
Windows
|
Windows
|
||||||
|
|
||||||
* Fixed checking whether example should be copied to writable location
|
* Fixed checking whether example should be copied to writable location
|
||||||
(QTCREATORBUG-18184)
|
(QTCREATORBUG-18184)
|
||||||
|
* Fixed issues with MSVC2017 and CMake (QTCREATORBUG-17925)
|
||||||
|
|
||||||
|
macOS
|
||||||
|
|
||||||
|
* Fixed performance issue on HiDPI displays (QTBUG-61384)
|
||||||
|
|
||||||
WinRT
|
WinRT
|
||||||
|
|
||||||
* Fixed running MSVC 2017 based applications (QTCREATORBUG-18288)
|
* 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
|
iOS
|
||||||
|
|
||||||
|
* Fixed running on iOS 10.3 devices (QTCREATORBUG-18380)
|
||||||
* Fixed crash that could occur at startup while device is connected
|
* Fixed crash that could occur at startup while device is connected
|
||||||
(QTCREATORBUG-18226)
|
(QTCREATORBUG-18226)
|
||||||
|
|
||||||
|
BareMetal
|
||||||
|
|
||||||
|
* Fixed crash on shutdown
|
||||||
|
@@ -286,5 +286,17 @@ QString GTestTreeItem::nameSuffix() const
|
|||||||
return suffix;
|
return suffix;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QSet<QString> GTestTreeItem::internalTargets() const
|
||||||
|
{
|
||||||
|
QSet<QString> 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 Internal
|
||||||
} // namespace Autotest
|
} // namespace Autotest
|
||||||
|
@@ -66,6 +66,7 @@ public:
|
|||||||
GTestTreeItem::TestStates state,
|
GTestTreeItem::TestStates state,
|
||||||
const QString &proFile) const;
|
const QString &proFile) const;
|
||||||
QString nameSuffix() const;
|
QString nameSuffix() const;
|
||||||
|
QSet<QString> internalTargets() const override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool modifyTestSetContent(const GTestParseResult *result);
|
bool modifyTestSetContent(const GTestParseResult *result);
|
||||||
|
@@ -86,7 +86,12 @@ void TestConfiguration::completeTestInformation(int runMode)
|
|||||||
&& targWithProjectFile.at(1).startsWith(bti.projectFilePath.toString());
|
&& 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()) {
|
for (RunConfiguration *runConfig : target->runConfigurations()) {
|
||||||
if (!isLocal(runConfig)) // TODO add device support
|
if (!isLocal(runConfig)) // TODO add device support
|
||||||
continue;
|
continue;
|
||||||
@@ -99,13 +104,18 @@ void TestConfiguration::completeTestInformation(int runMode)
|
|||||||
StandardRunnable stdRunnable = runnable.as<StandardRunnable>();
|
StandardRunnable stdRunnable = runnable.as<StandardRunnable>();
|
||||||
// TODO this might pick up the wrong executable
|
// TODO this might pick up the wrong executable
|
||||||
m_executableFile = stdRunnable.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_displayName = runConfig->displayName();
|
||||||
m_workingDir = Utils::FileUtils::normalizePathName(stdRunnable.workingDirectory);
|
m_workingDir = Utils::FileUtils::normalizePathName(stdRunnable.workingDirectory);
|
||||||
m_environment = stdRunnable.environment;
|
m_environment = stdRunnable.environment;
|
||||||
m_project = project;
|
m_project = project;
|
||||||
if (runMode == TestRunner::Debug)
|
if (runMode == TestRunner::Debug)
|
||||||
m_runConfig = new TestRunConfiguration(runConfig->target(), this);
|
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
|
// 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>()) {
|
if (runnable.is<StandardRunnable>()) {
|
||||||
StandardRunnable stdRunnable = runnable.as<StandardRunnable>();
|
StandardRunnable stdRunnable = runnable.as<StandardRunnable>();
|
||||||
m_environment = stdRunnable.environment;
|
m_environment = stdRunnable.environment;
|
||||||
// when guessing we might have no extension
|
m_executableFile = executable;
|
||||||
const QString &exeString = executable.toString();
|
|
||||||
if (Utils::HostOsInfo::isWindowsHost() && !exeString.toLower().endsWith(".exe"))
|
|
||||||
m_executableFile = Utils::HostOsInfo::withExecutableSuffix(exeString);
|
|
||||||
else
|
|
||||||
m_executableFile = exeString;
|
|
||||||
m_project = project;
|
m_project = project;
|
||||||
m_guessedConfiguration = true;
|
m_guessedConfiguration = true;
|
||||||
m_guessedFrom = rc->displayName();
|
m_guessedFrom = rc->displayName();
|
||||||
|
@@ -247,8 +247,8 @@ bool QbsProject::ensureWriteableQbsFile(const QString &file)
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool QbsProject::addFilesToProduct(const QStringList &filePaths,
|
bool QbsProject::addFilesToProduct(const QStringList &filePaths,
|
||||||
const qbs::ProductData &productData,
|
const qbs::ProductData productData,
|
||||||
const qbs::GroupData &groupData, QStringList *notAdded)
|
const qbs::GroupData groupData, QStringList *notAdded)
|
||||||
{
|
{
|
||||||
QTC_ASSERT(m_qbsProject.isValid(), return false);
|
QTC_ASSERT(m_qbsProject.isValid(), return false);
|
||||||
QStringList allPaths = groupData.allFilePaths();
|
QStringList allPaths = groupData.allFilePaths();
|
||||||
@@ -272,8 +272,8 @@ bool QbsProject::addFilesToProduct(const QStringList &filePaths,
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool QbsProject::removeFilesFromProduct(const QStringList &filePaths,
|
bool QbsProject::removeFilesFromProduct(const QStringList &filePaths,
|
||||||
const qbs::ProductData &productData,
|
const qbs::ProductData productData,
|
||||||
const qbs::GroupData &groupData,
|
const qbs::GroupData groupData,
|
||||||
QStringList *notRemoved)
|
QStringList *notRemoved)
|
||||||
{
|
{
|
||||||
QTC_ASSERT(m_qbsProject.isValid(), return false);
|
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,
|
bool QbsProject::renameFileInProduct(const QString &oldPath, const QString &newPath,
|
||||||
const qbs::ProductData &productData,
|
const qbs::ProductData productData,
|
||||||
const qbs::GroupData &groupData)
|
const qbs::GroupData groupData)
|
||||||
{
|
{
|
||||||
if (newPath.isEmpty())
|
if (newPath.isEmpty())
|
||||||
return false;
|
return false;
|
||||||
|
@@ -66,14 +66,19 @@ public:
|
|||||||
QStringList filesGeneratedFrom(const QString &sourceFile) const override;
|
QStringList filesGeneratedFrom(const QString &sourceFile) const override;
|
||||||
|
|
||||||
bool isProjectEditable() const;
|
bool isProjectEditable() const;
|
||||||
bool addFilesToProduct(const QStringList &filePaths, const qbs::ProductData &productData,
|
// qbs::ProductData and qbs::GroupData are held by the nodes in the project tree.
|
||||||
const qbs::GroupData &groupData, QStringList *notAdded);
|
// 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,
|
bool removeFilesFromProduct(const QStringList &filePaths,
|
||||||
const qbs::ProductData &productData, const qbs::GroupData &groupData,
|
const qbs::ProductData productData, const qbs::GroupData groupData,
|
||||||
QStringList *notRemoved);
|
QStringList *notRemoved);
|
||||||
bool renameFileInProduct(const QString &oldPath,
|
bool renameFileInProduct(const QString &oldPath,
|
||||||
const QString &newPath, const qbs::ProductData &productData,
|
const QString &newPath, const qbs::ProductData productData,
|
||||||
const qbs::GroupData &groupData);
|
const qbs::GroupData groupData);
|
||||||
|
|
||||||
qbs::BuildJob *build(const qbs::BuildOptions &opts, QStringList products, QString &error);
|
qbs::BuildJob *build(const qbs::BuildOptions &opts, QStringList products, QString &error);
|
||||||
qbs::CleanJob *clean(const qbs::CleanOptions &opts, const QStringList &productNames,
|
qbs::CleanJob *clean(const qbs::CleanOptions &opts, const QStringList &productNames,
|
||||||
|
@@ -175,14 +175,18 @@ void TextEditorWidget::setBlockCurserSelectionSyncronisation(bool b)
|
|||||||
|
|
||||||
bool TextEditorWidget::eventFilter( QObject *, QEvent *event)
|
bool TextEditorWidget::eventFilter( QObject *, QEvent *event)
|
||||||
{
|
{
|
||||||
static std::vector<int> overrideKeys = { Qt::Key_Delete, Qt::Key_Backspace, Qt::Key_Left,
|
static std::vector<int> overrideKeys = { Qt::Key_Delete, Qt::Key_Backspace, Qt::Key_Insert,
|
||||||
Qt::Key_Right, Qt::Key_Up, Qt::Key_Down, Qt::Key_Insert,
|
|
||||||
Qt::Key_Escape };
|
Qt::Key_Escape };
|
||||||
|
|
||||||
static std::vector<QKeySequence> overrideSequences = { QKeySequence::SelectAll, QKeySequence::Cut,
|
static std::vector<QKeySequence> overrideSequences = { QKeySequence::SelectAll, QKeySequence::Cut,
|
||||||
QKeySequence::Copy, QKeySequence::Delete,
|
QKeySequence::Copy, QKeySequence::Delete,
|
||||||
QKeySequence::Paste, QKeySequence::Undo,
|
QKeySequence::Paste, QKeySequence::Undo,
|
||||||
QKeySequence::Redo, QKeySequence(Qt::CTRL + Qt::ALT) };
|
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) {
|
if (event->type() == QEvent::ShortcutOverride) {
|
||||||
QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
|
QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
|
||||||
|
|
||||||
|
@@ -260,10 +260,16 @@ void QmlJSEditorPlugin::reformatFile()
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
const QString &newText = QmlJS::reformat(document);
|
const QString &newText = QmlJS::reformat(document);
|
||||||
QTextCursor tc(m_currentDocument->document());
|
QmlJSEditorWidget *widget = EditorManager::currentEditor()
|
||||||
tc.movePosition(QTextCursor::Start);
|
? qobject_cast<QmlJSEditorWidget*>(EditorManager::currentEditor()->widget())
|
||||||
tc.movePosition(QTextCursor::End, QTextCursor::KeepAnchor);
|
: nullptr;
|
||||||
tc.insertText(newText);
|
if (widget) {
|
||||||
|
const int position = widget->position();
|
||||||
|
m_currentDocument->document()->setPlainText(newText);
|
||||||
|
widget->setCursorPosition(position);
|
||||||
|
} else {
|
||||||
|
m_currentDocument->document()->setPlainText(newText);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user