From 0e2e724dd5c03651db64432312dafe806172d5c1 Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Fri, 19 Oct 2018 16:14:29 +0200 Subject: [PATCH 01/38] CppCheck: Add a category text and icon to the Option page All analyzer plugins need to set these for the case that they are the only loaded analyzer plugin. Task-number: QTCREATORBUG-21354 Change-Id: Ibb889ef2f4e2c10ebc9927301607b7539066b5ea Reviewed-by: Eike Ziller --- src/plugins/cppcheck/cppcheckoptions.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/plugins/cppcheck/cppcheckoptions.cpp b/src/plugins/cppcheck/cppcheckoptions.cpp index de81af7535d..6e665417d03 100644 --- a/src/plugins/cppcheck/cppcheckoptions.cpp +++ b/src/plugins/cppcheck/cppcheckoptions.cpp @@ -36,6 +36,8 @@ #include #include +#include + #include #include #include @@ -164,6 +166,8 @@ CppcheckOptionsPage::CppcheckOptionsPage(CppcheckTool &tool, CppcheckTrigger &tr setId(Constants::OPTIONS_PAGE_ID); setDisplayName(tr("Cppcheck")); setCategory("T.Analyzer"); + setDisplayCategory(QCoreApplication::translate("Analyzer", "Analyzer")); + setCategoryIcon(Analyzer::Icons::SETTINGSCATEGORY_ANALYZER); CppcheckOptions options; if (Utils::HostOsInfo::isAnyUnixHost()) { From 824d29d0e2fa63a12fedbf6f9d80f414743f80d9 Mon Sep 17 00:00:00 2001 From: Robert Loehning Date: Fri, 19 Oct 2018 15:39:29 +0200 Subject: [PATCH 02/38] Debugger[CDB]: Make title more clear Change-Id: I27e80605f73f4da8874621da48731c0bd966a294 Reviewed-by: hjk Reviewed-by: Leena Miettinen Reviewed-by: David Schulz --- src/plugins/debugger/cdb/cdboptionspagewidget.ui | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/debugger/cdb/cdboptionspagewidget.ui b/src/plugins/debugger/cdb/cdboptionspagewidget.ui index e6d5646dea9..345b85c7565 100644 --- a/src/plugins/debugger/cdb/cdboptionspagewidget.ui +++ b/src/plugins/debugger/cdb/cdboptionspagewidget.ui @@ -106,7 +106,7 @@ - Task Entries for Exceptions + Add Exceptions to Issues View From 8e54095d0772517d4d0fa4e8123f71351dbebba8 Mon Sep 17 00:00:00 2001 From: Robert Loehning Date: Fri, 19 Oct 2018 15:58:40 +0200 Subject: [PATCH 03/38] QmlProject: Capitalize consistently Change-Id: I61c5db4008adf0dead0421a2d223a9d4d2586966 Reviewed-by: Ulf Hermann Reviewed-by: Leena Miettinen --- src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.cpp b/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.cpp index 9ba68b556a1..65616389af2 100644 --- a/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.cpp +++ b/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.cpp @@ -278,7 +278,7 @@ QmlProjectRunConfiguration::QmlProjectRunConfiguration(Target *target, Id id) { addAspect(target); m_qmlViewerAspect = addAspect(); - m_qmlViewerAspect->setLabelText(tr("QML viewer:")); + m_qmlViewerAspect->setLabelText(tr("QML Viewer:")); m_qmlViewerAspect->setPlaceHolderText(executable()); m_qmlViewerAspect->setDisplayStyle(BaseStringAspect::LineEditDisplay); From 30b3b1c6e0d01bcf300ab8c619956ff379d613ad Mon Sep 17 00:00:00 2001 From: Andre Hartmann Date: Sun, 21 Oct 2018 12:39:43 +0200 Subject: [PATCH 04/38] QMake: Use option for parallel make jobs The job option was already available in MakeStep::allArguments(), but not in MakeStep::userArguments() which is used by QmakeMakeStep. So while the job option was already correctly set in the projects setup widget, it was not used. Amends 005b0c1147813aa518a617b31cab3ecec058618a Change-Id: I39799f9d1c65bf78884f5bc4c58cb66d803785bc Reviewed-by: Eike Ziller --- src/plugins/qmakeprojectmanager/qmakemakestep.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/qmakeprojectmanager/qmakemakestep.cpp b/src/plugins/qmakeprojectmanager/qmakemakestep.cpp index 4cf4d123279..3fad755f80b 100644 --- a/src/plugins/qmakeprojectmanager/qmakemakestep.cpp +++ b/src/plugins/qmakeprojectmanager/qmakemakestep.cpp @@ -129,7 +129,7 @@ bool QmakeMakeStep::init(QList &earlierSteps) } } - Utils::QtcProcess::addArgs(&args, userArguments()); + Utils::QtcProcess::addArgs(&args, allArguments()); if (bc->fileNodeBuild() && subProFile) { QString objectsDir = subProFile->objectsDirectory(); if (objectsDir.isEmpty()) { From 0eb8c95c778f6e6c545a4aec397e380710855e5b Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Fri, 19 Oct 2018 10:37:43 +0200 Subject: [PATCH 05/38] Doc: Describe selecting the terminal to use on Linux and macOS Change-Id: I6d1b47f1829ecceef13d1ae23c5d05c22112e94f Reviewed-by: hjk Reviewed-by: Eike Ziller --- doc/src/howto/creator-only/qtcreator-faq.qdoc | 6 ++++-- doc/src/howto/creator-sidebar-views.qdocinc | 4 +++- .../creator-projects-settings-run-desktop.qdocinc | 10 +++++++--- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/doc/src/howto/creator-only/qtcreator-faq.qdoc b/doc/src/howto/creator-only/qtcreator-faq.qdoc index 5110f7f95e5..802164e827d 100644 --- a/doc/src/howto/creator-only/qtcreator-faq.qdoc +++ b/doc/src/howto/creator-only/qtcreator-faq.qdoc @@ -253,8 +253,10 @@ the standard output and error output. When you run or debug the application, you can view the output in the \uicontrol{Application Output} pane. - For console applications that require input, select \uicontrol {Projects > Run - Settings > Run in terminal}. + For console applications that require input, select \uicontrol Projects > + \uicontrol {Run Settings} > \uicontrol {Run in terminal}. To specify the + terminal to use, select \uicontrol Tools > \uicontrol Options > + \uicontrol Environment > \uicontrol System. \b {On Windows:} Output is displayed differently for \e{console applications} and \e{GUI applications}. diff --git a/doc/src/howto/creator-sidebar-views.qdocinc b/doc/src/howto/creator-sidebar-views.qdocinc index 7ba172b3c3e..aaff3986dd8 100644 --- a/doc/src/howto/creator-sidebar-views.qdocinc +++ b/doc/src/howto/creator-sidebar-views.qdocinc @@ -237,7 +237,9 @@ \li Show the file or directory in the file explorer. \li Open a terminal window in the selected directory or in the directory - that contains the file. + that contains the file. To specify the terminal to use on Linux and + \macos, select \uicontrol Tools > \uicontrol Options > + \uicontrol Environment > \uicontrol System. \li Search from the selected directory. diff --git a/doc/src/projects/creator-only/creator-projects-settings-run-desktop.qdocinc b/doc/src/projects/creator-only/creator-projects-settings-run-desktop.qdocinc index 1754af25a95..e0b1c7187e4 100644 --- a/doc/src/projects/creator-only/creator-projects-settings-run-desktop.qdocinc +++ b/doc/src/projects/creator-only/creator-projects-settings-run-desktop.qdocinc @@ -32,9 +32,13 @@ and the working directory to use. The working directory defaults to the directory of the build result. - For console applications, check the \uicontrol{Run in Terminal} check box. - If you need to run with special environment variables set up, you - also do it in the run configuration settings. + For console applications, check the \uicontrol{Run in terminal} check box. + To specify the terminal to use on Linux and \macos, select \uicontrol Tools + > \uicontrol Options > \uicontrol Environment > \uicontrol System. + + To run with special environment variables set up, select them in the + \uicontrol {Run Environment} section. For more information, see + \l {Selecting the Run Environment}. \image qtcreator-pprunsettings.png From dbacbffa7cdaf2a41f9e0d3ebe6a6421ad86434b Mon Sep 17 00:00:00 2001 From: hjk Date: Mon, 22 Oct 2018 13:02:02 +0200 Subject: [PATCH 06/38] Debugger: Remove unused BreakHandler::setBreakpointEnabled() Change-Id: Ie7ef810e72b3d02663b425c687407cdd2b0cea52 Reviewed-by: Christian Stenger --- src/plugins/debugger/breakhandler.cpp | 6 ------ src/plugins/debugger/breakhandler.h | 1 - 2 files changed, 7 deletions(-) diff --git a/src/plugins/debugger/breakhandler.cpp b/src/plugins/debugger/breakhandler.cpp index f56cfb91214..5722e2f2553 100644 --- a/src/plugins/debugger/breakhandler.cpp +++ b/src/plugins/debugger/breakhandler.cpp @@ -1331,12 +1331,6 @@ void BreakpointItem::setEnabled(bool on) adjustMarker(); } -void BreakHandler::setBreakpointEnabled(const Breakpoint &bp, bool on) -{ - bp->setEnabled(on); - requestBreakpointUpdate(bp); -} - void DebuggerEngine::notifyBreakpointInsertProceeding(const Breakpoint &bp) { QTC_ASSERT(bp, return); diff --git a/src/plugins/debugger/breakhandler.h b/src/plugins/debugger/breakhandler.h index dee8b3e69b6..544f4a509eb 100644 --- a/src/plugins/debugger/breakhandler.h +++ b/src/plugins/debugger/breakhandler.h @@ -257,7 +257,6 @@ public: // Convenience. void setWatchpointAtAddress(quint64 address, unsigned size); void setWatchpointAtExpression(const QString &exp); - void setBreakpointEnabled(const Breakpoint &bp, bool on); void updateDisassemblerMarker(const Breakpoint &bp); void removeDisassemblerMarker(const Breakpoint &bp); From 45666dc93254ef2b003812dd2953f0e0ac91d9bc Mon Sep 17 00:00:00 2001 From: David Schulz Date: Mon, 22 Oct 2018 14:48:11 +0200 Subject: [PATCH 07/38] Debugger: Do not interrupt twice Fixes unwanted interrupt after setting a breakpoint to a running inferior. Change-Id: I8d24fd4beff53fa74f92d2134866d418745fa747 Reviewed-by: Christian Stenger --- src/plugins/debugger/cdb/cdbengine.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/plugins/debugger/cdb/cdbengine.cpp b/src/plugins/debugger/cdb/cdbengine.cpp index ee2f15e3610..96206aa7217 100644 --- a/src/plugins/debugger/cdb/cdbengine.cpp +++ b/src/plugins/debugger/cdb/cdbengine.cpp @@ -832,6 +832,7 @@ void CdbEngine::handleDoInterruptInferior(const QString &errorMessage) void CdbEngine::doInterruptInferior(const InterruptCallback &callback) { + const bool requestInterrupt = m_stopMode == NoStopRequested; if (callback) { m_interrupCallbacks.push_back(callback); if (!m_initialSessionIdleHandled) @@ -842,6 +843,8 @@ void CdbEngine::doInterruptInferior(const InterruptCallback &callback) m_stopMode = Interrupt; } + if (!requestInterrupt) + return; // we already requested a stop no need to interrupt twice showMessage(QString("Interrupting process %1...").arg(inferiorPid()), LogMisc); QTC_ASSERT(!m_signalOperation, notifyInferiorStopFailed(); return); QTC_ASSERT(device(), notifyInferiorRunFailed(); return); From 90af97cd01d023b31dc47e7dfd92aa1426ae1dae Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Mon, 22 Oct 2018 14:31:31 +0200 Subject: [PATCH 08/38] Doc: Hide info about creating snapshots The functionality is being reconsidered and will change again. Task-number: QTCREATORBUG-21359 Change-Id: Id7a6dbea4e3a947dc5fd3005a2ed87682bab9283 Reviewed-by: hjk Reviewed-by: Robert Loehning --- doc/src/debugger/creator-only/creator-debugger.qdoc | 5 ++++- doc/src/howto/creator-only/qtcreator-faq.qdoc | 2 ++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/doc/src/debugger/creator-only/creator-debugger.qdoc b/doc/src/debugger/creator-only/creator-debugger.qdoc index 83833539a4c..e9adadbf59b 100644 --- a/doc/src/debugger/creator-only/creator-debugger.qdoc +++ b/doc/src/debugger/creator-only/creator-debugger.qdoc @@ -387,8 +387,10 @@ \li Disassemble sections of code. + \omit \li Create snapshots of the current state of the debugged program and re-examine them later. + \endomit \endlist @@ -605,6 +607,7 @@ By default, the \uicontrol Registers view is hidden. + \omit \section2 Creating Snapshots A snapshot contains the complete state of the debugged program at a time, @@ -616,7 +619,7 @@ Double-click on entries in the \uicontrol {Debugger Perspectives} view to switch between snapshots. The debugger views are updated to reflect the state of the program at time of taking the snapshot. - + \endomit */ diff --git a/doc/src/howto/creator-only/qtcreator-faq.qdoc b/doc/src/howto/creator-only/qtcreator-faq.qdoc index 802164e827d..fd41a869a11 100644 --- a/doc/src/howto/creator-only/qtcreator-faq.qdoc +++ b/doc/src/howto/creator-only/qtcreator-faq.qdoc @@ -200,9 +200,11 @@ current working directory. You can specify another location for the file, including a relative or absolute path, as an argument of the command. + \omit To generate a temporary core file, select \uicontrol {Create Snapshot} in the context menu in the \uicontrol Snapshot view. The core file is deleted when you stop debugging. + \endomit \section1 Compiler Questions From 7df0b9eb7b3c3aef1977c289b0d0bd135fc8e68d Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Mon, 22 Oct 2018 15:01:55 +0200 Subject: [PATCH 09/38] Doc: Add Pastecode.Xyz to the list of supported code paste services Change-Id: I185566ac89350bdbddeab7b1540329ebb8828066 Reviewed-by: Christian Stenger Reviewed-by: Christian Kandeler --- doc/src/editors/creator-only/creator-code-pasting.qdoc | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/src/editors/creator-only/creator-code-pasting.qdoc b/doc/src/editors/creator-only/creator-code-pasting.qdoc index bedf2869fb8..a6dc32d97eb 100644 --- a/doc/src/editors/creator-only/creator-code-pasting.qdoc +++ b/doc/src/editors/creator-only/creator-code-pasting.qdoc @@ -38,6 +38,7 @@ \list \li \uicontrol {Pastebin.Com} \li \uicontrol {Pastebin.Ca} + \li \uicontrol {Pastecode.Xyz} \li \uicontrol {Paste.KDE.Org} \li \uicontrol {Shared network drives} \endlist From a8d71428738db1936029f3bf4f808de00feefe18 Mon Sep 17 00:00:00 2001 From: Robert Loehning Date: Mon, 22 Oct 2018 16:08:34 +0200 Subject: [PATCH 10/38] Debugger: Remove redundant dot Change-Id: If9a3ac99ce50e269228d469a4b361f0c273ce703 Reviewed-by: hjk Reviewed-by: Leena Miettinen --- src/plugins/debugger/debuggerengine.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/debugger/debuggerengine.cpp b/src/plugins/debugger/debuggerengine.cpp index 95237747956..0dd2ce2299b 100644 --- a/src/plugins/debugger/debuggerengine.cpp +++ b/src/plugins/debugger/debuggerengine.cpp @@ -1847,7 +1847,7 @@ void DebuggerEngine::handleBeginOfRecordingReached() void DebuggerEngine::handleRecordingFailed() { - showStatusMessage(tr("Reverse-execution recording failed..")); + showStatusMessage(tr("Reverse-execution recording failed.")); d->m_operateInReverseDirectionAction.setChecked(false); d->m_recordForReverseOperationAction.setChecked(false); d->updateReverseActions(); From d68c2e5f6892264d8f254f930b60f629a4bf83ff Mon Sep 17 00:00:00 2001 From: Robert Loehning Date: Mon, 22 Oct 2018 13:33:04 +0200 Subject: [PATCH 11/38] Debugger: Remove wrong white space Change-Id: Ie3f9ebf0da7eb62748584e691495f4805e2faab0 Reviewed-by: Leena Miettinen Reviewed-by: hjk --- src/plugins/debugger/debuggerplugin.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp index 249dcf1def5..a72bc1db0dc 100644 --- a/src/plugins/debugger/debuggerplugin.cpp +++ b/src/plugins/debugger/debuggerplugin.cpp @@ -1963,7 +1963,7 @@ void DebuggerPluginPrivate::requestContextMenu(TextEditorWidget *widget, } // Edit existing breakpoint. - act = menu->addAction(tr("Edit Breakpoint ...")); + act = menu->addAction(tr("Edit Breakpoint...")); connect(act, &QAction::triggered, [gbp] { BreakpointManager::editBreakpoint(gbp, ICore::dialogParent()); }); From 84679827aefb8a178b939ab465b87ae76ce7e745 Mon Sep 17 00:00:00 2001 From: Robert Loehning Date: Mon, 22 Oct 2018 13:58:57 +0200 Subject: [PATCH 12/38] Git: Move HTML out of translated string MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: Ib386531b45ddfcc087472602b5a8019796c7ec03 Reviewed-by: André Hartmann Reviewed-by: Orgad Shaneh --- src/plugins/git/mergetool.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/plugins/git/mergetool.cpp b/src/plugins/git/mergetool.cpp index 8a224f09a7d..f0f03e4ffc2 100644 --- a/src/plugins/git/mergetool.cpp +++ b/src/plugins/git/mergetool.cpp @@ -238,9 +238,10 @@ void MergeTool::readData() } else if (m_line.startsWith("Hit return")) { QMessageBox::warning( Core::ICore::dialogParent(), tr("Merge Tool"), - tr("

Merge tool is not configured.

\n" - "

Run git config --global merge.tool <tool> to configure it, " - "then try again

")); + QString("

%1

\n

%2

").arg( + tr("Merge tool is not configured."), + tr("Run git config --global merge.tool <tool> " + "to configure it, then try again."))); m_process->kill(); } else if (m_line.endsWith('\n')) { // Skip unidentified lines From a4d6c2d89583d3aa7b6f2ab86f3b2ee30961ea05 Mon Sep 17 00:00:00 2001 From: Robert Loehning Date: Mon, 22 Oct 2018 15:37:34 +0200 Subject: [PATCH 13/38] Core: Make variable descriptions consistent The others aren't in imperative form, either. Change-Id: I7af7b0ddcdf409d952223225bd901c84b9136bc6 Reviewed-by: Leena Miettinen Reviewed-by: Tobias Hunger --- src/plugins/coreplugin/coreplugin.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/plugins/coreplugin/coreplugin.cpp b/src/plugins/coreplugin/coreplugin.cpp index 565b0eac328..7f367331312 100644 --- a/src/plugins/coreplugin/coreplugin.cpp +++ b/src/plugins/coreplugin/coreplugin.cpp @@ -197,10 +197,10 @@ bool CorePlugin::initialize(const QStringList &arguments, QString *errorMessage) .arg(Constants::IDE_DISPLAY_NAME), []() { return QVariant(Utils::HostOsInfo::isAnyUnixHost()).toString(); }); expander->registerVariable("HostOs:PathListSeparator", - tr("Return the path list separator for the platform."), + tr("The path list separator for the platform."), []() { return QString(Utils::HostOsInfo::pathListSeparator()); }); expander->registerVariable("HostOs:ExecutableSuffix", - tr("Return the platform executable suffix."), + tr("The platform executable suffix."), []() { return QString(Utils::HostOsInfo::withExecutableSuffix("")); }); expander->registerVariable("IDE:ResourcePath", tr("The directory where %1 finds its pre-installed resources.") From 6d93247f30d34cdd3fc22ef5ea4bff96605f956d Mon Sep 17 00:00:00 2001 From: Robert Loehning Date: Mon, 22 Oct 2018 16:54:27 +0200 Subject: [PATCH 14/38] Clang: Remove default windowTitle from translation Change-Id: I1fc7c9592a946279b7718033992560ce39e3803d Reviewed-by: Friedemann Kleint --- src/plugins/clangformat/clangformatconfigwidget.ui | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/clangformat/clangformatconfigwidget.ui b/src/plugins/clangformat/clangformatconfigwidget.ui index 41774e133d0..569f486912f 100644 --- a/src/plugins/clangformat/clangformatconfigwidget.ui +++ b/src/plugins/clangformat/clangformatconfigwidget.ui @@ -11,7 +11,7 @@ - Form + From e3021b7178fd557de5e10c55db5875e0eff73b2e Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Fri, 19 Oct 2018 14:00:28 +0200 Subject: [PATCH 15/38] Fix crash in folder navigation widget We want to delay updating the crumble path, but we may not keep and pass around the QModelIndex, since that can become invalid. Change-Id: Id0c1ffb046dda1fb3bc09801fd1952787f9919fa Reviewed-by: Eike Ziller --- .../foldernavigationwidget.cpp | 28 +++++++++++++------ .../projectexplorer/foldernavigationwidget.h | 4 ++- 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/src/plugins/projectexplorer/foldernavigationwidget.cpp b/src/plugins/projectexplorer/foldernavigationwidget.cpp index b0df6203754..f6853ef9a2e 100644 --- a/src/plugins/projectexplorer/foldernavigationwidget.cpp +++ b/src/plugins/projectexplorer/foldernavigationwidget.cpp @@ -373,13 +373,25 @@ FolderNavigationWidget::FolderNavigationWidget(QWidget *parent) : QWidget(parent connect(m_listView, &QAbstractItemView::activated, this, [this](const QModelIndex &index) { openItem(m_sortProxyModel->mapToSource(index)); }); - // use QueuedConnection for updating crumble path, because that can scroll, which doesn't - // work well when done directly in currentChanged (the wrong item can get highlighted) + // Delay updating crumble path by event loop cylce, because that can scroll, which doesn't + // work well when done directly in currentChanged (the wrong item can get highlighted). + // We cannot use Qt::QueuedConnection directly, because the QModelIndex could get invalidated + // in the meantime, so use a queued invokeMethod instead. connect(m_listView->selectionModel(), &QItemSelectionModel::currentChanged, this, - &FolderNavigationWidget::setCrumblePath, - Qt::QueuedConnection); + [this](const QModelIndex &index) { + const QModelIndex sourceIndex = m_sortProxyModel->mapToSource(index); + const auto filePath = Utils::FileName::fromString( + m_fileSystemModel->filePath(sourceIndex)); + // QTimer::singleShot only posts directly onto the event loop if you use the SLOT("...") + // notation, so using a singleShot with a lambda would flicker + // QTimer::singleShot(0, this, [this, filePath]() { setCrumblePath(filePath); }); + QMetaObject::invokeMethod(this, + "setCrumblePath", + Qt::QueuedConnection, + Q_ARG(Utils::FileName, filePath)); + }); connect(m_crumbLabel, &Utils::FileCrumbLabel::pathClicked, [this](const Utils::FileName &path) { const QModelIndex rootIndex = m_sortProxyModel->mapToSource(m_listView->rootIndex()); const QModelIndex fileIndex = m_fileSystemModel->index(path.toString()); @@ -623,7 +635,7 @@ void FolderNavigationWidget::selectFile(const Utils::FileName &filePath) } else { m_listView->scrollTo(fileIndex); } - setCrumblePath(fileIndex); + setCrumblePath(filePath); }); } } @@ -699,12 +711,12 @@ void FolderNavigationWidget::createNewFolder(const QModelIndex &parent) m_listView->edit(index); } -void FolderNavigationWidget::setCrumblePath(const QModelIndex &index) +void FolderNavigationWidget::setCrumblePath(const Utils::FileName &filePath) { - const QModelIndex sourceIndex = m_sortProxyModel->mapToSource(index); + const QModelIndex index = m_fileSystemModel->index(filePath.toString()); const int width = m_crumbLabel->width(); const int previousHeight = m_crumbLabel->immediateHeightForWidth(width); - m_crumbLabel->setPath(Utils::FileName::fromString(m_fileSystemModel->filePath(sourceIndex))); + m_crumbLabel->setPath(filePath); const int currentHeight = m_crumbLabel->immediateHeightForWidth(width); const int diff = currentHeight - previousHeight; if (diff != 0 && m_crumbLabel->isVisible()) { diff --git a/src/plugins/projectexplorer/foldernavigationwidget.h b/src/plugins/projectexplorer/foldernavigationwidget.h index f10f69d595d..5c8a2e24f6a 100644 --- a/src/plugins/projectexplorer/foldernavigationwidget.h +++ b/src/plugins/projectexplorer/foldernavigationwidget.h @@ -118,6 +118,9 @@ public: protected: void contextMenuEvent(QContextMenuEvent *ev) override; +private slots: + void setCrumblePath(const Utils::FileName &filePath); + private: bool rootAutoSynchronization() const; void setRootAutoSynchronization(bool sync); @@ -131,7 +134,6 @@ private: QStringList projectsInDirectory(const QModelIndex &index) const; void openProjectsInDirectory(const QModelIndex &index); void createNewFolder(const QModelIndex &parent); - void setCrumblePath(const QModelIndex &index); Core::IContext *m_context = nullptr; Utils::NavigationTreeView *m_listView = nullptr; From cfbf2559f400dfa24b24da03e55f5597ca6d5b69 Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Thu, 18 Oct 2018 09:21:35 +0200 Subject: [PATCH 16/38] Clang: Fix naming conventions for *ModelManagerSupport* classes We use "Builtin" and "Clang" as prefixes, not suffixes. Change-Id: I6926aeb8f005176ef420c4421c257e3df61ee0b7 Reviewed-by: Marco Bubke --- .../clangbackendcommunicator.cpp | 2 +- .../clangcodemodel/clangcodemodelplugin.h | 2 +- .../clangeditordocumentprocessor.cpp | 2 +- .../clangmodelmanagersupport.cpp | 124 +++++++++--------- .../clangcodemodel/clangmodelmanagersupport.h | 10 +- .../clangprojectsettingswidget.cpp | 2 +- src/plugins/clangcodemodel/clangutils.cpp | 2 +- ....cpp => cppbuiltinmodelmanagersupport.cpp} | 26 ++-- ...rnal.h => cppbuiltinmodelmanagersupport.h} | 10 +- src/plugins/cpptools/cppmodelmanager.cpp | 4 +- src/plugins/cpptools/cpptools.pro | 8 +- src/plugins/cpptools/cpptools.qbs | 6 +- 12 files changed, 99 insertions(+), 99 deletions(-) rename src/plugins/cpptools/{cppmodelmanagersupportinternal.cpp => cppbuiltinmodelmanagersupport.cpp} (70%) rename src/plugins/cpptools/{cppmodelmanagersupportinternal.h => cppbuiltinmodelmanagersupport.h} (89%) diff --git a/src/plugins/clangcodemodel/clangbackendcommunicator.cpp b/src/plugins/clangcodemodel/clangbackendcommunicator.cpp index 4e0c08b6724..34a363407a8 100644 --- a/src/plugins/clangcodemodel/clangbackendcommunicator.cpp +++ b/src/plugins/clangcodemodel/clangbackendcommunicator.cpp @@ -253,7 +253,7 @@ void BackendCommunicator::unsavedFilesUpdatedForUiHeaders() const auto editorSupports = CppModelManager::instance()->abstractEditorSupports(); foreach (const AbstractEditorSupport *es, editorSupports) { const QString mappedPath - = ModelManagerSupportClang::instance()->dummyUiHeaderOnDiskPath(es->fileName()); + = ClangModelManagerSupport::instance()->dummyUiHeaderOnDiskPath(es->fileName()); unsavedFilesUpdated(mappedPath, es->contents(), es->revision()); } } diff --git a/src/plugins/clangcodemodel/clangcodemodelplugin.h b/src/plugins/clangcodemodel/clangcodemodelplugin.h index 5e24352a763..ad2b556400f 100644 --- a/src/plugins/clangcodemodel/clangcodemodelplugin.h +++ b/src/plugins/clangcodemodel/clangcodemodelplugin.h @@ -53,7 +53,7 @@ private: void generateCompilationDB(); void createCompilationDBButton(); - ModelManagerSupportProviderClang m_modelManagerSupportProvider; + ClangModelManagerSupportProvider m_modelManagerSupportProvider; Utils::ParameterAction *m_generateCompilationDBAction = nullptr; QFutureWatcher m_generatorWatcher; #ifdef WITH_TESTS diff --git a/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp b/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp index 7a185bb8213..959e90d22cc 100644 --- a/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp +++ b/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp @@ -70,7 +70,7 @@ namespace Internal { static ClangProjectSettings &getProjectSettings(ProjectExplorer::Project *project) { QTC_CHECK(project); - return ModelManagerSupportClang::instance()->projectSettings(project); + return ClangModelManagerSupport::instance()->projectSettings(project); } ClangEditorDocumentProcessor::ClangEditorDocumentProcessor( diff --git a/src/plugins/clangcodemodel/clangmodelmanagersupport.cpp b/src/plugins/clangcodemodel/clangmodelmanagersupport.cpp index 66abc7913b0..b3ac6005dfc 100644 --- a/src/plugins/clangcodemodel/clangmodelmanagersupport.cpp +++ b/src/plugins/clangcodemodel/clangmodelmanagersupport.cpp @@ -60,14 +60,14 @@ using namespace ClangCodeModel; using namespace ClangCodeModel::Internal; -static ModelManagerSupportClang *m_instance = 0; +static ClangModelManagerSupport *m_instance = 0; static CppTools::CppModelManager *cppModelManager() { return CppTools::CppModelManager::instance(); } -ModelManagerSupportClang::ModelManagerSupportClang() +ClangModelManagerSupport::ClangModelManagerSupport() : m_completionAssistProvider(m_communicator) , m_followSymbol(new ClangFollowSymbol) , m_refactoringEngine(new RefactoringEngine) @@ -82,76 +82,76 @@ ModelManagerSupportClang::ModelManagerSupportClang() Core::EditorManager *editorManager = Core::EditorManager::instance(); connect(editorManager, &Core::EditorManager::editorOpened, - this, &ModelManagerSupportClang::onEditorOpened); + this, &ClangModelManagerSupport::onEditorOpened); connect(editorManager, &Core::EditorManager::currentEditorChanged, - this, &ModelManagerSupportClang::onCurrentEditorChanged); + this, &ClangModelManagerSupport::onCurrentEditorChanged); connect(editorManager, &Core::EditorManager::editorsClosed, - this, &ModelManagerSupportClang::onEditorClosed); + this, &ClangModelManagerSupport::onEditorClosed); CppTools::CppModelManager *modelManager = cppModelManager(); connect(modelManager, &CppTools::CppModelManager::abstractEditorSupportContentsUpdated, - this, &ModelManagerSupportClang::onAbstractEditorSupportContentsUpdated); + this, &ClangModelManagerSupport::onAbstractEditorSupportContentsUpdated); connect(modelManager, &CppTools::CppModelManager::abstractEditorSupportRemoved, - this, &ModelManagerSupportClang::onAbstractEditorSupportRemoved); + this, &ClangModelManagerSupport::onAbstractEditorSupportRemoved); connect(modelManager, &CppTools::CppModelManager::projectPartsUpdated, - this, &ModelManagerSupportClang::onProjectPartsUpdated); + this, &ClangModelManagerSupport::onProjectPartsUpdated); connect(modelManager, &CppTools::CppModelManager::projectPartsRemoved, - this, &ModelManagerSupportClang::onProjectPartsRemoved); + this, &ClangModelManagerSupport::onProjectPartsRemoved); auto *sessionManager = ProjectExplorer::SessionManager::instance(); connect(sessionManager, &ProjectExplorer::SessionManager::projectAdded, - this, &ModelManagerSupportClang::onProjectAdded); + this, &ClangModelManagerSupport::onProjectAdded); connect(sessionManager, &ProjectExplorer::SessionManager::aboutToRemoveProject, - this, &ModelManagerSupportClang::onAboutToRemoveProject); + this, &ClangModelManagerSupport::onAboutToRemoveProject); CppTools::CppCodeModelSettings *settings = CppTools::codeModelSettings().data(); connect(settings, &CppTools::CppCodeModelSettings::clangDiagnosticConfigsInvalidated, - this, &ModelManagerSupportClang::onDiagnosticConfigsInvalidated); + this, &ClangModelManagerSupport::onDiagnosticConfigsInvalidated); } -ModelManagerSupportClang::~ModelManagerSupportClang() +ClangModelManagerSupport::~ClangModelManagerSupport() { QTC_CHECK(m_projectSettings.isEmpty()); m_instance = 0; } -CppTools::CppCompletionAssistProvider *ModelManagerSupportClang::completionAssistProvider() +CppTools::CppCompletionAssistProvider *ClangModelManagerSupport::completionAssistProvider() { return &m_completionAssistProvider; } -TextEditor::BaseHoverHandler *ModelManagerSupportClang::createHoverHandler() +TextEditor::BaseHoverHandler *ClangModelManagerSupport::createHoverHandler() { return new Internal::ClangHoverHandler; } -CppTools::FollowSymbolInterface &ModelManagerSupportClang::followSymbolInterface() +CppTools::FollowSymbolInterface &ClangModelManagerSupport::followSymbolInterface() { return *m_followSymbol; } -CppTools::RefactoringEngineInterface &ModelManagerSupportClang::refactoringEngineInterface() +CppTools::RefactoringEngineInterface &ClangModelManagerSupport::refactoringEngineInterface() { return *m_refactoringEngine; } -std::unique_ptr ModelManagerSupportClang::createOverviewModel() +std::unique_ptr ClangModelManagerSupport::createOverviewModel() { return std::make_unique(); } -void ModelManagerSupportClang::setBackendJobsPostponed(bool postponed) +void ClangModelManagerSupport::setBackendJobsPostponed(bool postponed) { m_communicator.setBackendJobsPostponed(postponed); } -CppTools::BaseEditorDocumentProcessor *ModelManagerSupportClang::createEditorDocumentProcessor( +CppTools::BaseEditorDocumentProcessor *ClangModelManagerSupport::createEditorDocumentProcessor( TextEditor::TextDocument *baseTextDocument) { return new ClangEditorDocumentProcessor(m_communicator, baseTextDocument); } -void ModelManagerSupportClang::onCurrentEditorChanged(Core::IEditor *editor) +void ClangModelManagerSupport::onCurrentEditorChanged(Core::IEditor *editor) { m_communicator.documentVisibilityChanged(); @@ -165,60 +165,60 @@ void ModelManagerSupportClang::onCurrentEditorChanged(Core::IEditor *editor) processor->generateTaskHubIssues(); } -void ModelManagerSupportClang::connectTextDocumentToTranslationUnit(TextEditor::TextDocument *textDocument) +void ClangModelManagerSupport::connectTextDocumentToTranslationUnit(TextEditor::TextDocument *textDocument) { // Handle externally changed documents connect(textDocument, &Core::IDocument::aboutToReload, - this, &ModelManagerSupportClang::onCppDocumentAboutToReloadOnTranslationUnit, + this, &ClangModelManagerSupport::onCppDocumentAboutToReloadOnTranslationUnit, Qt::UniqueConnection); connect(textDocument, &Core::IDocument::reloadFinished, - this, &ModelManagerSupportClang::onCppDocumentReloadFinishedOnTranslationUnit, + this, &ClangModelManagerSupport::onCppDocumentReloadFinishedOnTranslationUnit, Qt::UniqueConnection); // Handle changes from e.g. refactoring actions connectToTextDocumentContentsChangedForTranslationUnit(textDocument); } -void ModelManagerSupportClang::connectTextDocumentToUnsavedFiles(TextEditor::TextDocument *textDocument) +void ClangModelManagerSupport::connectTextDocumentToUnsavedFiles(TextEditor::TextDocument *textDocument) { // Handle externally changed documents connect(textDocument, &Core::IDocument::aboutToReload, - this, &ModelManagerSupportClang::onCppDocumentAboutToReloadOnUnsavedFile, + this, &ClangModelManagerSupport::onCppDocumentAboutToReloadOnUnsavedFile, Qt::UniqueConnection); connect(textDocument, &Core::IDocument::reloadFinished, - this, &ModelManagerSupportClang::onCppDocumentReloadFinishedOnUnsavedFile, + this, &ClangModelManagerSupport::onCppDocumentReloadFinishedOnUnsavedFile, Qt::UniqueConnection); // Handle changes from e.g. refactoring actions connectToTextDocumentContentsChangedForUnsavedFile(textDocument); } -void ModelManagerSupportClang::connectToTextDocumentContentsChangedForTranslationUnit( +void ClangModelManagerSupport::connectToTextDocumentContentsChangedForTranslationUnit( TextEditor::TextDocument *textDocument) { connect(textDocument, &TextEditor::TextDocument::contentsChangedWithPosition, - this, &ModelManagerSupportClang::onCppDocumentContentsChangedOnTranslationUnit, + this, &ClangModelManagerSupport::onCppDocumentContentsChangedOnTranslationUnit, Qt::UniqueConnection); } -void ModelManagerSupportClang::connectToTextDocumentContentsChangedForUnsavedFile( +void ClangModelManagerSupport::connectToTextDocumentContentsChangedForUnsavedFile( TextEditor::TextDocument *textDocument) { connect(textDocument, &TextEditor::TextDocument::contentsChangedWithPosition, - this, &ModelManagerSupportClang::onCppDocumentContentsChangedOnUnsavedFile, + this, &ClangModelManagerSupport::onCppDocumentContentsChangedOnUnsavedFile, Qt::UniqueConnection); } -void ModelManagerSupportClang::connectToWidgetsMarkContextMenuRequested(QWidget *editorWidget) +void ClangModelManagerSupport::connectToWidgetsMarkContextMenuRequested(QWidget *editorWidget) { const auto widget = qobject_cast(editorWidget); if (widget) { connect(widget, &TextEditor::TextEditorWidget::markContextMenuRequested, - this, &ModelManagerSupportClang::onTextMarkContextMenuRequested); + this, &ClangModelManagerSupport::onTextMarkContextMenuRequested); } } -bool ModelManagerSupportClang::eventFilter(QObject *obj, QEvent *e) +bool ClangModelManagerSupport::eventFilter(QObject *obj, QEvent *e) { if (obj == QApplication::instance() && e->type() == QEvent::ApplicationStateChange) { switch (QApplication::applicationState()) { @@ -232,7 +232,7 @@ bool ModelManagerSupportClang::eventFilter(QObject *obj, QEvent *e) return false; } -void ModelManagerSupportClang::onEditorOpened(Core::IEditor *editor) +void ClangModelManagerSupport::onEditorOpened(Core::IEditor *editor) { QTC_ASSERT(editor, return); Core::IDocument *document = editor->document(); @@ -247,19 +247,19 @@ void ModelManagerSupportClang::onEditorOpened(Core::IEditor *editor) } } -void ModelManagerSupportClang::onEditorClosed(const QList &) +void ClangModelManagerSupport::onEditorClosed(const QList &) { m_communicator.documentVisibilityChanged(); } -void ModelManagerSupportClang::onCppDocumentAboutToReloadOnTranslationUnit() +void ClangModelManagerSupport::onCppDocumentAboutToReloadOnTranslationUnit() { TextEditor::TextDocument *textDocument = qobject_cast(sender()); disconnect(textDocument, &TextEditor::TextDocument::contentsChangedWithPosition, - this, &ModelManagerSupportClang::onCppDocumentContentsChangedOnTranslationUnit); + this, &ClangModelManagerSupport::onCppDocumentContentsChangedOnTranslationUnit); } -void ModelManagerSupportClang::onCppDocumentReloadFinishedOnTranslationUnit(bool success) +void ClangModelManagerSupport::onCppDocumentReloadFinishedOnTranslationUnit(bool success) { if (success) { TextEditor::TextDocument *textDocument = qobject_cast(sender()); @@ -277,7 +277,7 @@ void clearDiagnosticFixIts(const QString &filePath) } } -void ModelManagerSupportClang::onCppDocumentContentsChangedOnTranslationUnit(int position, +void ClangModelManagerSupport::onCppDocumentContentsChangedOnTranslationUnit(int position, int /*charsRemoved*/, int /*charsAdded*/) { @@ -290,14 +290,14 @@ void ModelManagerSupportClang::onCppDocumentContentsChangedOnTranslationUnit(int clearDiagnosticFixIts(document->filePath().toString()); } -void ModelManagerSupportClang::onCppDocumentAboutToReloadOnUnsavedFile() +void ClangModelManagerSupport::onCppDocumentAboutToReloadOnUnsavedFile() { TextEditor::TextDocument *textDocument = qobject_cast(sender()); disconnect(textDocument, &TextEditor::TextDocument::contentsChangedWithPosition, - this, &ModelManagerSupportClang::onCppDocumentContentsChangedOnUnsavedFile); + this, &ClangModelManagerSupport::onCppDocumentContentsChangedOnUnsavedFile); } -void ModelManagerSupportClang::onCppDocumentReloadFinishedOnUnsavedFile(bool success) +void ClangModelManagerSupport::onCppDocumentReloadFinishedOnUnsavedFile(bool success) { if (success) { TextEditor::TextDocument *textDocument = qobject_cast(sender()); @@ -306,13 +306,13 @@ void ModelManagerSupportClang::onCppDocumentReloadFinishedOnUnsavedFile(bool suc } } -void ModelManagerSupportClang::onCppDocumentContentsChangedOnUnsavedFile() +void ClangModelManagerSupport::onCppDocumentContentsChangedOnUnsavedFile() { Core::IDocument *document = qobject_cast(sender()); m_communicator.unsavedFilesUpdated(document); } -void ModelManagerSupportClang::onAbstractEditorSupportContentsUpdated(const QString &filePath, +void ClangModelManagerSupport::onAbstractEditorSupportContentsUpdated(const QString &filePath, const QByteArray &content) { QTC_ASSERT(!filePath.isEmpty(), return); @@ -321,7 +321,7 @@ void ModelManagerSupportClang::onAbstractEditorSupportContentsUpdated(const QStr m_communicator.unsavedFilesUpdated(mappedPath, content, 0); } -void ModelManagerSupportClang::onAbstractEditorSupportRemoved(const QString &filePath) +void ClangModelManagerSupport::onAbstractEditorSupportRemoved(const QString &filePath) { QTC_ASSERT(!filePath.isEmpty(), return); @@ -358,7 +358,7 @@ static TextEditor::AssistInterface createAssistInterface(TextEditor::TextEditorW TextEditor::IdleEditor); } -void ModelManagerSupportClang::onTextMarkContextMenuRequested(TextEditor::TextEditorWidget *widget, +void ClangModelManagerSupport::onTextMarkContextMenuRequested(TextEditor::TextEditorWidget *widget, int lineNumber, QMenu *menu) { @@ -402,7 +402,7 @@ static void updateProcessors(const ClangEditorDocumentProcessors &processors) modelManager->updateCppEditorDocuments(/*projectsUpdated=*/ false); } -void ModelManagerSupportClang::onProjectAdded(ProjectExplorer::Project *project) +void ClangModelManagerSupport::onProjectAdded(ProjectExplorer::Project *project) { QTC_ASSERT(!m_projectSettings.value(project), return); @@ -414,7 +414,7 @@ void ModelManagerSupportClang::onProjectAdded(ProjectExplorer::Project *project) m_projectSettings.insert(project, settings); } -void ModelManagerSupportClang::onAboutToRemoveProject(ProjectExplorer::Project *project) +void ClangModelManagerSupport::onAboutToRemoveProject(ProjectExplorer::Project *project) { ClangProjectSettings * const settings = m_projectSettings.value(project); QTC_ASSERT(settings, return); @@ -422,7 +422,7 @@ void ModelManagerSupportClang::onAboutToRemoveProject(ProjectExplorer::Project * delete settings; } -void ModelManagerSupportClang::onProjectPartsUpdated(ProjectExplorer::Project *project) +void ClangModelManagerSupport::onProjectPartsUpdated(ProjectExplorer::Project *project) { QTC_ASSERT(project, return); const CppTools::ProjectInfo projectInfo = cppModelManager()->projectInfo(project); @@ -434,7 +434,7 @@ void ModelManagerSupportClang::onProjectPartsUpdated(ProjectExplorer::Project *p onProjectPartsRemoved(projectPartIds); } -void ModelManagerSupportClang::onProjectPartsRemoved(const QStringList &projectPartIds) +void ClangModelManagerSupport::onProjectPartsRemoved(const QStringList &projectPartIds) { if (!projectPartIds.isEmpty()) reinitializeBackendDocuments(projectPartIds); @@ -448,7 +448,7 @@ static ClangEditorDocumentProcessors clangProcessorsWithDiagnosticConfig( }); } -void ModelManagerSupportClang::onDiagnosticConfigsInvalidated(const QVector &configIds) +void ClangModelManagerSupport::onDiagnosticConfigsInvalidated(const QVector &configIds) { updateProcessors(clangProcessorsWithDiagnosticConfig(configIds)); } @@ -461,7 +461,7 @@ clangProcessorsWithProjectParts(const QStringList &projectPartIds) }); } -void ModelManagerSupportClang::reinitializeBackendDocuments(const QStringList &projectPartIds) +void ClangModelManagerSupport::reinitializeBackendDocuments(const QStringList &projectPartIds) { const auto processors = clangProcessorsWithProjectParts(projectPartIds); foreach (ClangEditorDocumentProcessor *processor, processors) { @@ -471,45 +471,45 @@ void ModelManagerSupportClang::reinitializeBackendDocuments(const QStringList &p } } -ModelManagerSupportClang *ModelManagerSupportClang::instance() +ClangModelManagerSupport *ClangModelManagerSupport::instance() { return m_instance; } -BackendCommunicator &ModelManagerSupportClang::communicator() +BackendCommunicator &ClangModelManagerSupport::communicator() { return m_communicator; } -QString ModelManagerSupportClang::dummyUiHeaderOnDiskPath(const QString &filePath) const +QString ClangModelManagerSupport::dummyUiHeaderOnDiskPath(const QString &filePath) const { return m_uiHeaderOnDiskManager.mapPath(filePath); } -ClangProjectSettings &ModelManagerSupportClang::projectSettings( +ClangProjectSettings &ClangModelManagerSupport::projectSettings( ProjectExplorer::Project *project) const { return *m_projectSettings.value(project); } -QString ModelManagerSupportClang::dummyUiHeaderOnDiskDirPath() const +QString ClangModelManagerSupport::dummyUiHeaderOnDiskDirPath() const { return m_uiHeaderOnDiskManager.directoryPath(); } -QString ModelManagerSupportProviderClang::id() const +QString ClangModelManagerSupportProvider::id() const { return QLatin1String(Constants::CLANG_MODELMANAGERSUPPORT_ID); } -QString ModelManagerSupportProviderClang::displayName() const +QString ClangModelManagerSupportProvider::displayName() const { //: Display name return QCoreApplication::translate("ClangCodeModel::Internal::ModelManagerSupport", "Clang"); } -CppTools::ModelManagerSupport::Ptr ModelManagerSupportProviderClang::createModelManagerSupport() +CppTools::ModelManagerSupport::Ptr ClangModelManagerSupportProvider::createModelManagerSupport() { - return CppTools::ModelManagerSupport::Ptr(new ModelManagerSupportClang); + return CppTools::ModelManagerSupport::Ptr(new ClangModelManagerSupport); } diff --git a/src/plugins/clangcodemodel/clangmodelmanagersupport.h b/src/plugins/clangcodemodel/clangmodelmanagersupport.h index 9578804ebb6..90570402cc7 100644 --- a/src/plugins/clangcodemodel/clangmodelmanagersupport.h +++ b/src/plugins/clangcodemodel/clangmodelmanagersupport.h @@ -55,15 +55,15 @@ namespace Internal { class ClangProjectSettings; -class ModelManagerSupportClang: +class ClangModelManagerSupport: public QObject, public CppTools::ModelManagerSupport { Q_OBJECT public: - ModelManagerSupportClang(); - ~ModelManagerSupportClang() override; + ClangModelManagerSupport(); + ~ClangModelManagerSupport() override; CppTools::CppCompletionAssistProvider *completionAssistProvider() override; TextEditor::BaseHoverHandler *createHoverHandler() override; @@ -80,7 +80,7 @@ public: ClangProjectSettings &projectSettings(ProjectExplorer::Project *project) const; - static ModelManagerSupportClang *instance(); + static ClangModelManagerSupport *instance(); private: bool eventFilter(QObject *obj, QEvent *e) override; @@ -131,7 +131,7 @@ private: QHash m_projectSettings; }; -class ModelManagerSupportProviderClang : public CppTools::ModelManagerSupportProvider +class ClangModelManagerSupportProvider : public CppTools::ModelManagerSupportProvider { public: QString id() const override; diff --git a/src/plugins/clangcodemodel/clangprojectsettingswidget.cpp b/src/plugins/clangcodemodel/clangprojectsettingswidget.cpp index f8fcd68babe..2e0db6b6bcb 100644 --- a/src/plugins/clangcodemodel/clangprojectsettingswidget.cpp +++ b/src/plugins/clangcodemodel/clangprojectsettingswidget.cpp @@ -53,7 +53,7 @@ static Core::Id configIdForProject(ClangProjectSettings &projectSettings) } ClangProjectSettingsWidget::ClangProjectSettingsWidget(ProjectExplorer::Project *project) - : m_projectSettings(ModelManagerSupportClang::instance()->projectSettings(project)) + : m_projectSettings(ClangModelManagerSupport::instance()->projectSettings(project)) { m_ui.setupUi(this); diff --git a/src/plugins/clangcodemodel/clangutils.cpp b/src/plugins/clangcodemodel/clangutils.cpp index 62c78f8c6d0..9ae6ea7d595 100644 --- a/src/plugins/clangcodemodel/clangutils.cpp +++ b/src/plugins/clangcodemodel/clangutils.cpp @@ -95,7 +95,7 @@ public: private: void addDummyUiHeaderOnDiskIncludePath() { - const QString path = ModelManagerSupportClang::instance()->dummyUiHeaderOnDiskDirPath(); + const QString path = ClangModelManagerSupport::instance()->dummyUiHeaderOnDiskDirPath(); if (!path.isEmpty()) { add("-I"); add(QDir::toNativeSeparators(path)); diff --git a/src/plugins/cpptools/cppmodelmanagersupportinternal.cpp b/src/plugins/cpptools/cppbuiltinmodelmanagersupport.cpp similarity index 70% rename from src/plugins/cpptools/cppmodelmanagersupportinternal.cpp rename to src/plugins/cpptools/cppbuiltinmodelmanagersupport.cpp index 2bf4ac27009..8aead44395f 100644 --- a/src/plugins/cpptools/cppmodelmanagersupportinternal.cpp +++ b/src/plugins/cpptools/cppbuiltinmodelmanagersupport.cpp @@ -24,7 +24,7 @@ ****************************************************************************/ #include "cppcompletionassist.h" -#include "cppmodelmanagersupportinternal.h" +#include "cppbuiltinmodelmanagersupport.h" #include "cppfollowsymbolundercursor.h" #include "cpphoverhandler.h" #include "cppoverviewmodel.h" @@ -38,60 +38,60 @@ using namespace CppTools; using namespace CppTools::Internal; -QString ModelManagerSupportProviderInternal::id() const +QString BuiltinModelManagerSupportProvider::id() const { return QLatin1String("CppTools.BuiltinCodeModel"); } -QString ModelManagerSupportProviderInternal::displayName() const +QString BuiltinModelManagerSupportProvider::displayName() const { return QCoreApplication::translate("ModelManagerSupportInternal::displayName", "%1 Built-in").arg(Core::Constants::IDE_DISPLAY_NAME); } -ModelManagerSupport::Ptr ModelManagerSupportProviderInternal::createModelManagerSupport() +ModelManagerSupport::Ptr BuiltinModelManagerSupportProvider::createModelManagerSupport() { - return ModelManagerSupport::Ptr(new ModelManagerSupportInternal); + return ModelManagerSupport::Ptr(new BuiltinModelManagerSupport); } -ModelManagerSupportInternal::ModelManagerSupportInternal() +BuiltinModelManagerSupport::BuiltinModelManagerSupport() : m_completionAssistProvider(new InternalCompletionAssistProvider), m_followSymbol(new FollowSymbolUnderCursor), m_refactoringEngine(new CppRefactoringEngine) { } -ModelManagerSupportInternal::~ModelManagerSupportInternal() +BuiltinModelManagerSupport::~BuiltinModelManagerSupport() { } -BaseEditorDocumentProcessor *ModelManagerSupportInternal::createEditorDocumentProcessor( +BaseEditorDocumentProcessor *BuiltinModelManagerSupport::createEditorDocumentProcessor( TextEditor::TextDocument *baseTextDocument) { return new BuiltinEditorDocumentProcessor(baseTextDocument); } -CppCompletionAssistProvider *ModelManagerSupportInternal::completionAssistProvider() +CppCompletionAssistProvider *BuiltinModelManagerSupport::completionAssistProvider() { return m_completionAssistProvider.data(); } -TextEditor::BaseHoverHandler *ModelManagerSupportInternal::createHoverHandler() +TextEditor::BaseHoverHandler *BuiltinModelManagerSupport::createHoverHandler() { return new CppHoverHandler; } -FollowSymbolInterface &ModelManagerSupportInternal::followSymbolInterface() +FollowSymbolInterface &BuiltinModelManagerSupport::followSymbolInterface() { return *m_followSymbol; } -RefactoringEngineInterface &ModelManagerSupportInternal::refactoringEngineInterface() +RefactoringEngineInterface &BuiltinModelManagerSupport::refactoringEngineInterface() { return *m_refactoringEngine; } -std::unique_ptr ModelManagerSupportInternal::createOverviewModel() +std::unique_ptr BuiltinModelManagerSupport::createOverviewModel() { return std::make_unique(); } diff --git a/src/plugins/cpptools/cppmodelmanagersupportinternal.h b/src/plugins/cpptools/cppbuiltinmodelmanagersupport.h similarity index 89% rename from src/plugins/cpptools/cppmodelmanagersupportinternal.h rename to src/plugins/cpptools/cppbuiltinmodelmanagersupport.h index b01f38f4b88..93707d465a1 100644 --- a/src/plugins/cpptools/cppmodelmanagersupportinternal.h +++ b/src/plugins/cpptools/cppbuiltinmodelmanagersupport.h @@ -32,13 +32,13 @@ namespace CppTools { namespace Internal { -class ModelManagerSupportInternal: public ModelManagerSupport +class BuiltinModelManagerSupport: public ModelManagerSupport { - Q_DISABLE_COPY(ModelManagerSupportInternal) + Q_DISABLE_COPY(BuiltinModelManagerSupport) public: - ModelManagerSupportInternal(); - virtual ~ModelManagerSupportInternal(); + BuiltinModelManagerSupport(); + virtual ~BuiltinModelManagerSupport(); CppCompletionAssistProvider *completionAssistProvider() final; TextEditor::BaseHoverHandler *createHoverHandler() final; @@ -55,7 +55,7 @@ private: QScopedPointer m_refactoringEngine; }; -class ModelManagerSupportProviderInternal : public ModelManagerSupportProvider +class BuiltinModelManagerSupportProvider : public ModelManagerSupportProvider { public: QString id() const override; diff --git a/src/plugins/cpptools/cppmodelmanager.cpp b/src/plugins/cpptools/cppmodelmanager.cpp index 603ff3174b9..10fbbcf11e9 100644 --- a/src/plugins/cpptools/cppmodelmanager.cpp +++ b/src/plugins/cpptools/cppmodelmanager.cpp @@ -38,7 +38,7 @@ #include "cppindexingsupport.h" #include "cpplocatordata.h" #include "cpplocatorfilter.h" -#include "cppmodelmanagersupportinternal.h" +#include "cppbuiltinmodelmanagersupport.h" #include "cppqtstyleindenter.h" #include "cpprefactoringchanges.h" #include "cpprefactoringengine.h" @@ -502,7 +502,7 @@ void CppModelManager::initCppTools() void CppModelManager::initializeBuiltinModelManagerSupport() { d->m_builtinModelManagerSupport - = ModelManagerSupportProviderInternal().createModelManagerSupport(); + = BuiltinModelManagerSupportProvider().createModelManagerSupport(); d->m_activeModelManagerSupport = d->m_builtinModelManagerSupport; d->m_refactoringEngines[RefactoringEngineType::BuiltIn] = &d->m_activeModelManagerSupport->refactoringEngineInterface(); diff --git a/src/plugins/cpptools/cpptools.pro b/src/plugins/cpptools/cpptools.pro index c73fba75f36..32c65b02040 100644 --- a/src/plugins/cpptools/cpptools.pro +++ b/src/plugins/cpptools/cpptools.pro @@ -48,7 +48,6 @@ HEADERS += \ cpplocatorfilter.h \ cppmodelmanager.h \ cppmodelmanagersupport.h \ - cppmodelmanagersupportinternal.h \ cppoverviewmodel.h \ cpppointerdeclarationformatter.h \ cppprojectfile.h \ @@ -101,7 +100,8 @@ HEADERS += \ wrappablelineedit.h \ usages.h \ cpptools_clangtidychecks.h \ - cppmodelmanagerinterface.h + cppmodelmanagerinterface.h \ + cppbuiltinmodelmanagersupport.h SOURCES += \ abstracteditorsupport.cpp \ @@ -146,7 +146,6 @@ SOURCES += \ cpplocatorfilter.cpp \ cppmodelmanager.cpp \ cppmodelmanagersupport.cpp \ - cppmodelmanagersupportinternal.cpp \ cppoverviewmodel.cpp \ cpppointerdeclarationformatter.cpp \ cppprojectfile.cpp \ @@ -187,7 +186,8 @@ SOURCES += \ compileroptionsbuilder.cpp \ cppprojectfilecategorizer.cpp \ cppprojectpartchooser.cpp \ - wrappablelineedit.cpp + wrappablelineedit.cpp \ + cppbuiltinmodelmanagersupport.cpp FORMS += \ clangdiagnosticconfigswidget.ui \ diff --git a/src/plugins/cpptools/cpptools.qbs b/src/plugins/cpptools/cpptools.qbs index 9020ce2e5e6..6659ddf922b 100644 --- a/src/plugins/cpptools/cpptools.qbs +++ b/src/plugins/cpptools/cpptools.qbs @@ -56,6 +56,8 @@ Project { "clazychecks.ui", "compileroptionsbuilder.cpp", "compileroptionsbuilder.h", + "cppbuiltinmodelmanagersupport.cpp", + "cppbuiltinmodelmanagersupport.h", "cppcanonicalsymbol.cpp", "cppcanonicalsymbol.h", "cppchecksymbols.cpp", @@ -123,8 +125,6 @@ Project { "cppmodelmanager.h", "cppmodelmanagersupport.cpp", "cppmodelmanagersupport.h", - "cppmodelmanagersupportinternal.cpp", - "cppmodelmanagersupportinternal.h", "cppoverviewmodel.cpp", "cppoverviewmodel.h", "cpppointerdeclarationformatter.cpp", @@ -215,7 +215,7 @@ Project { "tidychecks.ui", "typehierarchybuilder.cpp", "typehierarchybuilder.h", - "usages.h" + "usages.h", ] Group { From 4599a9b433dea0061b7d0befc72de2b9d500fcb3 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Mon, 22 Oct 2018 15:53:53 +0200 Subject: [PATCH 17/38] Doc: Describe changing default editors in MIME type settings Change-Id: I8d9b9400932c564248f5b654cc72c4c794c778ec Reviewed-by: Eike Ziller --- doc/images/qtcreator-mime-types.png | Bin 11596 -> 50544 bytes .../creator-only/creator-mime-types.qdoc | 12 ++++++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/doc/images/qtcreator-mime-types.png b/doc/images/qtcreator-mime-types.png index 5d53b80898a396455ffbcb2bfbfe2af93bfe65e6..fc453ff13670b6a3c36bbe3aa2ee5e8114ddbbb7 100644 GIT binary patch literal 50544 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 z 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 literal 11596 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 diff --git a/doc/src/editors/creator-only/creator-mime-types.qdoc b/doc/src/editors/creator-only/creator-mime-types.qdoc index de456957259..553f47778c2 100644 --- a/doc/src/editors/creator-only/creator-mime-types.qdoc +++ b/doc/src/editors/creator-only/creator-mime-types.qdoc @@ -41,6 +41,8 @@ {MIME type} of the file to determine which mode and editor to use for opening the file. For example, \QC opens C++ source and header files in the C++ editor, and Qt widget based UI files (.ui) in \QD. + For some MIME types, you can change the editor that is used to open the + files of that type by default. To identify the MIME type of a file, \QC uses matching by pattern and matching by contents. First, \QC looks at the filename to check whether it @@ -94,12 +96,18 @@ \note You are recommended not to change the range and priority, because it might cause problems when opening files in \QC. + \li In \uicontrol Handler, double-click the editor name to display a + context-menu where you can select another editor to open the file + in by default. The menu is available only if alternative suitable + editors are available. + \li Click \uicontrol OK. \endlist - To revert all the changes you have made to the MIME type definitions, - select \uicontrol {Reset All}. + To revert the changes you have made to the MIME type definitions, + select \uicontrol {Reset MIME Types}. To revert the changes you have + made to the default editors, select \uicontrol {Reset Handlers}. \note If you now select \uicontrol OK or \uicontrol Apply, you permanently lose all your own patterns and magic headers. The changes are reverted the next From 29f64ea2fa306c8d237bd937703350f9b404662b Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Fri, 19 Oct 2018 16:16:39 +0200 Subject: [PATCH 18/38] SSH: Add missing check in key exchange reply handler We claimed to support the diffie-hellman-group14-sha1 protocol, but forgot to actually handle it. Change-Id: I3193997d7270328700486a15a6281ebf8528ed56 Reviewed-by: Ulf Hermann --- src/libs/ssh/sshincomingpacket.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/libs/ssh/sshincomingpacket.cpp b/src/libs/ssh/sshincomingpacket.cpp index d8c6356a0b3..a105efb48fb 100644 --- a/src/libs/ssh/sshincomingpacket.cpp +++ b/src/libs/ssh/sshincomingpacket.cpp @@ -203,7 +203,8 @@ SshKeyExchangeReply SshIncomingPacket::extractKeyExchangeReply(const QByteArray throw SshPacketParseException(); getHostKeySpecificReplyData(replyData, hostKeyAlgo, replyData.k_s.mid(k_sOffset)); - if (kexAlgo == SshCapabilities::DiffieHellmanGroup1Sha1) { + if (kexAlgo == SshCapabilities::DiffieHellmanGroup1Sha1 + || kexAlgo == SshCapabilities::DiffieHellmanGroup14Sha1) { replyData.f = SshPacketParser::asBigInt(m_data, &topLevelOffset); } else { QSSH_ASSERT_AND_RETURN_VALUE(kexAlgo.startsWith(SshCapabilities::EcdhKexNamePrefix), From b605ad61bc17f1d7f3daf900e477ffb7bbaa1417 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Mon, 22 Oct 2018 11:28:36 +0200 Subject: [PATCH 19/38] iOS: Work around mismatch of USB serial and iOS device id Currently we track connection of devices in the iOS plugin via USB, using the USB serial number as a device identifier (iosdevice.h/cpp). On the other side, iostool uses the MobileDevice framework to identify iOS devices (iosdevicemanager.h/cpp). The assumption that the two identifiers are the same seems to be no longer true with the iPhone XS devices. These have a device identifier that contains a dash that is not present in the USB serial number. As a hotfix, just remove any dashes from the identifier on the iostool side because we only use it for the lookup deviceId -> AMDeviceRef anyhow. The longer term fix should be to use MobileDevice framework for the connection tracking of devices on the iOS plugin side as well, instead on relying on questionable assumptions. Change-Id: Iac3115a1c3f43a4f9e159aaa4ded1c671c55d888 Fixes: QTCREATORBUG-21291 Reviewed-by: Jason Hihn Reviewed-by: Vikas Pachdha --- src/tools/iostool/iosdevicemanager.cpp | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/tools/iostool/iosdevicemanager.cpp b/src/tools/iostool/iosdevicemanager.cpp index bfc493ad5af..53a9fd1625a 100644 --- a/src/tools/iostool/iosdevicemanager.cpp +++ b/src/tools/iostool/iosdevicemanager.cpp @@ -423,6 +423,7 @@ public: void requestDeviceInfo(const QString &deviceId, int timeout); QStringList errors(); void addError(QString errorMsg); + QString deviceId(AMDeviceRef device); void addDevice(AMDeviceRef device); void removeDevice(AMDeviceRef device); void checkPendingLookups(); @@ -654,11 +655,18 @@ void IosDeviceManagerPrivate::addError(QString errorMsg) emit q->errorMsg(errorMsg); } -void IosDeviceManagerPrivate::addDevice(AMDeviceRef device) +QString IosDeviceManagerPrivate::deviceId(AMDeviceRef device) { CFStringRef s = m_lib.deviceCopyDeviceIdentifier(device); - QString devId = QString::fromCFString(s); + // remove dashes as a hotfix for QTCREATORBUG-21291 + const auto id = QString::fromCFString(s).remove('-'); if (s) CFRelease(s); + return id; +} + +void IosDeviceManagerPrivate::addDevice(AMDeviceRef device) +{ + const QString devId = deviceId(device); CFRetain(device); DeviceInterfaceType interfaceType = static_cast(lib()->deviceGetInterfaceType(device)); @@ -703,10 +711,7 @@ void IosDeviceManagerPrivate::addDevice(AMDeviceRef device) void IosDeviceManagerPrivate::removeDevice(AMDeviceRef device) { - CFStringRef s = m_lib.deviceCopyDeviceIdentifier(device); - QString devId = QString::fromCFString(s); - if (s) - CFRelease(s); + const QString devId = deviceId(device); if (debugAll) qDebug() << "removeDevice " << devId; if (m_devices.contains(devId)) { From 7ae7f921aba238c0dc195c2c3dbd934e4e609f9d Mon Sep 17 00:00:00 2001 From: Robert Loehning Date: Mon, 22 Oct 2018 17:19:59 +0200 Subject: [PATCH 20/38] Android: Move HTML out of translated string Change-Id: Id5ec3ef43fec1d81b6a9e976732d58ab6f6a461d Reviewed-by: hjk Reviewed-by: Vikas Pachdha --- src/plugins/android/androidbuildapkwidget.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/plugins/android/androidbuildapkwidget.cpp b/src/plugins/android/androidbuildapkwidget.cpp index d436a38827e..5e865347aa8 100644 --- a/src/plugins/android/androidbuildapkwidget.cpp +++ b/src/plugins/android/androidbuildapkwidget.cpp @@ -135,7 +135,7 @@ AndroidBuildApkInnerWidget::~AndroidBuildApkInnerWidget() QString AndroidBuildApkInnerWidget::displayName() const { - return tr("Build Android APK"); + return "" + tr("Build Android APK") + ""; } QString AndroidBuildApkInnerWidget::summaryText() const @@ -324,7 +324,7 @@ void AndroidBuildApkWidget::checkEnableRemoveButton() QString AndroidBuildApkWidget::summaryText() const { - return tr("Build Android APK"); + return "" + tr("Build Android APK") + ""; } QString AndroidBuildApkWidget::displayName() const From 4032f6383a411768ddf6e6059aaed6c552fb65da Mon Sep 17 00:00:00 2001 From: Robert Loehning Date: Mon, 22 Oct 2018 16:34:31 +0200 Subject: [PATCH 21/38] Fix frequent typo can not -> cannot Change-Id: Ie872ada1bc9b4ed64bffb667c2e44dbb13b4ad11 Reviewed-by: Leena Miettinen --- .../qmlpuppet/qml2puppet/instances/objectnodeinstance.cpp | 2 +- src/app/main.cpp | 2 +- src/libs/qtcreatorcdbext/containers.cpp | 2 +- src/libs/qtcreatorcdbext/pycdbextmodule.cpp | 4 ++-- src/libs/sqlite/sqlitedatabasebackend.cpp | 2 +- src/plugins/android/androidconfigurations.cpp | 6 +++--- src/plugins/android/androidmanager.cpp | 2 +- src/plugins/android/androidrunnerworker.cpp | 2 +- src/plugins/android/androidsdkmanager.cpp | 4 ++-- src/plugins/android/androidsignaloperation.cpp | 4 ++-- src/plugins/cmakeprojectmanager/cmakekitinformation.cpp | 2 +- src/plugins/cmakeprojectmanager/cmakeproject.cpp | 6 +++--- src/plugins/coreplugin/idocument.cpp | 2 +- src/plugins/coreplugin/infobar.cpp | 2 +- src/plugins/debugger/cdb/cdbengine.cpp | 4 ++-- src/plugins/ios/iosbuildsettingswidget.cpp | 2 +- src/plugins/ios/simulatorcontrol.cpp | 6 +++--- src/plugins/projectexplorer/buildconfiguration.h | 2 +- src/plugins/projectexplorer/gcctoolchain.cpp | 2 +- src/plugins/projectexplorer/gnumakeparser.cpp | 2 +- src/plugins/projectexplorer/jsonwizard/jsonwizard.cpp | 2 +- src/plugins/projectexplorer/osparser.cpp | 2 +- src/plugins/projectexplorer/userfileaccessor.cpp | 2 +- .../qmldesigner/designercore/model/abstractproperty.cpp | 2 +- src/plugins/qmldesigner/switchsplittabwidget.cpp | 2 +- src/plugins/qtsupport/baseqtversion.cpp | 2 +- src/plugins/subversion/subversionclient.cpp | 2 +- src/tools/sdktool/addkitoperation.cpp | 2 +- tests/auto/utils/fileutils/tst_fileutils.cpp | 4 ++-- 29 files changed, 40 insertions(+), 40 deletions(-) diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/objectnodeinstance.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/objectnodeinstance.cpp index 18e36270ce5..7af165a9c6e 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/objectnodeinstance.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/objectnodeinstance.cpp @@ -396,7 +396,7 @@ QVariant ObjectNodeInstance::convertEnumToValue(const QVariant &value, const Pro QQmlExpression expression(context(), object(), enumeration.toString()); adjustedValue = expression.evaluate(); if (expression.hasError()) - qDebug() << "Enumeration can not be evaluated:" << object() << name << enumeration; + qDebug() << "Enumeration cannot be evaluated:" << object() << name << enumeration; } return adjustedValue; } diff --git a/src/app/main.cpp b/src/app/main.cpp index 9c61cb323d9..0400f523c36 100644 --- a/src/app/main.cpp +++ b/src/app/main.cpp @@ -185,7 +185,7 @@ static inline int askMsgSendFailed() QMessageBox::Retry); } -// taken from utils/fileutils.cpp. We can not use utils here since that depends app_version.h. +// taken from utils/fileutils.cpp. We cannot use utils here since that depends app_version.h. static bool copyRecursively(const QString &srcFilePath, const QString &tgtFilePath) { diff --git a/src/libs/qtcreatorcdbext/containers.cpp b/src/libs/qtcreatorcdbext/containers.cpp index 7ea4a2ddafe..809259f04d9 100644 --- a/src/libs/qtcreatorcdbext/containers.cpp +++ b/src/libs/qtcreatorcdbext/containers.cpp @@ -77,7 +77,7 @@ static inline std::string fixInnerType(const std::string &type, std::string stripped = SymbolGroupValue::stripConst(SymbolGroupValue::stripClassPrefixes(type)); - // Unfortunately the cdb can not handle the vc exclusiv 64 bit integer + // Unfortunately the cdb cannot handle the vc exclusiv 64 bit integer // "__int64" but works fine with "int64", so we have to strip down "__" const size_t __int64pos = stripped.find("__int64"); if (__int64pos != std::string::npos) diff --git a/src/libs/qtcreatorcdbext/pycdbextmodule.cpp b/src/libs/qtcreatorcdbext/pycdbextmodule.cpp index ef47f383687..fc55076ea68 100644 --- a/src/libs/qtcreatorcdbext/pycdbextmodule.cpp +++ b/src/libs/qtcreatorcdbext/pycdbextmodule.cpp @@ -352,7 +352,7 @@ static PyObject *cdbext_reportResult(PyObject *, PyObject *args) static PyMethodDef cdbextMethods[] = { {"parseAndEvaluate", cdbext_parseAndEvaluate, METH_VARARGS, - "Returns value of expression or None if the expression can not be resolved"}, + "Returns value of expression or None if the expression cannot be resolved"}, {"resolveSymbol", cdbext_resolveSymbol, METH_VARARGS, "Returns a list of symbol names matching the given pattern"}, {"getNameByAddress", cdbext_getNameByAddress, METH_VARARGS, @@ -360,7 +360,7 @@ static PyMethodDef cdbextMethods[] = { {"getAddressByName", cdbext_getAddressByName, METH_VARARGS, "Returns the address of the symbol with the given name"}, {"lookupType", cdbext_lookupType, METH_VARARGS, - "Returns type object or None if the type can not be resolved"}, + "Returns type object or None if the type cannot be resolved"}, {"listOfLocals", cdbext_listOfLocals, METH_VARARGS, "Returns list of values that are currently in scope"}, {"listOfModules", cdbext_listOfModules, METH_NOARGS, diff --git a/src/libs/sqlite/sqlitedatabasebackend.cpp b/src/libs/sqlite/sqlitedatabasebackend.cpp index 0e088c549df..a42564aca56 100644 --- a/src/libs/sqlite/sqlitedatabasebackend.cpp +++ b/src/libs/sqlite/sqlitedatabasebackend.cpp @@ -241,7 +241,7 @@ void DatabaseBackend::cacheTextEncoding() void DatabaseBackend::checkForOpenDatabaseWhichCanBeClosed() { if (m_databaseHandle == nullptr) - throw DatabaseIsAlreadyClosed("SqliteDatabaseBackend::close: database is not open so it can not be closed."); + throw DatabaseIsAlreadyClosed("SqliteDatabaseBackend::close: database is not open so it cannot be closed."); } void DatabaseBackend::checkDatabaseClosing(int resultCode) diff --git a/src/plugins/android/androidconfigurations.cpp b/src/plugins/android/androidconfigurations.cpp index b3420536449..3da456cf377 100644 --- a/src/plugins/android/androidconfigurations.cpp +++ b/src/plugins/android/androidconfigurations.cpp @@ -793,7 +793,7 @@ QVersionNumber AndroidConfig::ndkVersion() const { QVersionNumber version; if (!m_ndkLocation.exists()) { - qCDebug(avdConfigLog) << "Can not find ndk version. Check NDK path." + qCDebug(avdConfigLog) << "Cannot find ndk version. Check NDK path." << m_ndkLocation.toString(); return version; } @@ -826,11 +826,11 @@ QVersionNumber AndroidConfig::ndkVersion() const version = QVersionNumber::fromString(QString("%1.%2.0").arg(major) .arg((int)minor[0].toLatin1() - 97)); } else { - qCDebug(avdConfigLog) << "Can not find ndk version. Can not parse RELEASE.TXT." + qCDebug(avdConfigLog) << "Cannot find ndk version. Cannot parse RELEASE.TXT." << content; } } else { - qCDebug(avdConfigLog) << "Can not find ndk version." << errorString; + qCDebug(avdConfigLog) << "Cannot find ndk version." << errorString; } } return version; diff --git a/src/plugins/android/androidmanager.cpp b/src/plugins/android/androidmanager.cpp index eb453c7476b..2ce812d6753 100644 --- a/src/plugins/android/androidmanager.cpp +++ b/src/plugins/android/androidmanager.cpp @@ -218,7 +218,7 @@ QString AndroidManager::activityName(ProjectExplorer::Target *target) /*! Returns the minimum Android API level set for the APK. Minimum API level - of the kit is returned if the manifest file of the APK can not be found + of the kit is returned if the manifest file of the APK cannot be found or parsed. */ int AndroidManager::minimumSDK(ProjectExplorer::Target *target) diff --git a/src/plugins/android/androidrunnerworker.cpp b/src/plugins/android/androidrunnerworker.cpp index 87e4a5c36d9..78cc6ffcff7 100644 --- a/src/plugins/android/androidrunnerworker.cpp +++ b/src/plugins/android/androidrunnerworker.cpp @@ -426,7 +426,7 @@ void AndroidRunnerWorker::asyncStartHelper() runAdb({"shell", "run-as", m_packageName, "chmod", "a+x", packageDir}); if (m_gdbserverPath.isEmpty() || !uploadFile(m_gdbserverPath, "gdbserver")) { - emit remoteProcessFinished(tr("Can not find/copy C++ debug server.")); + emit remoteProcessFinished(tr("Cannot find/copy C++ debug server.")); return; } diff --git a/src/plugins/android/androidsdkmanager.cpp b/src/plugins/android/androidsdkmanager.cpp index d293960b627..00f866d47e9 100644 --- a/src/plugins/android/androidsdkmanager.cpp +++ b/src/plugins/android/androidsdkmanager.cpp @@ -627,7 +627,7 @@ AndroidSdkPackage *SdkManagerOutputParser::parsePlatform(const QStringList &data if (parseAbstractData(packageData, data, 2, "Platform")) { int apiLevel = platformNameToApiLevel(packageData.headerParts.at(1)); if (apiLevel == -1) { - qCDebug(sdkManagerLog) << "Platform: Can not parse api level:"<< data; + qCDebug(sdkManagerLog) << "Platform: Cannot parse api level:"<< data; return nullptr; } platform = new SdkPlatform(packageData.revision, data.at(0), apiLevel); @@ -647,7 +647,7 @@ QPair SdkManagerOutputParser::parseSystemImage(const QString if (parseAbstractData(packageData, data, 4, "System-image")) { int apiLevel = platformNameToApiLevel(packageData.headerParts.at(1)); if (apiLevel == -1) { - qCDebug(sdkManagerLog) << "System-image: Can not parse api level:"<< data; + qCDebug(sdkManagerLog) << "System-image: Cannot parse api level:"<< data; return result; } auto image = new SystemImage(packageData.revision, data.at(0), diff --git a/src/plugins/android/androidsignaloperation.cpp b/src/plugins/android/androidsignaloperation.cpp index 382db6ca07e..bb54b833ab0 100644 --- a/src/plugins/android/androidsignaloperation.cpp +++ b/src/plugins/android/androidsignaloperation.cpp @@ -57,7 +57,7 @@ void Android::Internal::AndroidSignalOperation::adbFindRunAsFinished(int exitCod m_errorMessage += QLatin1String(" adb process error: ") + adbError; } if (runAs.isEmpty() || !m_errorMessage.isEmpty()) { - m_errorMessage = QLatin1String("Can not find User for process: ") + m_errorMessage = QLatin1String("Cannot find User for process: ") + QString::number(m_pid) + m_errorMessage; m_state = Idle; @@ -90,7 +90,7 @@ void Android::Internal::AndroidSignalOperation::adbKillFinished(int exitCode, m_errorMessage = QString::fromLatin1(m_adbProcess->readAllStandardError()); } if (!m_errorMessage.isEmpty()) { - m_errorMessage = QLatin1String("Can not kill process: ") + QString::number(m_pid) + m_errorMessage = QLatin1String("Cannot kill process: ") + QString::number(m_pid) + m_errorMessage; } m_state = Idle; diff --git a/src/plugins/cmakeprojectmanager/cmakekitinformation.cpp b/src/plugins/cmakeprojectmanager/cmakekitinformation.cpp index 3646b066b5d..d5757b5e6de 100644 --- a/src/plugins/cmakeprojectmanager/cmakekitinformation.cpp +++ b/src/plugins/cmakeprojectmanager/cmakekitinformation.cpp @@ -567,7 +567,7 @@ QList CMakeConfigurationKitInformation::validate(const Kit *k) const Utils::FileName tcCPath; Utils::FileName tcCxxPath; foreach (const CMakeConfigItem &i, config) { - // Do not use expand(QByteArray) as we can not be sure the input is latin1 + // Do not use expand(QByteArray) as we cannot be sure the input is latin1 const Utils::FileName expandedValue = Utils::FileName::fromString(k->macroExpander()->expand(QString::fromUtf8(i.value))); if (i.key == CMAKE_QMAKE_KEY) diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.cpp b/src/plugins/cmakeprojectmanager/cmakeproject.cpp index 598a0f7b4a8..70a6bc19b59 100644 --- a/src/plugins/cmakeprojectmanager/cmakeproject.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeproject.cpp @@ -170,7 +170,7 @@ CMakeProject::CMakeProject(const FileName &fileName) : Project(Constants::CMAKEM if (senderBc && senderBc->isActive()) { // The environment on our BC has changed: - // * Error out if the reader updates, can not happen since all BCs share a target/kit. + // * Error out if the reader updates, cannot happen since all BCs share a target/kit. // * run cmake without configuration arguments if the reader stays m_buildDirManager.setParametersAndRequestParse( BuildDirParameters(senderBc), @@ -183,7 +183,7 @@ CMakeProject::CMakeProject(const FileName &fileName) : Project(Constants::CMAKEM if (senderBc && senderBc->isActive() && senderBc == m_buildDirManager.buildConfiguration()) { // The build directory of our BC has changed: - // * Error out if the reader updates, can not happen since all BCs share a target/kit. + // * Error out if the reader updates, cannot happen since all BCs share a target/kit. // * run cmake without configuration arguments if the reader stays // If no configuration exists, then the arguments will get added automatically by // the reader. @@ -198,7 +198,7 @@ CMakeProject::CMakeProject(const FileName &fileName) : Project(Constants::CMAKEM if (senderBc && senderBc->isActive() && senderBc == m_buildDirManager.buildConfiguration()) { // The CMake configuration has changed on our BC: - // * Error out if the reader updates, can not happen since all BCs share a target/kit. + // * Error out if the reader updates, cannot happen since all BCs share a target/kit. // * run cmake with configuration arguments if the reader stays m_buildDirManager.setParametersAndRequestParse( BuildDirParameters(senderBc), diff --git a/src/plugins/coreplugin/idocument.cpp b/src/plugins/coreplugin/idocument.cpp index fefff6a701b..e5a78b32d5b 100644 --- a/src/plugins/coreplugin/idocument.cpp +++ b/src/plugins/coreplugin/idocument.cpp @@ -126,7 +126,7 @@ Id IDocument::id() const * In that case, the contents of the auto save file should be loaded, the file name of the * IDocument should be set to \a fileName, and the document state be set to modified. * If the editor is opened from a regular file, \a fileName and \a realFileName are the same. - * Use \a errorString to return an error message, if this document can not handle the + * Use \a errorString to return an error message, if this document cannot handle the * file contents. * Returns whether the file was opened and read successfully. */ diff --git a/src/plugins/coreplugin/infobar.cpp b/src/plugins/coreplugin/infobar.cpp index 3ca512c5549..53c0cc4abe5 100644 --- a/src/plugins/coreplugin/infobar.cpp +++ b/src/plugins/coreplugin/infobar.cpp @@ -111,7 +111,7 @@ void InfoBar::suppressInfo(Id id) m_suppressed << id; } -// Info can not be added more than once, or if it is suppressed +// Info cannot be added more than once, or if it is suppressed bool InfoBar::canInfoBeAdded(Id id) const { return !containsInfo(id) && !m_suppressed.contains(id) && !globallySuppressed.contains(id); diff --git a/src/plugins/debugger/cdb/cdbengine.cpp b/src/plugins/debugger/cdb/cdbengine.cpp index 96206aa7217..d8b99bc934b 100644 --- a/src/plugins/debugger/cdb/cdbengine.cpp +++ b/src/plugins/debugger/cdb/cdbengine.cpp @@ -610,7 +610,7 @@ void CdbEngine::runEngine() const auto cb = [this](const DebuggerResponse &r) { handleBreakInsert(r, Breakpoint()); }; if (boolSetting(CdbBreakOnCrtDbgReport)) { Abi::OSFlavor flavor = runParameters().toolChainAbi.osFlavor(); - // CrtDebugReport can not be safely resolved for vc 19 + // CrtDebugReport cannot be safely resolved for vc 19 if ((flavor > Abi::WindowsMsvc2005Flavor && flavor <= Abi::WindowsMsvc2013Flavor) || flavor > Abi::WindowsMSysFlavor || flavor <= Abi::WindowsCEFlavor) { const QString module = msvcRunTime(flavor); @@ -2748,7 +2748,7 @@ void CdbEngine::setupScripting(const DebuggerResponse &response) } if (!ok) { m_pythonVersion = 0; - showMessage(QString("Can not parse sys.version:\n%1").arg(verOutput), LogWarning); + showMessage(QString("Cannot parse sys.version:\n%1").arg(verOutput), LogWarning); return; } diff --git a/src/plugins/ios/iosbuildsettingswidget.cpp b/src/plugins/ios/iosbuildsettingswidget.cpp index 8b417ab3905..f7c90b3aa9a 100644 --- a/src/plugins/ios/iosbuildsettingswidget.cpp +++ b/src/plugins/ios/iosbuildsettingswidget.cpp @@ -126,7 +126,7 @@ void IosBuildSettingsWidget::setDefaultSigningIdentfier(const QString &identifie } else { // Reset to default ui->m_signEntityCombo->setCurrentIndex(0); - qCDebug(iosSettingsLog) << "Can not find default" + qCDebug(iosSettingsLog) << "Cannot find default" << (ui->m_autoSignCheckbox->isChecked() ? "team": "provisioning profile") << ". Identifier: " << identifier; } diff --git a/src/plugins/ios/simulatorcontrol.cpp b/src/plugins/ios/simulatorcontrol.cpp index f3f048d02e1..ebe9ece83f4 100644 --- a/src/plugins/ios/simulatorcontrol.cpp +++ b/src/plugins/ios/simulatorcontrol.cpp @@ -107,7 +107,7 @@ static bool launchSimulator(const QString &simUdid) { return runSimCtlCommand(QStringList({"boot", simUdid}), nullptr); } } else { - qCDebug(simulatorLog) << "Can not start Simulator device." + qCDebug(simulatorLog) << "Cannot start Simulator device." << "Error probing Simulator.app instance"; return false; } @@ -438,7 +438,7 @@ void SimulatorControlPrivate::startSimulator(QFutureInterface