Merge remote-tracking branch 'origin/4.3'

Conflicts:
	src/shared/qbs

Change-Id: I521ed7703298062d3860ddce3c82444bedd49e60
This commit is contained in:
Eike Ziller
2017-06-28 10:28:16 +02:00
8 changed files with 144 additions and 28 deletions

83
dist/changes-4.3.1.md vendored
View File

@@ -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

View File

@@ -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

View File

@@ -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);

View File

@@ -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();

View File

@@ -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;

View File

@@ -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,

View File

@@ -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);

View File

@@ -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);
}
} }
} }