From 0981636943ac6b55e3d62f06b2e0ddf67331033d Mon Sep 17 00:00:00 2001 From: David Schulz Date: Tue, 24 Oct 2017 08:21:50 +0200 Subject: [PATCH 01/18] HighlightScrollBar: Modernize overlay painting Change-Id: I59da9b106204e27b202b08d0502052f3697c71a0 Reviewed-by: Eike Ziller --- src/plugins/coreplugin/find/highlightscrollbar.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/plugins/coreplugin/find/highlightscrollbar.cpp b/src/plugins/coreplugin/find/highlightscrollbar.cpp index 03be40b693c..26c8244414f 100644 --- a/src/plugins/coreplugin/find/highlightscrollbar.cpp +++ b/src/plugins/coreplugin/find/highlightscrollbar.cpp @@ -296,10 +296,8 @@ void HighlightScrollBarOverlay::paintEvent(QPaintEvent *paintEvent) const auto highlightEnd = highlights.cend(); for (auto highlightIt = highlights.cbegin(); highlightIt != highlightEnd; ++highlightIt) { const QColor &color = creatorTheme()->color(highlightIt.key()); - for (int i = 0, total = highlightIt.value().size(); i < total; ++i) { - const QRect rect = highlightIt.value().at(i); + for (const QRect &rect : highlightIt.value()) painter.fillRect(rect, color); - } } } From 35b7dfc37e5edbab1e7dadaa14e4afea7ab8679a Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Thu, 26 Oct 2017 11:07:37 +0200 Subject: [PATCH 02/18] Doc: Document known LLDB issue Task-number: QTCREATORBUG-19055 Change-Id: I6d1ea5ab132704e14e9ca89348bdcd0010bfd00b Reviewed-by: Leena Miettinen --- doc/src/overview/creator-issues.qdoc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/doc/src/overview/creator-issues.qdoc b/doc/src/overview/creator-issues.qdoc index 06212266fad..474657e989b 100644 --- a/doc/src/overview/creator-issues.qdoc +++ b/doc/src/overview/creator-issues.qdoc @@ -138,6 +138,9 @@ paths may fail. For example, remounting parts of a file system using the --bind mount option. + \li Setting breakpoints in files will fail when using LLDB if the file path + contains symbolic links. + \li A regression in GCC 4.5.0 causes return value optimization to produce inaccurate debug info that GCC applies also to non-optimized builds. For more information, see From 6138bc3d41cde525f2c0f3fed806ad2b3d387f63 Mon Sep 17 00:00:00 2001 From: Orgad Shaneh Date: Thu, 26 Oct 2017 17:23:27 +0300 Subject: [PATCH 03/18] TextEditor: Fix proposals matching MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The regular expression must match the beginning of the string. Broke by 95310b28f3. Task-number: QTCREATORBUG-19170 Change-Id: Id95751e35ff48792333745d07a07da50af703f8f Reviewed-by: André Hartmann --- src/plugins/texteditor/codeassist/genericproposalmodel.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/texteditor/codeassist/genericproposalmodel.cpp b/src/plugins/texteditor/codeassist/genericproposalmodel.cpp index 0357bb80341..348f0a1eabc 100644 --- a/src/plugins/texteditor/codeassist/genericproposalmodel.cpp +++ b/src/plugins/texteditor/codeassist/genericproposalmodel.cpp @@ -263,7 +263,7 @@ void GenericProposalModel::filter(const QString &prefix) const QString lowerPrefix = prefix.toLower(); foreach (const auto &item, m_originalItems) { const QString &text = item->text(); - if (regExp.match(text).hasMatch()) { + if (regExp.match(text).capturedStart() == 0) { m_currentItems.append(item); if (text.startsWith(prefix)) { // Direct match From 7a7a12cef2e3fdc1f5489ec498dea6ed56587d83 Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Wed, 25 Oct 2017 13:21:45 +0200 Subject: [PATCH 04/18] CMake: Fix build directory Fix use of build directory vs. workdirectory in tealeafreader and servermode reader. Change-Id: I593579f7ad4facd64cf201368cacc4d3a8414fbf Reviewed-by: Friedemann Kleint --- .../cmakeprojectmanager/servermodereader.cpp | 8 ++++---- .../cmakeprojectmanager/tealeafreader.cpp | 18 +++++++++--------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/plugins/cmakeprojectmanager/servermodereader.cpp b/src/plugins/cmakeprojectmanager/servermodereader.cpp index a35b5a01e90..3e656d44c76 100644 --- a/src/plugins/cmakeprojectmanager/servermodereader.cpp +++ b/src/plugins/cmakeprojectmanager/servermodereader.cpp @@ -323,7 +323,7 @@ void ServerModeReader::generateProjectTree(CMakeProjectNode *root, const FileName path = fn->filePath(); if (path.fileName().compare("CMakeLists.txt", HostOsInfo::fileNameCaseSensitivity()) == 0) cmakeLists.append(fn); - else if (path.isChildOf(m_parameters.buildDirectory)) + else if (path.isChildOf(m_parameters.workDirectory)) cmakeFilesBuild.append(fn); else if (path.isChildOf(m_parameters.sourceDirectory)) cmakeFilesSource.append(fn); @@ -345,7 +345,7 @@ void ServerModeReader::generateProjectTree(CMakeProjectNode *root, addHeaderNodes(root, knownHeaders, allFiles); if (!cmakeFilesSource.isEmpty() || !cmakeFilesBuild.isEmpty() || !cmakeFilesOther.isEmpty()) - addCMakeInputs(root, m_parameters.sourceDirectory, m_parameters.buildDirectory, + addCMakeInputs(root, m_parameters.sourceDirectory, m_parameters.workDirectory, cmakeFilesSource, cmakeFilesBuild, cmakeFilesOther); } @@ -859,12 +859,12 @@ void ServerModeReader::addFileGroups(ProjectNode *targetRoot, } // Split up files in groups (based on location): - const bool inSourceBuild = (m_parameters.buildDirectory == m_parameters.sourceDirectory); + const bool inSourceBuild = (m_parameters.workDirectory == m_parameters.sourceDirectory); QList sourceFileNodes; QList buildFileNodes; QList otherFileNodes; foreach (FileNode *fn, toList) { - if (fn->filePath().isChildOf(m_parameters.buildDirectory) && !inSourceBuild) + if (fn->filePath().isChildOf(m_parameters.workDirectory) && !inSourceBuild) buildFileNodes.append(fn); else if (fn->filePath().isChildOf(m_parameters.sourceDirectory)) sourceFileNodes.append(fn); diff --git a/src/plugins/cmakeprojectmanager/tealeafreader.cpp b/src/plugins/cmakeprojectmanager/tealeafreader.cpp index 99374c0719f..6576d24e1f0 100644 --- a/src/plugins/cmakeprojectmanager/tealeafreader.cpp +++ b/src/plugins/cmakeprojectmanager/tealeafreader.cpp @@ -192,7 +192,7 @@ static QString findCbpFile(const QDir &directory) void TeaLeafReader::parse(bool forceConfiguration) { - const QString cbpFile = findCbpFile(QDir(m_parameters.buildDirectory.toString())); + const QString cbpFile = findCbpFile(QDir(m_parameters.workDirectory.toString())); const QFileInfo cbpFileFi = cbpFile.isEmpty() ? QFileInfo() : QFileInfo(cbpFile); if (!cbpFileFi.exists() || forceConfiguration) { // Initial create: @@ -236,7 +236,7 @@ QList TeaLeafReader::takeBuildTargets() CMakeConfig TeaLeafReader::takeParsedConfiguration() { - FileName cacheFile = m_parameters.buildDirectory; + FileName cacheFile = m_parameters.workDirectory; cacheFile.appendPath(QLatin1String("CMakeCache.txt")); if (!cacheFile.exists()) @@ -366,7 +366,7 @@ void TeaLeafReader::updateCodeModel(CppTools::RawProjectParts &rpps) } else { includePaths = transform(cbt.includeFiles, &FileName::toString); } - includePaths += m_parameters.buildDirectory.toString(); + includePaths += m_parameters.workDirectory.toString(); CppTools::RawProjectPart rpp; rpp.setProjectFileLocation(cbt.sourceDirectory.toString() + "/CMakeLists.txt"); rpp.setBuildSystemTarget(cbt.title); @@ -411,7 +411,7 @@ void TeaLeafReader::extractData() QTC_ASSERT(m_parameters.isValid() && m_parameters.cmakeTool, return); const FileName srcDir = m_parameters.sourceDirectory; - const FileName bldDir = m_parameters.buildDirectory; + const FileName bldDir = m_parameters.workDirectory; const FileName topCMake = Utils::FileName(srcDir).appendPath("CMakeLists.txt"); resetData(); @@ -427,7 +427,7 @@ void TeaLeafReader::extractData() m_cmakeFiles.insert(cbpFile); // Add CMakeCache.txt file: - FileName cacheFile = m_parameters.buildDirectory; + FileName cacheFile = m_parameters.workDirectory; cacheFile.appendPath(QLatin1String("CMakeCache.txt")); if (cacheFile.toFileInfo().exists()) m_cmakeFiles.insert(cacheFile); @@ -460,11 +460,11 @@ void TeaLeafReader::startCMake(const QStringList &configurationArguments) { QTC_ASSERT(m_parameters.isValid() && m_parameters.cmakeTool, return); - const FileName buildDirectory = m_parameters.buildDirectory; + const FileName workDirectory = m_parameters.workDirectory; QTC_ASSERT(!m_cmakeProcess, return); QTC_ASSERT(!m_parser, return); QTC_ASSERT(!m_future, return); - QTC_ASSERT(buildDirectory.exists(), return); + QTC_ASSERT(workDirectory.exists(), return); const QString srcDir = m_parameters.sourceDirectory.toString(); @@ -485,7 +485,7 @@ void TeaLeafReader::startCMake(const QStringList &configurationArguments) // then we are racing against CMakeCache.txt also getting deleted. m_cmakeProcess = new QtcProcess; - m_cmakeProcess->setWorkingDirectory(buildDirectory.toString()); + m_cmakeProcess->setWorkingDirectory(workDirectory.toString()); m_cmakeProcess->setEnvironment(m_parameters.environment); connect(m_cmakeProcess, &QProcess::readyReadStandardOutput, @@ -505,7 +505,7 @@ void TeaLeafReader::startCMake(const QStringList &configurationArguments) MessageManager::write(tr("Running \"%1 %2\" in %3.") .arg(m_parameters.cmakeTool->cmakeExecutable().toUserOutput()) .arg(args) - .arg(buildDirectory.toUserOutput())); + .arg(workDirectory.toUserOutput())); m_future = new QFutureInterface(); m_future->setProgressRange(0, 1); From 24a3f266c5e974c89b8fb7d1f92d6574c2cf831b Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Fri, 27 Oct 2017 10:52:13 +0200 Subject: [PATCH 05/18] Doc: Describe changes in the sidebar views The project, file system, and outline views are automatically synchronized with the item active in the editor. The File System view has a new navigation menu for moving to computer, home, or project. Change-Id: I5cb25e860d3aeabae8a51c935100b3acd5ea357f Reviewed-by: Tobias Hunger --- doc/images/qtcreator-filesystem-view.png | Bin 0 -> 14499 bytes doc/images/qtcreator-sidebar.png | Bin 41897 -> 35559 bytes doc/src/howto/creator-ui.qdoc | 26 +++++++++++++++++------ 3 files changed, 19 insertions(+), 7 deletions(-) create mode 100644 doc/images/qtcreator-filesystem-view.png diff --git a/doc/images/qtcreator-filesystem-view.png b/doc/images/qtcreator-filesystem-view.png new file mode 100644 index 0000000000000000000000000000000000000000..cf8f6bb666f560310dbc5f59ea993e14424f5385 GIT binary patch literal 14499 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 Tx2hNz7#KWV{an^LB{Ts5)zjIm literal 41897 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 diff --git a/doc/src/howto/creator-ui.qdoc b/doc/src/howto/creator-ui.qdoc index c0b20ffa0b9..ca7515b1b4b 100644 --- a/doc/src/howto/creator-ui.qdoc +++ b/doc/src/howto/creator-ui.qdoc @@ -215,8 +215,8 @@ \li To hide source files which are automatically generated by the build system, select \uicontrol {Filter Tree > Hide Generated Files}. - \li To keep the position in the project tree synchronized with the file - currently opened in the editor, click \inlineimage linkicon.png + \li To stop synchronizing the position in the project tree with the file + currently opened in the editor, deselect \inlineimage linkicon.png (\uicontrol {Synchronize with Editor}). \li To see the absolute path of a file, move the mouse pointer over the @@ -258,10 +258,20 @@ If you cannot see a file in the \uicontrol Projects view, switch to the \uicontrol {File System} view, which shows all the files in the file system. - To also show hidden files, select \uicontrol {Filter Files} > \uicontrol {Show Hidden Files}. + \image qtcreator-filesystem-view.png - To keep the position in the tree synchronized with the file - opened in the editor, select \uicontrol {Synchronize with Editor}. + By default, the contents of the directory that contains the file currently + active in the editor are displayed. To move to the root directory of the + file system, select \uicontrol Computer in the menu (1). Select + \uicontrol Home to move to the user's home directory. Further, you can + select a project to move to an open project or \uicontrol Projects to open + the \uicontrol Projects view. + + To stop the synchronization with the file currently opened in the editor, + deselect \uicontrol {Synchronize with Editor}. + + To also show hidden files, select \uicontrol {Filter Files} > + \uicontrol {Show Hidden Files}. Use the context menu functions to: @@ -269,6 +279,8 @@ \li Open files with the default editor or some other editor. + \li Open a project located in the selected directory. + \li Show the file or directory in the file explorer. \li Open a terminal window in the selected directory or in the directory @@ -299,8 +311,8 @@ \li To see a complete list of all bindings, select \uicontrol {Filter Tree > Show All Bindings}. - \li To keep the position in the view synchronized with the QML type - selected in the editor, select \uicontrol {Synchronize with Editor}. + \li To stop the synchronization with the QML type selected in the + editor, deselect \uicontrol {Synchronize with Editor}. \endlist From fa2e768eae40215cc4e81f822f2d21673c0c9213 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Fri, 27 Oct 2017 11:18:43 +0200 Subject: [PATCH 06/18] Doc: Describe limiting build output in the Compile Output pane Change-Id: I1302d0554c8fd8d866a6280c45374802bd08f64d Task-number: QTCREATORBUG-2200 Reviewed-by: Tobias Hunger --- doc/src/howto/creator-ui.qdoc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/src/howto/creator-ui.qdoc b/doc/src/howto/creator-ui.qdoc index ca7515b1b4b..6c7a8a1d5f5 100644 --- a/doc/src/howto/creator-ui.qdoc +++ b/doc/src/howto/creator-ui.qdoc @@ -479,6 +479,8 @@ when building applications, select \uicontrol Tools > \uicontrol Options > \uicontrol {Build & Run} > \uicontrol General, and then select the \uicontrol {Open Compile Output pane when building} check box. + In the \uicontrol {Limit build output to} field, you can specify the maximum + amount of build output lines to display in the pane. \section2 Debugger Console From 5f09b3234ea4e8678f0aea72e4b33daad2c55569 Mon Sep 17 00:00:00 2001 From: hjk Date: Wed, 25 Oct 2017 12:49:05 +0200 Subject: [PATCH 07/18] ProjectExplorer: Make RunWorkerPrivate::runControl const It's not meant to ever change after contstruction. Change-Id: I912b58dfb70b40c9763b902650d2c657c28ccc5c Reviewed-by: Christian Stenger --- src/plugins/projectexplorer/runconfiguration.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/projectexplorer/runconfiguration.cpp b/src/plugins/projectexplorer/runconfiguration.cpp index bd7037c575a..8c975a7bbd1 100644 --- a/src/plugins/projectexplorer/runconfiguration.cpp +++ b/src/plugins/projectexplorer/runconfiguration.cpp @@ -562,7 +562,7 @@ public: RunWorker *q; RunWorkerState state = RunWorkerState::Initialized; - QPointer runControl; + const QPointer runControl; QList startDependencies; QList stopDependencies; QString id; From f318dcde4b685508ad65a9f8d084ebfd02a13de2 Mon Sep 17 00:00:00 2001 From: hjk Date: Fri, 27 Oct 2017 13:27:26 +0200 Subject: [PATCH 08/18] Debugger: Move LldbEngine connections to constructor Doing it on startup duplicates the connections on re-run. Change-Id: Idccd039b4a005a96b9a20d99e663fc636b2e67c9 Reviewed-by: Filipe Azevedo Reviewed-by: hjk Reviewed-by: Christian Stenger --- src/plugins/debugger/lldb/lldbengine.cpp | 26 +++++++++++------------- src/plugins/debugger/lldb/lldbengine.h | 1 - 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/src/plugins/debugger/lldb/lldbengine.cpp b/src/plugins/debugger/lldb/lldbengine.cpp index e9f4e78bfb3..2707ed6193d 100644 --- a/src/plugins/debugger/lldb/lldbengine.cpp +++ b/src/plugins/debugger/lldb/lldbengine.cpp @@ -95,6 +95,18 @@ LldbEngine::LldbEngine() this, &LldbEngine::updateLocals); connect(action(IntelFlavor), &SavedAction::valueChanged, this, &LldbEngine::updateAll); + + connect(&m_lldbProc, &QProcess::errorOccurred, + this, &LldbEngine::handleLldbError); + connect(&m_lldbProc, static_cast(&QProcess::finished), + this, &LldbEngine::handleLldbFinished); + connect(&m_lldbProc, &QProcess::readyReadStandardOutput, + this, &LldbEngine::readLldbStandardOutput); + connect(&m_lldbProc, &QProcess::readyReadStandardError, + this, &LldbEngine::readLldbStandardError); + + connect(this, &LldbEngine::outputReady, + this, &LldbEngine::handleResponse, Qt::QueuedConnection); } LldbEngine::~LldbEngine() @@ -166,22 +178,8 @@ void LldbEngine::abortDebuggerProcess() void LldbEngine::setupEngine() { QTC_ASSERT(state() == EngineSetupRequested, qDebug() << state()); - startLldb(); -} -void LldbEngine::startLldb() -{ QString lldbCmd = runParameters().debugger.executable; - connect(&m_lldbProc, &QProcess::errorOccurred, this, &LldbEngine::handleLldbError); - connect(&m_lldbProc, static_cast(&QProcess::finished), - this, &LldbEngine::handleLldbFinished); - connect(&m_lldbProc, &QProcess::readyReadStandardOutput, - this, &LldbEngine::readLldbStandardOutput); - connect(&m_lldbProc, &QProcess::readyReadStandardError, - this, &LldbEngine::readLldbStandardError); - - connect(this, &LldbEngine::outputReady, - this, &LldbEngine::handleResponse, Qt::QueuedConnection); showMessage("STARTING LLDB: " + lldbCmd); m_lldbProc.setEnvironment(runParameters().debugger.environment); diff --git a/src/plugins/debugger/lldb/lldbengine.h b/src/plugins/debugger/lldb/lldbengine.h index 9bc4a0b7c93..4e0e84ac928 100644 --- a/src/plugins/debugger/lldb/lldbengine.h +++ b/src/plugins/debugger/lldb/lldbengine.h @@ -72,7 +72,6 @@ private: void executeNextI() override; void setupEngine() override; - void startLldb(); void startLldbStage2(); void setupInferior() override; void runEngine() override; From 81677fca97c515f3ec9e5a6ac09357f5fadc88be Mon Sep 17 00:00:00 2001 From: hjk Date: Fri, 27 Oct 2017 13:31:57 +0200 Subject: [PATCH 09/18] Debugger: Move GdbEngine connections to constructor In constrast to the LldbEngine this did properly disconnect on restart, but moving it to the constructor avoid the need to disconnect and follows the intended pattern. Change-Id: I9a5727c1f6b76c0282de159251803f6ff5e76eb4 Reviewed-by: Christian Stenger --- src/plugins/debugger/gdb/gdbengine.cpp | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp index 1afc1aedd67..e48becbc71e 100644 --- a/src/plugins/debugger/gdb/gdbengine.cpp +++ b/src/plugins/debugger/gdb/gdbengine.cpp @@ -211,6 +211,15 @@ GdbEngine::GdbEngine() connect(action(UseDynamicType), &SavedAction::valueChanged, this, &GdbEngine::reloadLocals); + connect(&m_gdbProc, &QProcess::errorOccurred, + this, &GdbEngine::handleGdbError); + connect(&m_gdbProc, static_cast(&QProcess::finished), + this, &GdbEngine::handleGdbFinished); + connect(&m_gdbProc, &QtcProcess::readyReadStandardOutput, + this, &GdbEngine::readGdbStandardOutput); + connect(&m_gdbProc, &QtcProcess::readyReadStandardError, + this, &GdbEngine::readGdbStandardError); + // Output connect(&m_outputCollector, &OutputCollector::byteDelivery, this, &GdbEngine::readDebuggeeOutput); @@ -3745,7 +3754,6 @@ void GdbEngine::setupEngine() foreach (int test, m_testCases) showMessage("ENABLING TEST CASE: " + QString::number(test)); - m_gdbProc.disconnect(); // From any previous runs m_expectTerminalTrap = terminal(); const DebuggerRunParameters &rp = runParameters(); @@ -3762,12 +3770,6 @@ void GdbEngine::setupEngine() if (!boolSetting(LoadGdbInit)) gdbArgs << "-n"; - connect(&m_gdbProc, &QProcess::errorOccurred, this, &GdbEngine::handleGdbError); - connect(&m_gdbProc, static_cast(&QProcess::finished), - this, &GdbEngine::handleGdbFinished); - connect(&m_gdbProc, &QtcProcess::readyReadStandardOutput, this, &GdbEngine::readGdbStandardOutput); - connect(&m_gdbProc, &QtcProcess::readyReadStandardError, this, &GdbEngine::readGdbStandardError); - showMessage("STARTING " + rp.debugger.executable + " " + gdbArgs.join(' ')); m_gdbProc.setCommand(rp.debugger.executable, QtcProcess::joinArgs(gdbArgs)); if (QFileInfo(rp.debugger.workingDirectory).isDir()) From e5959c4bdb187782ca0e55986e8b247eb2f5d724 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Fri, 27 Oct 2017 15:00:37 +0200 Subject: [PATCH 10/18] Doc: Add links to JSLint Error Explanations Task-number: QTCREATORBUG-19166 Change-Id: Ia9856529a0bd79450eadb348396f270ebb7d563e Reviewed-by: Mitch Curtis --- doc/src/editors/creator-editors.qdoc | 63 +++++++++++++++++++--------- 1 file changed, 44 insertions(+), 19 deletions(-) diff --git a/doc/src/editors/creator-editors.qdoc b/doc/src/editors/creator-editors.qdoc index 8e49e9665a2..28711d4e144 100644 --- a/doc/src/editors/creator-editors.qdoc +++ b/doc/src/editors/creator-editors.qdoc @@ -244,7 +244,8 @@ \section2 List of JavaScript and QML Checks Many of the JavaScript checks are similar to the ones in Douglas Crockford's - \l{http://www.jslint.com}{JSLint} tool. + \l{http://www.jslint.com}{JSLint} tool. For more information about JSLint + errors, see \l{http://linterrors.com/js}{JSLint Error Explanations}. \table \header @@ -311,25 +312,33 @@ \li M10 \li Error \li Duplicate property binding - \li + \li See also: \l{http://linterrors.com/js/duplicate-key-a} + {Duplicate key '{a}'}. \row \li M11 \li Error \li Id expected - \li + \li See also: + \l{http://linterrors.com/js/expected-an-identifier-and-instead-saw-a-a-reserved-word} + {Expected an identifier and instead saw '{a}' (a reserved word)}. \row \li M14 \li Error \li Invalid id - \li + \li See also: + \l{http://linterrors.com/js/expected-an-identifier-and-instead-saw-a-a-reserved-word} + {Expected an identifier and instead saw '{a}' (a reserved word)}. + \row \li M15 \li Error \li Duplicate id \li Ids in a file must be unique. + See also: \l{http://linterrors.com/js/duplicate-key-a} + {Duplicate key '{a}'}. \row \li M16 @@ -369,7 +378,7 @@ \li M23 \li Warning \li Do not use \c eval - \li + \li See also: \l{http://linterrors.com/js/eval-is-evil}{eval is evil}. \row \li M28 @@ -381,7 +390,8 @@ \li M29 \li Warning \li Do not use \c with - \li + \li See also: \l{http://linterrors.com/js/unexpected-with} + {Unexpected 'with'}. \row \li M30 @@ -431,44 +441,51 @@ \li M108 \li Warning \li Function \c name is used before its declaration - \li + \li See also: \l{http://linterrors.com/js/a-was-used-before-it-was-defined} + {{a} was used before it was defined}. \row \li M109 \li Warning \li Do not use \c Boolean as a constructor - \li + \li See also: \l{http://linterrors.com/js/do-not-use-a-as-a-constructor} + {Do not use {a} as a constructor}. \row \li M110 \li Warning \li Do not use \c String as a constructor - \li + \li See also: \l{http://linterrors.com/js/do-not-use-a-as-a-constructor} + {Do not use {a} as a constructor}. \row \li M111 \li Warning \li Do not use \c Object as a constructor - \li + \li See also: \l{http://linterrors.com/js/do-not-use-a-as-a-constructor} + {Do not use {a} as a constructor}. \row \li M112 \li Warning \li Do not use \c Array as a constructor - \li + \li See also: \l{http://linterrors.com/js/do-not-use-a-as-a-constructor} + {Do not use {a} as a constructor}. \row \li M113 \li Warning \li Do not use \c Function as a constructor - \li + \li See also: \l{http://linterrors.com/js/do-not-use-a-as-a-constructor} + {Do not use {a} as a constructor}. \row \li M114 \li Hint \li The \c function keyword and the opening parenthesis should be separated by a single space - \li + \li See also: \l{http://linterrors.com/js/expected-exactly-one-space-between-a-and-b} + {Expected exactly one space between {a} and {b}}. \row \li M115 @@ -488,13 +505,15 @@ \li M117 \li Warning \li Confusing pluses - \li + \li See also: \l{http://linterrors.com/js/confusing-pluses} + {Confusing pluses}. \row \li M119 \li Warning \li Confusing minuses - \li + \li See also: \l{http://linterrors.com/js/confusing-minuses} + {Confusing minuses}. \row \li M121 @@ -536,7 +555,9 @@ \li M201 \li Hint \li Place var declarations at the start of a function - \li + \li See also: + \l{http://linterrors.com/js/move-var-declarations-to-the-top-of-the-function} + {Move 'var' declarations to the top of the function}. \row \li M202 @@ -678,13 +699,15 @@ \li M307 \li Warning \li Use \c new only with functions that start with an uppercase letter - \li + \li See also: \l{http://linterrors.com/js/do-not-use-a-as-a-constructor} + {Do not use {a} as a constructor}. \row \li M308 \li Warning \li Do not use \c Number as a constructor - \li + \li See also: \l{http://linterrors.com/js/do-not-use-a-as-a-constructor} + {Do not use {a} as a constructor}. \row \li M309 @@ -774,7 +797,9 @@ \li M323 \li Error \li \c Number elements expected in array value - \li + \li See also: + \l{http://linterrors.com/js/the-array-literal-notation-is-preferrable} + {The array literal notation [] is preferable}. \row \li M324 From 50047466ab7d7ec47ed9defbbefb7fc4ad801d50 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Fri, 27 Oct 2017 11:36:35 +0200 Subject: [PATCH 11/18] Update qbs submodule To HEAD of 1.10 branch. Change-Id: I9eefebdb98a9d68a286b2c8bc309864566a1867d Reviewed-by: Jake Petroules --- src/shared/qbs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/shared/qbs b/src/shared/qbs index 19abf216fdd..47e4f740cae 160000 --- a/src/shared/qbs +++ b/src/shared/qbs @@ -1 +1 @@ -Subproject commit 19abf216fdd8a54c2b8ec101631f378ce6b5bc6d +Subproject commit 47e4f740cae4a9edc364c26fd1312c9070080558 From bc3d4d86fa6a20fa7ff657225c163058aca0cee5 Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Tue, 24 Oct 2017 14:36:11 +0200 Subject: [PATCH 12/18] GccToolChain: Improve retrieval/caching of compiler data * Use one template to implement both Caches * Use shared_ptr to the caches. This is necessary to not crash when the toolchains get deleted while the compiler is being run * Pass language to header path retrieval code and use that information * Add unit tests for cache used by the toolchain Change-Id: Ic31e7c4c1ed8158af7f2cdfda8104255efb06aea Reviewed-by: Tobias Hunger Reviewed-by: Nikolai Kosjar --- src/plugins/projectexplorer/gcctoolchain.cpp | 188 +++++------------- src/plugins/projectexplorer/gcctoolchain.h | 98 ++++++--- src/plugins/projectexplorer/toolchain.h | 3 +- tests/auto/auto.pro | 1 + tests/auto/auto.qbs | 1 + tests/auto/toolchaincache/toolchaincache.pro | 6 + tests/auto/toolchaincache/toolchaincache.qbs | 10 + .../toolchaincache/tst_toolchaincache.cpp | 136 +++++++++++++ 8 files changed, 272 insertions(+), 171 deletions(-) create mode 100644 tests/auto/toolchaincache/toolchaincache.pro create mode 100644 tests/auto/toolchaincache/toolchaincache.qbs create mode 100644 tests/auto/toolchaincache/tst_toolchaincache.cpp diff --git a/src/plugins/projectexplorer/gcctoolchain.cpp b/src/plugins/projectexplorer/gcctoolchain.cpp index 713736ebd5d..480b320845a 100644 --- a/src/plugins/projectexplorer/gcctoolchain.cpp +++ b/src/plugins/projectexplorer/gcctoolchain.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2016 The Qt Company Ltd. +** Copyright (C) 2017 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of Qt Creator. @@ -70,102 +70,6 @@ static const char originalTargetTripleKeyC[] = "ProjectExplorer.GccToolChain.Ori static const char supportedAbisKeyC[] = "ProjectExplorer.GccToolChain.SupportedAbis"; static const char binaryRegexp[] = "(?:^|-|\\b)(?:gcc|g\\+\\+)(?:-([\\d.]+))?$"; -static const int CACHE_SIZE = 16; - -HeaderPathsCache::HeaderPathsCache(const HeaderPathsCache &other) -{ - QMutexLocker locker(&m_mutex); - m_cache = other.cache(); -} - -void HeaderPathsCache::insert(const QStringList &compilerCommand, - const QList &headerPaths) -{ - CacheItem runResults; - runResults.first = compilerCommand; - runResults.second = headerPaths; - - QMutexLocker locker(&m_mutex); - bool cacheHit = false; - check(compilerCommand, &cacheHit); - if (!cacheHit) { - m_cache.push_back(runResults); - if (m_cache.size() > CACHE_SIZE) - m_cache.pop_front(); - } -} - -QList HeaderPathsCache::check(const QStringList &compilerCommand, - bool *cacheHit) const -{ - QMutexLocker locker(&m_mutex); - for (Cache::iterator it = m_cache.begin(); it != m_cache.end(); ++it) { - if (it->first == compilerCommand) { - // Increase cached item priority - CacheItem pair = *it; - m_cache.erase(it); - m_cache.push_back(pair); - - *cacheHit = true; - return pair.second; - } - } - - *cacheHit = false; - return QList(); -} - -HeaderPathsCache::Cache HeaderPathsCache::cache() const -{ - QMutexLocker locker(&m_mutex); - return m_cache; -} - -MacroCache::MacroCache() : m_mutex(QMutex::Recursive) -{ - m_cache.reserve(CACHE_SIZE + 1); -} - -MacroCache::MacroCache(const MacroCache &other) - : MacroCache() -{ - QMutexLocker locker(&m_mutex); - m_cache = other.cache(); -} - -void MacroCache::insert(const QStringList &compilerCommand, const Macros ¯os) -{ - QMutexLocker locker(&m_mutex); - if (macros.isEmpty() || unlockedCheck(compilerCommand).isEmpty()) - return; - - m_cache.push_back(qMakePair(compilerCommand, macros)); - if (m_cache.size() > CACHE_SIZE) - m_cache.pop_front(); -} - -Macros MacroCache::check(const QStringList &compilerCommand) const -{ - QMutexLocker locker(&m_mutex); - return unlockedCheck(compilerCommand); -} - -MacroCache::Cache MacroCache::cache() const -{ - QMutexLocker locker(&m_mutex); - return m_cache; -} - -Macros MacroCache::unlockedCheck(const QStringList &compilerCommand) const -{ - auto it = std::stable_partition(m_cache.begin(), m_cache.end(), [&](const CacheItem &ci) { - return ci.first == compilerCommand; - }); - if (it != m_cache.end()) - return it->second; - return {}; -} - static QByteArray runGcc(const FileName &gcc, const QStringList &arguments, const QStringList &env) { if (gcc.isEmpty() || !gcc.toFileInfo().isExecutable()) @@ -190,8 +94,8 @@ static QByteArray runGcc(const FileName &gcc, const QStringList &arguments, cons static const QStringList gccPredefinedMacrosOptions(Core::Id languageId) { const QString langOption = languageId == Constants::CXX_LANGUAGE_ID - ? QLatin1String("-xc++") : QLatin1String("-xc"); - return QStringList({langOption, "-E", "-dM"}); + ? QLatin1String("c++") : QLatin1String("c"); + return QStringList({"-x", langOption, "-E", "-dM"}); } static ProjectExplorer::Macros gccPredefinedMacros(const FileName &gcc, @@ -251,7 +155,8 @@ QList GccToolChain::gccHeaderPaths(const FileName &gcc, const QStrin thisHeaderKind = HeaderPath::FrameworkHeaderPath; } - systemHeaderPaths.append(HeaderPath(QFile::decodeName(line), thisHeaderKind)); + const QString headerPath = QFileInfo(QFile::decodeName(line)).canonicalFilePath(); + systemHeaderPaths.append(HeaderPath(headerPath, thisHeaderKind)); } else if (line.startsWith("End of search list.")) { break; } else { @@ -325,11 +230,13 @@ static QString gccVersion(const FileName &path, const QStringList &env) // -------------------------------------------------------------------------- GccToolChain::GccToolChain(Detection d) : - ToolChain(Constants::GCC_TOOLCHAIN_TYPEID, d) + GccToolChain(Constants::GCC_TOOLCHAIN_TYPEID, d) { } GccToolChain::GccToolChain(Core::Id typeId, Detection d) : - ToolChain(typeId, d) + ToolChain(typeId, d), + m_predefinedMacrosCache(std::make_shared>>()), + m_headerPathsCache(std::make_shared>>()) { } void GccToolChain::setCompilerCommand(const FileName &path) @@ -468,24 +375,24 @@ ToolChain::PredefinedMacrosRunner GccToolChain::createPredefinedMacrosRunner() c const QStringList platformCodeGenFlags = m_platformCodeGenFlags; OptionsReinterpreter reinterpretOptions = m_optionsReinterpreter; QTC_CHECK(reinterpretOptions); - MacroCache *macroCache = &m_predefinedMacrosCache; + std::shared_ptr>> macroCache = m_predefinedMacrosCache; Core::Id lang = language(); // This runner must be thread-safe! return [env, compilerCommand, platformCodeGenFlags, reinterpretOptions, macroCache, lang] - (const QStringList &cxxflags) { - QStringList allCxxflags = platformCodeGenFlags + cxxflags; // add only cxxflags is empty? + (const QStringList &flags) { + QStringList allFlags = platformCodeGenFlags + flags; // add only cxxflags is empty? QStringList arguments = gccPredefinedMacrosOptions(lang); - for (int iArg = 0; iArg < allCxxflags.length(); ++iArg) { - const QString &a = allCxxflags.at(iArg); + for (int iArg = 0; iArg < allFlags.length(); ++iArg) { + const QString &a = allFlags.at(iArg); if (a.startsWith("--gcc-toolchain=")) { arguments << a; } else if (a == "-arch") { - if (++iArg < allCxxflags.length() && !arguments.contains(a)) - arguments << a << allCxxflags.at(iArg); + if (++iArg < allFlags.length() && !arguments.contains(a)) + arguments << a << allFlags.at(iArg); } else if (a == "--sysroot" || a == "-isysroot" || a == "-D" ||a == "-U") { - if (++iArg < allCxxflags.length()) - arguments << a << allCxxflags.at(iArg); + if (++iArg < allFlags.length()) + arguments << a << allFlags.at(iArg); } else if (a == "-m128bit-long-double" || a == "-m32" || a == "-m3dnow" || a == "-m3dnowa" || a == "-m64" || a == "-m96bit-long-double" || a == "-mabm" || a == "-maes" || a.startsWith("-march=") || a == "-mavx" || a.startsWith("-masm=") @@ -508,13 +415,14 @@ ToolChain::PredefinedMacrosRunner GccToolChain::createPredefinedMacrosRunner() c } arguments = reinterpretOptions(arguments); - Macros macros = macroCache->check(arguments); - if (!macros.isEmpty()) - return macros; + const Utils::optional> cachedMacros = macroCache->check(arguments); + if (cachedMacros) + return cachedMacros.value(); - macros = gccPredefinedMacros(findLocalCompiler(compilerCommand, env), - arguments, - env.toStringList()); + const QVector macros + = gccPredefinedMacros(findLocalCompiler(compilerCommand, env), + arguments, + env.toStringList()); macroCache->insert(arguments, macros); return macros; @@ -656,21 +564,22 @@ ToolChain::SystemHeaderPathsRunner GccToolChain::createSystemHeaderPathsRunner() const QStringList platformCodeGenFlags = m_platformCodeGenFlags; OptionsReinterpreter reinterpretOptions = m_optionsReinterpreter; QTC_CHECK(reinterpretOptions); - HeaderPathsCache *headerCache = &m_headerPathsCache; + std::shared_ptr>> headerCache = m_headerPathsCache; + Core::Id languageId = language(); // This runner must be thread-safe! - return [env, compilerCommand, platformCodeGenFlags, reinterpretOptions, headerCache] - (const QStringList &cxxflags, const QString &sysRoot) { + return [env, compilerCommand, platformCodeGenFlags, reinterpretOptions, headerCache, languageId] + (const QStringList &flags, const QString &sysRoot) { // Prepare arguments QStringList arguments; const bool hasKitSysroot = !sysRoot.isEmpty(); if (hasKitSysroot) arguments.append(QString::fromLatin1("--sysroot=%1").arg(sysRoot)); - QStringList flags; - flags << platformCodeGenFlags << cxxflags; - for (int i = 0; i < flags.size(); ++i) { - const QString &flag = flags.at(i); + QStringList allFlags; + allFlags << platformCodeGenFlags << flags; + for (int i = 0; i < allFlags.size(); ++i) { + const QString &flag = allFlags.at(i); if (flag.startsWith("-stdlib=") || flag.startsWith("--gcctoolchain=")) { arguments << flag; } else if (!hasKitSysroot) { @@ -679,33 +588,38 @@ ToolChain::SystemHeaderPathsRunner GccToolChain::createSystemHeaderPathsRunner() arguments << flag; } else if ((flag.startsWith("-isysroot") || flag.startsWith("--sysroot")) && i < flags.size() - 1) { - arguments << flag << flags.at(i + 1); + arguments << flag << allFlags.at(i + 1); ++i; } } } - arguments << "-xc++" << "-E" << "-v" << "-"; + arguments << "-x"; + if (languageId == ProjectExplorer::Constants::C_LANGUAGE_ID) + arguments << "c"; + else + arguments << "c++"; + arguments << "-E" << "-v" << "-"; + arguments = reinterpretOptions(arguments); - bool cacheHit = false; - QList paths = headerCache->check(arguments, &cacheHit); - if (cacheHit) - return paths; + const Utils::optional> cachedPaths = headerCache->check(arguments); + if (cachedPaths) + return cachedPaths.value(); - paths = gccHeaderPaths(findLocalCompiler(compilerCommand, env), - arguments, - env.toStringList()); + const QList paths = gccHeaderPaths(findLocalCompiler(compilerCommand, env), + arguments, + env.toStringList()); headerCache->insert(arguments, paths); return paths; }; } -QList GccToolChain::systemHeaderPaths(const QStringList &cxxflags, +QList GccToolChain::systemHeaderPaths(const QStringList &flags, const FileName &sysRoot) const { - return createSystemHeaderPathsRunner()(cxxflags, sysRoot.toString()); + return createSystemHeaderPathsRunner()(flags, sysRoot.toString()); } void GccToolChain::addCommandPathToEnvironment(const FileName &command, Environment &env) @@ -1100,7 +1014,7 @@ QList GccToolChainFactory::autoDetectToolChain(const FileName &comp return result; tc->setLanguage(language); - tc->m_predefinedMacrosCache.insert(QStringList(), macros); + tc->m_predefinedMacrosCache->insert(QStringList(), macros); tc->setCompilerCommand(compilerPath); tc->setSupportedAbis(detectedAbis.supportedAbis); tc->setTargetAbi(abi); @@ -1165,7 +1079,7 @@ void GccToolChainConfigWidget::applyImpl() tc->setDisplayName(displayName); // reset display name tc->setPlatformCodeGenFlags(splitString(m_platformCodeGenFlagsLineEdit->text())); tc->setPlatformLinkerFlags(splitString(m_platformLinkerFlagsLineEdit->text())); - tc->m_predefinedMacrosCache.insert(tc->platformCodeGenFlags(), m_macros); + tc->m_predefinedMacrosCache->insert(tc->platformCodeGenFlags(), m_macros); } void GccToolChainConfigWidget::setFromToolchain() diff --git a/src/plugins/projectexplorer/gcctoolchain.h b/src/plugins/projectexplorer/gcctoolchain.h index a3c4b4eacae..e80ccb13e5e 100644 --- a/src/plugins/projectexplorer/gcctoolchain.h +++ b/src/plugins/projectexplorer/gcctoolchain.h @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2016 The Qt Company Ltd. +** Copyright (C) 2017 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of Qt Creator. @@ -32,10 +32,13 @@ #include "headerpath.h" #include +#include + #include #include #include +#include namespace ProjectExplorer { @@ -51,42 +54,71 @@ class LinuxIccToolChainFactory; // GccToolChain // -------------------------------------------------------------------------- -class HeaderPathsCache +template +class Cache { public: - HeaderPathsCache() : m_mutex(QMutex::Recursive) {} - HeaderPathsCache(const HeaderPathsCache &other); - void insert(const QStringList &compilerCommand, const QList &headerPaths); - QList check(const QStringList &compilerCommand, bool *cacheHit) const; + Cache() { m_cache.reserve(Size); } + Cache(const Cache &other) = delete; + Cache &operator =(const Cache &other) = delete; -protected: - using CacheItem = QPair>; - using Cache = QList; - Cache cache() const; + Cache(Cache &&other) + { + using std::swap; + + QMutexLocker otherLocker(&other.m_mutex); + swap(m_cache, other.m_cache); + } + + Cache &operator =(Cache &&other) + { + using std::swap; + + QMutexLocker locker(&m_mutex); + QMutexLocker otherLocker(&other.m_mutex); + auto temporay(std::move(other.m_cache)); // Make sure other.m_cache is empty! + swap(m_cache, temporay); + return *this; + } + + void insert(const QStringList &compilerArguments, const T &values) + { + CacheItem runResults; + runResults.first = compilerArguments; + runResults.second = values; + + QMutexLocker locker(&m_mutex); + if (!checkImpl(compilerArguments)) { + if (m_cache.size() < Size) { + m_cache.push_back(runResults); + } else { + std::rotate(m_cache.begin(), std::next(m_cache.begin()), m_cache.end()); + m_cache.back() = runResults; + } + } + } + + Utils::optional check(const QStringList &compilerArguments) + { + QMutexLocker locker(&m_mutex); + return checkImpl(compilerArguments); + } private: - mutable QMutex m_mutex; - mutable Cache m_cache; -}; + Utils::optional checkImpl(const QStringList &compilerArguments) + { + auto it = std::stable_partition(m_cache.begin(), m_cache.end(), [&](const CacheItem &ci) { + return ci.first != compilerArguments; + }); + if (it != m_cache.end()) + return m_cache.back().second; + return {}; + } -class MacroCache -{ -public: - MacroCache(); - MacroCache(const MacroCache &other); - void insert(const QStringList &compilerCommand, const Macros ¯os); - Macros check(const QStringList &compilerCommand) const; + using CacheItem = QPair; -protected: - using CacheItem = QPair; - using Cache = QVector; - Cache cache() const; - -private: - // Does not lock! - Macros unlockedCheck(const QStringList &compilerCommand) const; - mutable QMutex m_mutex; - mutable Cache m_cache; + QMutex m_mutex; + QVector m_cache; }; class PROJECTEXPLORER_EXPORT GccToolChain : public ToolChain @@ -109,7 +141,7 @@ public: Macros predefinedMacros(const QStringList &cxxflags) const override; SystemHeaderPathsRunner createSystemHeaderPathsRunner() const override; - QList systemHeaderPaths(const QStringList &cxxflags, + QList systemHeaderPaths(const QStringList &flags, const Utils::FileName &sysRoot) const override; void addToEnvironment(Utils::Environment &env) const override; @@ -203,8 +235,8 @@ private: mutable QList m_headerPaths; mutable QString m_version; - mutable MacroCache m_predefinedMacrosCache; - mutable HeaderPathsCache m_headerPathsCache; + mutable std::shared_ptr>> m_predefinedMacrosCache; + mutable std::shared_ptr>> m_headerPathsCache; friend class Internal::GccToolChainConfigWidget; friend class Internal::GccToolChainFactory; diff --git a/src/plugins/projectexplorer/toolchain.h b/src/plugins/projectexplorer/toolchain.h index 4ee56f05a8f..30009378236 100644 --- a/src/plugins/projectexplorer/toolchain.h +++ b/src/plugins/projectexplorer/toolchain.h @@ -128,7 +128,8 @@ public: virtual Macros predefinedMacros(const QStringList &cxxflags) const = 0; // A SystemHeaderPathsRunner is created in the ui thread and runs in another thread. - using SystemHeaderPathsRunner = std::function(const QStringList &cxxflags, const QString &sysRoot)>; + using SystemHeaderPathsRunner = std::function(const QStringList &cxxflags, + const QString &sysRoot)>; virtual SystemHeaderPathsRunner createSystemHeaderPathsRunner() const = 0; virtual QList systemHeaderPaths(const QStringList &cxxflags, const Utils::FileName &sysRoot) const = 0; diff --git a/tests/auto/auto.pro b/tests/auto/auto.pro index 585245d354a..8eed70e06d2 100644 --- a/tests/auto/auto.pro +++ b/tests/auto/auto.pro @@ -14,6 +14,7 @@ SUBDIRS += \ generichighlighter \ profilewriter \ treeviewfind \ + toolchaincache \ qtcprocess \ json \ utils \ diff --git a/tests/auto/auto.qbs b/tests/auto/auto.qbs index fa8e163cbab..26c08fec8eb 100644 --- a/tests/auto/auto.qbs +++ b/tests/auto/auto.qbs @@ -25,6 +25,7 @@ Project { "sdktool/sdktool.qbs", "timeline/timeline.qbs", "treeviewfind/treeviewfind.qbs", + "toolchaincache/toolchaincache.qbs", "utils/utils.qbs", "valgrind/valgrind.qbs" ].concat(project.additionalAutotests) diff --git a/tests/auto/toolchaincache/toolchaincache.pro b/tests/auto/toolchaincache/toolchaincache.pro new file mode 100644 index 00000000000..5dea077c209 --- /dev/null +++ b/tests/auto/toolchaincache/toolchaincache.pro @@ -0,0 +1,6 @@ +QT -= gui + +include(../qttest.pri) + +SOURCES += \ + tst_toolchaincache.cpp diff --git a/tests/auto/toolchaincache/toolchaincache.qbs b/tests/auto/toolchaincache/toolchaincache.qbs new file mode 100644 index 00000000000..c814441539f --- /dev/null +++ b/tests/auto/toolchaincache/toolchaincache.qbs @@ -0,0 +1,10 @@ +import qbs + +QtcAutotest { + name: "ToolChainCache autotest" + Depends { name: "ProjectExplorer" } + Group { + name: "Test sources" + files: "tst_toolchaincache.cpp" + } +} diff --git a/tests/auto/toolchaincache/tst_toolchaincache.cpp b/tests/auto/toolchaincache/tst_toolchaincache.cpp new file mode 100644 index 00000000000..10226802c3c --- /dev/null +++ b/tests/auto/toolchaincache/tst_toolchaincache.cpp @@ -0,0 +1,136 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +#include + +#include + +//////////////// the actual autotest + +class tst_ToolChainCache : public QObject +{ + Q_OBJECT + +private slots: + void insertOne(); + void insertOneOne(); + void insertOneTwo(); + void insertOneTwoThree(); + void insertOneTwoOneThree(); +}; + + +void tst_ToolChainCache::insertOne() +{ + const QStringList key1 = {"one"}; + const QString value1 = "value1"; + ProjectExplorer::Cache cache; + + cache.insert(key1, value1); + + QVERIFY(bool(cache.check(key1))); + QCOMPARE(cache.check(key1).value(), value1); + QVERIFY(!cache.check({"other"})); +} + +void tst_ToolChainCache::insertOneOne() +{ + const QStringList key1 = {"one"}; + const QString value1 = "value1"; + ProjectExplorer::Cache cache; + + cache.insert(key1, value1); + cache.insert(key1, value1); + + QVERIFY(bool(cache.check(key1))); + QCOMPARE(cache.check(key1).value(), value1); + QVERIFY(!cache.check({"other"})); +} + +void tst_ToolChainCache::insertOneTwo() +{ + const QStringList key1 = {"one"}; + const QString value1 = "value1"; + const QStringList key2 = {"two"}; + const QString value2 = "value2"; + ProjectExplorer::Cache cache; + + cache.insert(key1, value1); + cache.insert(key2, value2); + + QVERIFY(bool(cache.check(key1))); + QCOMPARE(cache.check(key1).value(), value1); + QVERIFY(bool(cache.check(key2))); + QCOMPARE(cache.check(key2).value(), value2); + QVERIFY(!cache.check({"other"})); +} + +void tst_ToolChainCache::insertOneTwoThree() +{ + const QStringList key1 = {"one"}; + const QString value1 = "value1"; + const QStringList key2 = {"two"}; + const QString value2 = "value2"; + const QStringList key3 = {"three"}; + const QString value3 = "value3"; + ProjectExplorer::Cache cache; + + cache.insert(key1, value1); + cache.insert(key2, value2); + cache.insert(key3, value3); + + QVERIFY(!cache.check(key1)); // key1 was evicted + QVERIFY(bool(cache.check(key2))); + QCOMPARE(cache.check(key2).value(), value2); + QVERIFY(bool(cache.check(key3))); + QCOMPARE(cache.check(key3).value(), value3); + QVERIFY(!cache.check({"other"})); +} + +void tst_ToolChainCache::insertOneTwoOneThree() +{ + const QStringList key1 = {"one"}; + const QString value1 = "value1"; + const QStringList key2 = {"two"}; + const QString value2 = "value2"; + const QStringList key3 = {"three"}; + const QString value3 = "value3"; + ProjectExplorer::Cache cache; + + cache.insert(key1, value1); + cache.insert(key2, value2); + cache.insert(key1, value1); + cache.insert(key3, value3); + + QVERIFY(bool(cache.check(key1))); + QCOMPARE(cache.check(key1).value(), value1); + QVERIFY(!cache.check(key2)); // key2 was evicted + QVERIFY(bool(cache.check(key3))); + QCOMPARE(cache.check(key3).value(), value3); + QVERIFY(!cache.check({"other"})); +} + +QTEST_MAIN(tst_ToolChainCache) +#include "tst_toolchaincache.moc" From d8b25ad1d4a7ef1be96b13a9c9e24b574eff4f9e Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Fri, 27 Oct 2017 11:17:38 +0200 Subject: [PATCH 13/18] GccToolChain: Unify handling of language options Change-Id: I06896d2b8b0561726d607f4bfaeb5b3ec8e065ee Reviewed-by: Nikolai Kosjar --- src/plugins/projectexplorer/gcctoolchain.cpp | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/src/plugins/projectexplorer/gcctoolchain.cpp b/src/plugins/projectexplorer/gcctoolchain.cpp index 480b320845a..cf0d1010e1d 100644 --- a/src/plugins/projectexplorer/gcctoolchain.cpp +++ b/src/plugins/projectexplorer/gcctoolchain.cpp @@ -91,11 +91,16 @@ static QByteArray runGcc(const FileName &gcc, const QStringList &arguments, cons return response.allOutput().toUtf8(); } +static const QStringList languageOption(Core::Id languageId) +{ + if (languageId == Constants::C_LANGUAGE_ID) + return {"-x", "c"}; + return {"-x", "c++"}; +} + static const QStringList gccPredefinedMacrosOptions(Core::Id languageId) { - const QString langOption = languageId == Constants::CXX_LANGUAGE_ID - ? QLatin1String("c++") : QLatin1String("c"); - return QStringList({"-x", langOption, "-E", "-dM"}); + return languageOption(languageId) + QStringList({"-E", "-dM"}); } static ProjectExplorer::Macros gccPredefinedMacros(const FileName &gcc, @@ -594,13 +599,7 @@ ToolChain::SystemHeaderPathsRunner GccToolChain::createSystemHeaderPathsRunner() } } - arguments << "-x"; - if (languageId == ProjectExplorer::Constants::C_LANGUAGE_ID) - arguments << "c"; - else - arguments << "c++"; - arguments << "-E" << "-v" << "-"; - + arguments << languageOption(languageId) << "-E" << "-v" << "-"; arguments = reinterpretOptions(arguments); const Utils::optional> cachedPaths = headerCache->check(arguments); From 1406bbeec7a7f8e7185479fc2d66cc729a2eeb3c Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Fri, 27 Oct 2017 16:02:06 +0200 Subject: [PATCH 14/18] GccToolChain: Log what gets reported to code model Change-Id: Ic6a0252f6109393a2aab8ea96db9a9b583c25394 Reviewed-by: Nikolai Kosjar --- src/plugins/projectexplorer/gcctoolchain.cpp | 21 ++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/plugins/projectexplorer/gcctoolchain.cpp b/src/plugins/projectexplorer/gcctoolchain.cpp index cf0d1010e1d..e3a57924550 100644 --- a/src/plugins/projectexplorer/gcctoolchain.cpp +++ b/src/plugins/projectexplorer/gcctoolchain.cpp @@ -47,11 +47,16 @@ #include #include #include +#include #include #include #include +namespace { +Q_LOGGING_CATEGORY(gccLog, "qtc.pe.toolchain.gcc"); +} // namespace + using namespace Utils; namespace ProjectExplorer { @@ -430,6 +435,14 @@ ToolChain::PredefinedMacrosRunner GccToolChain::createPredefinedMacrosRunner() c env.toStringList()); macroCache->insert(arguments, macros); + qCDebug(gccLog) << "Reporting macros to code model:"; + for (const Macro &m : macros) { + qCDebug(gccLog) << compilerCommand.toUserOutput() + << (lang == Constants::CXX_LANGUAGE_ID ? ": C++ [" : ": C [") + << arguments.join(", ") << "]" + << QString::fromUtf8(m.toByteArray()); + } + return macros; }; } @@ -611,6 +624,14 @@ ToolChain::SystemHeaderPathsRunner GccToolChain::createSystemHeaderPathsRunner() env.toStringList()); headerCache->insert(arguments, paths); + qCDebug(gccLog) << "Reporting header paths to code model:"; + for (const HeaderPath &hp : paths) { + qCDebug(gccLog) << compilerCommand.toUserOutput() + << (languageId == Constants::CXX_LANGUAGE_ID ? ": C++ [" : ": C [") + << arguments.join(", ") << "]" + << hp.path(); + } + return paths; }; } From dc8d0f048a408ef2e77eba1096fc4ac7be632449 Mon Sep 17 00:00:00 2001 From: Orgad Shaneh Date: Sat, 28 Oct 2017 22:12:48 +0300 Subject: [PATCH 15/18] Suppress noexcept-type warnings also in qbs build This amends commit 68589a3fbc9afe4485baf728729c969e0f508385. Change-Id: Idf0e296f7549e8aea7109e0c877e27032b99e9b8 Reviewed-by: Christian Kandeler --- qbs/imports/QtcProduct.qbs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/qbs/imports/QtcProduct.qbs b/qbs/imports/QtcProduct.qbs index ea9fb30163a..c6b130effe4 100644 --- a/qbs/imports/QtcProduct.qbs +++ b/qbs/imports/QtcProduct.qbs @@ -26,6 +26,10 @@ Product { cpp.minimumMacosVersion: project.minimumMacosVersion } + Properties { + condition: qbs.toolchain.contains("gcc") && !qbs.toolchain.contains("clang") + cpp.cxxFlags: base.concat(["-Wno-noexcept-type"]) + } cpp.cxxLanguageVersion: "c++14" cpp.defines: qtc.generalDefines cpp.minimumWindowsVersion: qbs.architecture === "x86" ? "5.1" : "5.2" From 4c62cbd6dcc10a992e68e3bfa9988e23ba4970ee Mon Sep 17 00:00:00 2001 From: Benjamin Terrier Date: Sun, 22 Oct 2017 17:08:02 +0200 Subject: [PATCH 16/18] Add detection of MSVC 2017 Build Tools Rename detectCppBuildTools() to detectCppBuildTools2015(). Add detectCppBuildTools2017(). Like the 2015 version the detection is based on the presence of a .bat file because there are no entry in the Windows registry, but it relies on the VisualStudioInstallation structure like other Visual Studio toolchains. Task-number: QTCREATORBUG-19053 Change-Id: I875bd466a3009574696fb7ebe54cdc5ff9bcb921 Reviewed-by: Orgad Shaneh Reviewed-by: Friedemann Kleint Reviewed-by: Tobias Hunger --- src/plugins/projectexplorer/msvctoolchain.cpp | 38 ++++++++++++++++++- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/src/plugins/projectexplorer/msvctoolchain.cpp b/src/plugins/projectexplorer/msvctoolchain.cpp index 2ff34dbcb87..2f0db8d0748 100644 --- a/src/plugins/projectexplorer/msvctoolchain.cpp +++ b/src/plugins/projectexplorer/msvctoolchain.cpp @@ -35,6 +35,7 @@ #include #include #include +#include #include #include @@ -145,6 +146,33 @@ QDebug operator<<(QDebug d, const VisualStudioInstallation &i) return d; } +// Detect build tools introduced with MSVC2017 +static Utils::optional detectCppBuildTools2017() +{ +#ifdef Q_OS_WIN64 + const char programFilesC[] = "ProgramFiles(x86)"; +#else + const char programFilesC[] = "ProgramFiles"; +#endif + + const QString installPath = QDir::fromNativeSeparators(QFile::decodeName(qgetenv(programFilesC))) + + "/Microsoft Visual Studio/2017/BuildTools"; + const QString vcVarsPath = installPath + "/VC/Auxiliary/Build"; + const QString vcVarsAllPath = vcVarsPath + "/vcvarsall.bat"; + + if (!QFileInfo::exists(vcVarsAllPath)) + return Utils::nullopt; + + VisualStudioInstallation installation; + installation.path = installPath; + installation.vcVarsAll = vcVarsAllPath; + installation.vcVarsPath = vcVarsPath; + installation.version = QVersionNumber(15); + installation.vsName = "15.0"; + + return installation; +} + static QVector detectVisualStudio() { QVector result; @@ -185,6 +213,12 @@ static QVector detectVisualStudio() } } } + + // Detect VS 2017 Build Tools + auto installation = detectCppBuildTools2017(); + if (installation) + result.append(*installation); + return result; } @@ -836,7 +870,7 @@ static QList findOrCreateToolChain( } // Detect build tools introduced with MSVC2015 -static void detectCppBuildTools(QList *list) +static void detectCppBuildTools2015(QList *list) { struct Entry { const char *postFix; @@ -989,7 +1023,7 @@ QList MsvcToolChainFactory::autoDetect(const QList &al } } - detectCppBuildTools(&results); + detectCppBuildTools2015(&results); detectClangClToolChain(&results); From 92c1659df289ab545a2a9a5180d5abce45e867e7 Mon Sep 17 00:00:00 2001 From: Orgad Shaneh Date: Sat, 28 Oct 2017 20:32:21 +0300 Subject: [PATCH 17/18] CamelHump: Prefer plain match over camel hump MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit For example: Matching "lit" against "LiteralTable" should highlight "Lit" and not "Li" and "T" from Table. Change-Id: I8a0a9d0b0b90403745e85b1d3d20deaa551416eb Reviewed-by: André Hartmann --- src/libs/utils/camelhumpmatcher.cpp | 4 ++-- tests/auto/utils/camelhumpmatcher/tst_camelhumpmatcher.cpp | 6 ++++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/libs/utils/camelhumpmatcher.cpp b/src/libs/utils/camelhumpmatcher.cpp index b82cd2d8998..2c81f197d73 100644 --- a/src/libs/utils/camelhumpmatcher.cpp +++ b/src/libs/utils/camelhumpmatcher.cpp @@ -118,9 +118,9 @@ QRegularExpression CamelHumpMatcher::createCamelHumpRegExp( first = false; } - keyRegExp += ")|(" + plainRegExp + ')'; + keyRegExp += ')'; - return QRegularExpression(keyRegExp); + return QRegularExpression('(' + plainRegExp + ")|" + keyRegExp); } /*! diff --git a/tests/auto/utils/camelhumpmatcher/tst_camelhumpmatcher.cpp b/tests/auto/utils/camelhumpmatcher/tst_camelhumpmatcher.cpp index d9b54743411..b7a979e4c54 100644 --- a/tests/auto/utils/camelhumpmatcher/tst_camelhumpmatcher.cpp +++ b/tests/auto/utils/camelhumpmatcher/tst_camelhumpmatcher.cpp @@ -136,12 +136,14 @@ void tst_CamelHumpMatcher::highlighting_data() << MatchStart{13} << MatchLength{1}; QTest::newRow("humps-continued") << "LoCa" << "VeryLongCamelHump" << MatchStart{4, 8} << MatchLength{2, 2}; + QTest::newRow("duplicate-match") << "som" << "SomeMatch" + << MatchStart{0} << MatchLength{3}; QTest::newRow("numbers") << "4" << "TestJust4Fun" << MatchStart{8} << MatchLength{1}; QTest::newRow("wildcard-asterisk") << "Lo*Hu" << "VeryLongCamelHump" - << MatchStart{4, 13} << MatchLength{2, 2}; + << MatchStart{4} << MatchLength{11}; QTest::newRow("wildcard-question") << "Lo?g" << "VeryLongCamelHump" - << MatchStart{4, 7} << MatchLength{2, 1}; + << MatchStart{4} << MatchLength{4}; QTest::newRow("middle-no-hump") << "window" << "mainwindow.cpp" << MatchStart{4} << MatchLength{6}; } From be673acb3e262aaac1e868e145c6bc595e72ac79 Mon Sep 17 00:00:00 2001 From: Orgad Shaneh Date: Sat, 28 Oct 2017 22:20:28 +0300 Subject: [PATCH 18/18] Add CameHumpMatcher autotest to qbs build MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: Ia019822ecc8d9ab1a19a17a7965fd5e9a4178bc9 Reviewed-by: André Hartmann Reviewed-by: Orgad Shaneh --- tests/auto/utils/camelhumpmatcher/camelhumpmatcher.qbs | 3 +-- tests/auto/utils/utils.qbs | 1 + 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/auto/utils/camelhumpmatcher/camelhumpmatcher.qbs b/tests/auto/utils/camelhumpmatcher/camelhumpmatcher.qbs index 2ecb08dd988..4cda3182420 100644 --- a/tests/auto/utils/camelhumpmatcher/camelhumpmatcher.qbs +++ b/tests/auto/utils/camelhumpmatcher/camelhumpmatcher.qbs @@ -1,7 +1,6 @@ import qbs -import "../../autotest.qbs" as Autotest -Autotest { +QtcAutotest { name: "CamelHumpMatcher autotest" Depends { name: "Utils" } files: "tst_camelhumpmatcher.cpp" diff --git a/tests/auto/utils/utils.qbs b/tests/auto/utils/utils.qbs index 4389b5b4772..4cd2d229027 100644 --- a/tests/auto/utils/utils.qbs +++ b/tests/auto/utils/utils.qbs @@ -5,6 +5,7 @@ Project { references: [ "fileutils/fileutils.qbs", "ansiescapecodehandler/ansiescapecodehandler.qbs", + "camelhumpmatcher/camelhumpmatcher.qbs", "stringutils/stringutils.qbs", "objectpool/objectpool.qbs", "templateengine/templateengine.qbs",