diff --git a/doc/qtcreator/src/howto/creator-only/creator-how-to-contact-qt.qdoc b/doc/qtcreator/src/howto/creator-only/creator-how-to-contact-qt.qdoc index 2ca57713777..cc5ed247c5f 100644 --- a/doc/qtcreator/src/howto/creator-only/creator-how-to-contact-qt.qdoc +++ b/doc/qtcreator/src/howto/creator-only/creator-how-to-contact-qt.qdoc @@ -45,5 +45,6 @@ {#qt-creator} channel on Libera.Chat IRC, go to \uicontrol Help > \uicontrol Contact. - \sa {Paste and fetch code snippets}, {Technical Support} + \sa {Paste and fetch code snippets}, {Technical Support}, + {Turn on crash reports} */ diff --git a/doc/qtcreator/src/howto/creator-only/creator-how-to-turn-on-crash-reports.qdoc b/doc/qtcreator/src/howto/creator-only/creator-how-to-turn-on-crash-reports.qdoc index c35e71e4a0e..b2331043d4b 100644 --- a/doc/qtcreator/src/howto/creator-only/creator-how-to-turn-on-crash-reports.qdoc +++ b/doc/qtcreator/src/howto/creator-only/creator-how-to-turn-on-crash-reports.qdoc @@ -24,6 +24,20 @@ \li Select \uicontrol {Enable crash reporting}. \endlist + Crash reports are sent automatically if they don't exceed the file size + limit that Sentry sets for accepting them. You are not notified about + sending the reports or whether it succeeded or failed. + + \section1 Clear local crash reports + + \QC stores crash reports on the computer in the following directories: + + \list + \li On Windows: \c {%APPDATA%\QtProject\qtcreator\crashpad_reports} + \li On Linux and \macos: + \c {$HOME/.config/QtProject/qtcreator/crashpad_reports} + \endlist + To free up disk space that crash reports reserve on the computer, select \uicontrol {Clear Local Crash Reports}. You can see the size of the crash reports next to the button. @@ -31,5 +45,8 @@ Select \uicontrol ? to view more information about Crashpad and the security policy. + \note The best way to report a crash is to create a bug report where you + paste the corresponding stack trace. + \sa {Contact Qt} */ diff --git a/src/libs/3rdparty/cplusplus/Parser.cpp b/src/libs/3rdparty/cplusplus/Parser.cpp index fb57afe3205..21465014748 100644 --- a/src/libs/3rdparty/cplusplus/Parser.cpp +++ b/src/libs/3rdparty/cplusplus/Parser.cpp @@ -487,15 +487,17 @@ int Parser::find(int token, int stopAt) return 0; } -void Parser::match(int kind, int *token) +bool Parser::match(int kind, int *token) { - if (LA() == kind) + if (LA() == kind) { *token = consumeToken(); - else { - *token = 0; - error(_tokenIndex, "expected token `%s' got `%s'", - Token::name(kind), tok().spell()); + return true; } + + *token = 0; + error(_tokenIndex, "expected token `%s' got `%s'", + Token::name(kind), tok().spell()); + return false; } bool Parser::parseClassOrNamespaceName(NameAST *&node) @@ -3503,7 +3505,8 @@ bool Parser::parseExpressionStatement(StatementAST *&node) DEBUG_THIS_RULE(); if (LA() == T_SEMICOLON) { ExpressionStatementAST *ast = new (_pool) ExpressionStatementAST; - match(T_SEMICOLON, &ast->semicolon_token); + if (!match(T_SEMICOLON, &ast->semicolon_token)) + return false; node = ast; return true; } @@ -3524,9 +3527,10 @@ bool Parser::parseExpressionStatement(StatementAST *&node) ExpressionStatementAST *ast = new (previousPool) ExpressionStatementAST; if (expression) ast->expression = expression->clone(previousPool); - match(T_SEMICOLON, &ast->semicolon_token); - node = ast; - parsed = true; + if (match(T_SEMICOLON, &ast->semicolon_token)) { + node = ast; + parsed = true; + } } _inExpressionStatement = wasInExpressionStatement; diff --git a/src/libs/3rdparty/cplusplus/Parser.h b/src/libs/3rdparty/cplusplus/Parser.h index 7c19c6d0ad6..93687aece7d 100644 --- a/src/libs/3rdparty/cplusplus/Parser.h +++ b/src/libs/3rdparty/cplusplus/Parser.h @@ -273,7 +273,7 @@ public: const Identifier *className(ClassSpecifierAST *ast) const; const Identifier *identifier(NameAST *name) const; - void match(int kind, int *token); + bool match(int kind, int *token); bool maybeAmbiguousStatement(DeclarationStatementAST *ast, StatementAST *&node); bool maybeForwardOrClassDeclaration(SpecifierListAST *decl_specifier_seq) const; diff --git a/src/libs/solutions/terminal/terminalsurface.cpp b/src/libs/solutions/terminal/terminalsurface.cpp index 0c6d88f62ec..40dc2809c0d 100644 --- a/src/libs/solutions/terminal/terminalsurface.cpp +++ b/src/libs/solutions/terminal/terminalsurface.cpp @@ -120,6 +120,7 @@ struct TerminalSurfacePrivate }; m_vtermScreenCallbacks.sb_clear = [](void *user) { auto p = static_cast(user); + emit p->q->cleared(); return p->sb_clear(); }; m_vtermScreenCallbacks.bell = [](void *user) { diff --git a/src/libs/solutions/terminal/terminalsurface.h b/src/libs/solutions/terminal/terminalsurface.h index a8cc12fa4b0..6700156da9b 100644 --- a/src/libs/solutions/terminal/terminalsurface.h +++ b/src/libs/solutions/terminal/terminalsurface.h @@ -111,6 +111,7 @@ signals: void cursorChanged(Cursor oldCursor, Cursor newCursor); void altscreenChanged(bool altScreen); void unscroll(); + void cleared(); private: std::unique_ptr d; diff --git a/src/libs/solutions/terminal/terminalview.cpp b/src/libs/solutions/terminal/terminalview.cpp index 7ed75159a54..1010e546d97 100644 --- a/src/libs/solutions/terminal/terminalview.cpp +++ b/src/libs/solutions/terminal/terminalview.cpp @@ -176,6 +176,7 @@ TerminalSurface *TerminalView::surface() const void TerminalView::setupSurface() { d->m_surface = std::make_unique(QSize{80, 60}); + connect(d->m_surface.get(), &TerminalSurface::cleared, this, &TerminalView::cleared); if (d->m_surfaceIntegration) d->m_surface->setSurfaceIntegration(d->m_surfaceIntegration); diff --git a/src/libs/solutions/terminal/terminalview.h b/src/libs/solutions/terminal/terminalview.h index 6e0c55d06f8..fcc5994a75e 100644 --- a/src/libs/solutions/terminal/terminalview.h +++ b/src/libs/solutions/terminal/terminalview.h @@ -224,6 +224,9 @@ protected: private: void scheduleViewportUpdate(); +signals: + void cleared(); + private: std::unique_ptr d; }; diff --git a/src/libs/utils/stringutils.cpp b/src/libs/utils/stringutils.cpp index 04617064cab..e70a7fbb592 100644 --- a/src/libs/utils/stringutils.cpp +++ b/src/libs/utils/stringutils.cpp @@ -228,6 +228,9 @@ QTCREATOR_UTILS_EXPORT int parseUsedPortFromNetstatOutput(const QByteArray &line return -1; } + if (columnToParse.size() > 0 && columnToParse.back() == '*') + return -1; // Valid case, no warning. See QNX udp case. + const int port = trailingNumber(columnToParse, base); if (port == -1) { qWarning("%s: Unexpected string '%s' is not a port. Tried to read from '%s'", diff --git a/src/libs/utils/tooltip/tips.cpp b/src/libs/utils/tooltip/tips.cpp index 180b8f960f2..5f0a1ed42d5 100644 --- a/src/libs/utils/tooltip/tips.cpp +++ b/src/libs/utils/tooltip/tips.cpp @@ -5,6 +5,7 @@ #include "tooltip.h" #include "../qtcassert.h" +#include "../hostosinfo.h" #include #include @@ -249,7 +250,8 @@ void WidgetTip::configure(const QPoint &pos) move(pos); m_layout->addWidget(m_widget); m_layout->setSizeConstraint(QLayout::SetFixedSize); - adjustSize(); + if (!HostOsInfo::isMacHost()) // work around QTBUG-131479 + adjustSize(); } void WidgetTip::pinToolTipWidget(QWidget *parent) diff --git a/src/plugins/autotoolsprojectmanager/AutotoolsProjectManager.json.in b/src/plugins/autotoolsprojectmanager/AutotoolsProjectManager.json.in index 76ac64def6f..620d6936118 100644 --- a/src/plugins/autotoolsprojectmanager/AutotoolsProjectManager.json.in +++ b/src/plugins/autotoolsprojectmanager/AutotoolsProjectManager.json.in @@ -25,5 +25,29 @@ ], "Url" : "https://www.qt.io", "DocumentationUrl" : "https://doc.qt.io/qtcreator/creator-projects-autotools.html", - ${IDE_PLUGIN_DEPENDENCIES} + ${IDE_PLUGIN_DEPENDENCIES}, + + "Mimetypes" : [ + "", + "", + " ", + " Makefile build file", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "" + ] } diff --git a/src/plugins/autotoolsprojectmanager/CMakeLists.txt b/src/plugins/autotoolsprojectmanager/CMakeLists.txt index f78daac7e07..09ec0b2646b 100644 --- a/src/plugins/autotoolsprojectmanager/CMakeLists.txt +++ b/src/plugins/autotoolsprojectmanager/CMakeLists.txt @@ -5,7 +5,6 @@ add_qtc_plugin(AutotoolsProjectManager autogenstep.cpp autogenstep.h autoreconfstep.cpp autoreconfstep.h autotoolsbuildconfiguration.cpp autotoolsbuildconfiguration.h - autotoolsbuildsystem.cpp autotoolsbuildsystem.h autotoolsprojectconstants.h autotoolsprojectmanagertr.h autotoolsprojectplugin.cpp diff --git a/src/plugins/autotoolsprojectmanager/autotoolsbuildconfiguration.cpp b/src/plugins/autotoolsprojectmanager/autotoolsbuildconfiguration.cpp index 142794f9cee..dcce460621e 100644 --- a/src/plugins/autotoolsprojectmanager/autotoolsbuildconfiguration.cpp +++ b/src/plugins/autotoolsprojectmanager/autotoolsbuildconfiguration.cpp @@ -5,29 +5,191 @@ #include "autotoolsprojectconstants.h" #include "autotoolsprojectmanagertr.h" +#include "makefileparser.h" #include #include #include +#include #include #include #include +#include #include +#include + +#include + +#include #include using namespace ProjectExplorer; +using namespace Tasking; using namespace Utils; namespace AutotoolsProjectManager::Internal { -// AutotoolsBuildConfiguration +// AutotoolsBuildSystem +class AutotoolsBuildSystem final : public BuildSystem +{ +public: + explicit AutotoolsBuildSystem(BuildConfiguration *bc); +private: + void triggerParsing() final; + QString name() const final { return QLatin1String("autotools"); } + + /** + * Is invoked when the makefile parsing by m_makefileParserThread has + * been finished. Adds all sources and files into the project tree and + * takes care listen to file changes for Makefile.am and configure.ac + * files. + */ + void makefileParsingFinished(const MakefileParserOutputData &outputData); + + /// Return value for AutotoolsProject::files() + QStringList m_files; + + /// Responsible for parsing the makefiles asynchronously in a thread + Tasking::TaskTreeRunner m_parserRunner; + + std::unique_ptr m_cppCodeModelUpdater; +}; + +AutotoolsBuildSystem::AutotoolsBuildSystem(BuildConfiguration *bc) + : BuildSystem(bc) + , m_cppCodeModelUpdater(ProjectUpdaterFactory::createCppProjectUpdater()) +{ + connect(project(), &Project::projectFileIsDirty, this, [this] { requestParse(); }); +} + +static void parseMakefileImpl(QPromise &promise, const QString &makefile) +{ + const auto result = parseMakefile(makefile, QFuture(promise.future())); + if (result) + promise.addResult(*result); + else + promise.future().cancel(); +} + +void AutotoolsBuildSystem::triggerParsing() +{ + const Storage> storage; + + const auto onSetup = [this, storage](Async &async) { + *storage = guardParsingRun(); + async.setConcurrentCallData(parseMakefileImpl, projectFilePath().path()); + }; + const auto onDone = [this, storage](const Async &async) { + (*storage)->markAsSuccess(); + makefileParsingFinished(async.result()); + }; + + const Group recipe { + storage, + AsyncTask(onSetup, onDone, CallDoneIf::Success) + }; + m_parserRunner.start(recipe); +} + +static QStringList filterIncludes(const QString &absSrc, const QString &absBuild, + const QStringList &in) +{ + QStringList result; + for (const QString &i : in) { + QString out = i; + out.replace(QLatin1String("$(top_srcdir)"), absSrc); + out.replace(QLatin1String("$(abs_top_srcdir)"), absSrc); + + out.replace(QLatin1String("$(top_builddir)"), absBuild); + out.replace(QLatin1String("$(abs_top_builddir)"), absBuild); + + result << out; + } + return result; +} + +void AutotoolsBuildSystem::makefileParsingFinished(const MakefileParserOutputData &outputData) +{ + m_files.clear(); + + QSet filesToWatch; + + // Apply sources to m_files, which are returned at AutotoolsBuildSystem::files() + const QFileInfo fileInfo = projectFilePath().toFileInfo(); + const QDir dir = fileInfo.absoluteDir(); + const QStringList files = outputData.m_sources; + for (const QString& file : files) + m_files.append(dir.absoluteFilePath(file)); + + // Watch for changes of Makefile.am files. If a Makefile.am file + // has been changed, the project tree must be reparsed. + const QStringList makefiles = outputData.m_makefiles; + for (const QString &makefile : makefiles) { + const QString absMakefile = dir.absoluteFilePath(makefile); + + m_files.append(absMakefile); + + filesToWatch.insert(FilePath::fromString(absMakefile)); + } + + // Add configure.ac file to project and watch for changes. + const QLatin1String configureAc(QLatin1String("configure.ac")); + const QFile configureAcFile(fileInfo.absolutePath() + QLatin1Char('/') + configureAc); + if (configureAcFile.exists()) { + const QString absConfigureAc = dir.absoluteFilePath(configureAc); + m_files.append(absConfigureAc); + + filesToWatch.insert(FilePath::fromString(absConfigureAc)); + } + + auto newRoot = std::make_unique(project()->projectDirectory()); + for (const QString &f : std::as_const(m_files)) { + const FilePath path = FilePath::fromString(f); + newRoot->addNestedNode(std::make_unique(path, + FileNode::fileTypeForFileName(path))); + } + setRootProjectNode(std::move(newRoot)); + project()->setExtraProjectFiles(filesToWatch); + + QtSupport::CppKitInfo kitInfo(kit()); + QTC_ASSERT(kitInfo.isValid(), return ); + + RawProjectPart rpp; + rpp.setDisplayName(project()->displayName()); + rpp.setProjectFileLocation(projectFilePath()); + rpp.setQtVersion(kitInfo.projectPartQtVersion); + const QStringList cflags = outputData.m_cflags; + QStringList cxxflags = outputData.m_cxxflags; + if (cxxflags.isEmpty()) + cxxflags = cflags; + + const FilePath includeFileBaseDir = projectDirectory(); + rpp.setFlagsForC({kitInfo.cToolchain, cflags, includeFileBaseDir}); + rpp.setFlagsForCxx({kitInfo.cxxToolchain, cxxflags, includeFileBaseDir}); + + const QString absSrc = project()->projectDirectory().path(); + BuildConfiguration *bc = target()->activeBuildConfiguration(); + + const QString absBuild = bc ? bc->buildDirectory().path() : QString(); + + rpp.setIncludePaths(filterIncludes(absSrc, absBuild, outputData.m_includePaths)); + rpp.setMacros(outputData.m_macros); + rpp.setFiles(m_files); + + m_cppCodeModelUpdater->update({project(), kitInfo, activeParseEnvironment(), {rpp}}); + + emitBuildSystemUpdated(); +} + +// AutotoolsBuildConfiguration class AutotoolsBuildConfiguration final : public BuildConfiguration { public: AutotoolsBuildConfiguration(Target *target, Id id) : BuildConfiguration(target, id) + , m_buildSystem(new AutotoolsBuildSystem(this)) { // / is used so the un-changed check in setBuildDirectory() works correctly. // The leading / is to avoid the relative the path expansion in BuildConfiguration::buildDirectory. @@ -48,6 +210,13 @@ public: // ### Build Steps Clean ### appendInitialCleanStep(Constants::MAKE_STEP_ID); // make clean } + + ~AutotoolsBuildConfiguration() override { delete m_buildSystem; } + +private: + BuildSystem *buildSystem() const override { return m_buildSystem; } + + AutotoolsBuildSystem * const m_buildSystem; }; class AutotoolsBuildConfigurationFactory final : public BuildConfigurationFactory diff --git a/src/plugins/autotoolsprojectmanager/autotoolsbuildsystem.cpp b/src/plugins/autotoolsprojectmanager/autotoolsbuildsystem.cpp deleted file mode 100644 index 0c79660e377..00000000000 --- a/src/plugins/autotoolsprojectmanager/autotoolsbuildsystem.cpp +++ /dev/null @@ -1,187 +0,0 @@ -// Copyright (C) 2016 Openismus GmbH. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 - -#include "autotoolsbuildsystem.h" - -#include "makefileparser.h" - -#include -#include -#include -#include - -#include - -#include - -#include -#include - -using namespace ProjectExplorer; -using namespace Tasking; -using namespace Utils; - -namespace AutotoolsProjectManager::Internal { - -class AutotoolsBuildSystem final : public BuildSystem -{ -public: - explicit AutotoolsBuildSystem(Target *target); - ~AutotoolsBuildSystem() final; - -private: - void triggerParsing() final; - QString name() const final { return QLatin1String("autotools"); } - - /** - * Is invoked when the makefile parsing by m_makefileParserThread has - * been finished. Adds all sources and files into the project tree and - * takes care listen to file changes for Makefile.am and configure.ac - * files. - */ - void makefileParsingFinished(const MakefileParserOutputData &outputData); - - /// Return value for AutotoolsProject::files() - QStringList m_files; - - /// Responsible for parsing the makefiles asynchronously in a thread - Tasking::TaskTreeRunner m_parserRunner; - - std::unique_ptr m_cppCodeModelUpdater; -}; - -AutotoolsBuildSystem::AutotoolsBuildSystem(Target *target) - : BuildSystem(target) - , m_cppCodeModelUpdater(ProjectUpdaterFactory::createCppProjectUpdater()) -{ - connect(target, &Target::activeBuildConfigurationChanged, this, [this] { requestParse(); }); - connect(target->project(), &Project::projectFileIsDirty, this, [this] { requestParse(); }); -} - -AutotoolsBuildSystem::~AutotoolsBuildSystem() = default; - -static void parseMakefileImpl(QPromise &promise, const QString &makefile) -{ - const auto result = parseMakefile(makefile, QFuture(promise.future())); - if (result) - promise.addResult(*result); - else - promise.future().cancel(); -} - -void AutotoolsBuildSystem::triggerParsing() -{ - const Storage> storage; - - const auto onSetup = [this, storage](Async &async) { - *storage = guardParsingRun(); - async.setConcurrentCallData(parseMakefileImpl, projectFilePath().path()); - }; - const auto onDone = [this, storage](const Async &async) { - (*storage)->markAsSuccess(); - makefileParsingFinished(async.result()); - }; - - const Group recipe { - storage, - AsyncTask(onSetup, onDone, CallDoneIf::Success) - }; - m_parserRunner.start(recipe); -} - -static QStringList filterIncludes(const QString &absSrc, const QString &absBuild, - const QStringList &in) -{ - QStringList result; - for (const QString &i : in) { - QString out = i; - out.replace(QLatin1String("$(top_srcdir)"), absSrc); - out.replace(QLatin1String("$(abs_top_srcdir)"), absSrc); - - out.replace(QLatin1String("$(top_builddir)"), absBuild); - out.replace(QLatin1String("$(abs_top_builddir)"), absBuild); - - result << out; - } - return result; -} - -void AutotoolsBuildSystem::makefileParsingFinished(const MakefileParserOutputData &outputData) -{ - m_files.clear(); - - QSet filesToWatch; - - // Apply sources to m_files, which are returned at AutotoolsBuildSystem::files() - const QFileInfo fileInfo = projectFilePath().toFileInfo(); - const QDir dir = fileInfo.absoluteDir(); - const QStringList files = outputData.m_sources; - for (const QString& file : files) - m_files.append(dir.absoluteFilePath(file)); - - // Watch for changes of Makefile.am files. If a Makefile.am file - // has been changed, the project tree must be reparsed. - const QStringList makefiles = outputData.m_makefiles; - for (const QString &makefile : makefiles) { - const QString absMakefile = dir.absoluteFilePath(makefile); - - m_files.append(absMakefile); - - filesToWatch.insert(FilePath::fromString(absMakefile)); - } - - // Add configure.ac file to project and watch for changes. - const QLatin1String configureAc(QLatin1String("configure.ac")); - const QFile configureAcFile(fileInfo.absolutePath() + QLatin1Char('/') + configureAc); - if (configureAcFile.exists()) { - const QString absConfigureAc = dir.absoluteFilePath(configureAc); - m_files.append(absConfigureAc); - - filesToWatch.insert(FilePath::fromString(absConfigureAc)); - } - - auto newRoot = std::make_unique(project()->projectDirectory()); - for (const QString &f : std::as_const(m_files)) { - const FilePath path = FilePath::fromString(f); - newRoot->addNestedNode(std::make_unique(path, - FileNode::fileTypeForFileName(path))); - } - setRootProjectNode(std::move(newRoot)); - project()->setExtraProjectFiles(filesToWatch); - - QtSupport::CppKitInfo kitInfo(kit()); - QTC_ASSERT(kitInfo.isValid(), return ); - - RawProjectPart rpp; - rpp.setDisplayName(project()->displayName()); - rpp.setProjectFileLocation(projectFilePath()); - rpp.setQtVersion(kitInfo.projectPartQtVersion); - const QStringList cflags = outputData.m_cflags; - QStringList cxxflags = outputData.m_cxxflags; - if (cxxflags.isEmpty()) - cxxflags = cflags; - - const FilePath includeFileBaseDir = projectDirectory(); - rpp.setFlagsForC({kitInfo.cToolchain, cflags, includeFileBaseDir}); - rpp.setFlagsForCxx({kitInfo.cxxToolchain, cxxflags, includeFileBaseDir}); - - const QString absSrc = project()->projectDirectory().path(); - BuildConfiguration *bc = target()->activeBuildConfiguration(); - - const QString absBuild = bc ? bc->buildDirectory().path() : QString(); - - rpp.setIncludePaths(filterIncludes(absSrc, absBuild, outputData.m_includePaths)); - rpp.setMacros(outputData.m_macros); - rpp.setFiles(m_files); - - m_cppCodeModelUpdater->update({project(), kitInfo, activeParseEnvironment(), {rpp}}); - - emitBuildSystemUpdated(); -} - -BuildSystem *createAutotoolsBuildSystem(Target *target) -{ - return new AutotoolsBuildSystem(target); -} - -} // AutotoolsProjectManager::Internal diff --git a/src/plugins/autotoolsprojectmanager/autotoolsbuildsystem.h b/src/plugins/autotoolsprojectmanager/autotoolsbuildsystem.h deleted file mode 100644 index 25cd6e829e3..00000000000 --- a/src/plugins/autotoolsprojectmanager/autotoolsbuildsystem.h +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright (C) 2016 Openismus GmbH. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 - -#pragma once - -#include - -namespace AutotoolsProjectManager::Internal { - -ProjectExplorer::BuildSystem *createAutotoolsBuildSystem(ProjectExplorer::Target *target); - -} // AutotoolsProjectManager::Internal diff --git a/src/plugins/autotoolsprojectmanager/autotoolsprojectmanager.qbs b/src/plugins/autotoolsprojectmanager/autotoolsprojectmanager.qbs index cefd8722c21..ae276372430 100644 --- a/src/plugins/autotoolsprojectmanager/autotoolsprojectmanager.qbs +++ b/src/plugins/autotoolsprojectmanager/autotoolsprojectmanager.qbs @@ -17,8 +17,6 @@ QtcPlugin { "autoreconfstep.h", "autotoolsbuildconfiguration.cpp", "autotoolsbuildconfiguration.h", - "autotoolsbuildsystem.cpp", - "autotoolsbuildsystem.h", "autotoolsprojectconstants.h", "autotoolsprojectmanagertr.h", "autotoolsprojectplugin.cpp", diff --git a/src/plugins/autotoolsprojectmanager/autotoolsprojectplugin.cpp b/src/plugins/autotoolsprojectmanager/autotoolsprojectplugin.cpp index 212f0cdb666..8bf0ecfe171 100644 --- a/src/plugins/autotoolsprojectmanager/autotoolsprojectplugin.cpp +++ b/src/plugins/autotoolsprojectmanager/autotoolsprojectplugin.cpp @@ -4,7 +4,6 @@ #include "autogenstep.h" #include "autoreconfstep.h" #include "autotoolsbuildconfiguration.h" -#include "autotoolsbuildsystem.h" #include "autotoolsprojectconstants.h" #include "configurestep.h" #include "makestep.h" @@ -41,7 +40,6 @@ public: setProjectLanguages(Core::Context(ProjectExplorer::Constants::CXX_LANGUAGE_ID)); setDisplayName(projectDirectory().fileName()); setHasMakeInstallEquivalent(true); - setBuildSystemCreator(&createAutotoolsBuildSystem); } }; diff --git a/src/plugins/coreplugin/terminal/searchableterminal.cpp b/src/plugins/coreplugin/terminal/searchableterminal.cpp index 5022be6b19c..66626523464 100644 --- a/src/plugins/coreplugin/terminal/searchableterminal.cpp +++ b/src/plugins/coreplugin/terminal/searchableterminal.cpp @@ -47,6 +47,18 @@ void TerminalSearch::setSearchString(const QString &searchString, FindFlags find } } +void TerminalSearch::clearAndSearchAgain() +{ + if (!m_hits.isEmpty()) { + m_hits.clear(); + m_currentHit = -1; + emit hitsChanged(); + emit currentHitChanged(); + } + + m_debounceTimer.start(); +} + void TerminalSearch::nextHit() { if (m_hits.isEmpty()) @@ -67,13 +79,6 @@ void TerminalSearch::previousHit() void TerminalSearch::updateHits() { - if (!m_hits.isEmpty()) { - m_hits.clear(); - m_currentHit = -1; - emit hitsChanged(); - emit currentHitChanged(); - } - m_debounceTimer.start(); } @@ -282,6 +287,10 @@ SearchableTerminal::SearchableTerminal(QWidget *parent) m_aggregate->add(this); surfaceChanged(); + + connect(this, &TerminalSolution::TerminalView::cleared, this, [this] { + m_search->clearAndSearchAgain(); + }); } SearchableTerminal::~SearchableTerminal() = default; diff --git a/src/plugins/coreplugin/terminal/searchableterminal.h b/src/plugins/coreplugin/terminal/searchableterminal.h index d1747fd99b2..958dac3bac0 100644 --- a/src/plugins/coreplugin/terminal/searchableterminal.h +++ b/src/plugins/coreplugin/terminal/searchableterminal.h @@ -25,6 +25,7 @@ public: void setCurrentSelection(std::optional selection); void setSearchString(const QString &searchString, Utils::FindFlags findFlags); + void clearAndSearchAgain(); void nextHit(); void previousHit(); diff --git a/src/plugins/debugger/debuggerruncontrol.cpp b/src/plugins/debugger/debuggerruncontrol.cpp index fcf291e24e2..a585deb5fc7 100644 --- a/src/plugins/debugger/debuggerruncontrol.cpp +++ b/src/plugins/debugger/debuggerruncontrol.cpp @@ -54,6 +54,7 @@ #include #include +#include #include using namespace Core; @@ -104,6 +105,9 @@ public: // DebugServer Process debuggerServerProc; + QTextCodec *debuggerServerCodec = QTextCodec::codecForName("utf8"); + QTextCodec::ConverterState outputCodecState; // FIXME: Handle on Process side. + QTextCodec::ConverterState errorCodecState; ProcessHandle serverAttachPid; bool serverUseMulti = true; bool serverEssential = true; @@ -1142,8 +1146,29 @@ void DebuggerRunTool::startDebugServerIfNeededAndContinueStartup() } } + if (auto terminalAspect = runControl()->aspectData()) { + const bool useTerminal = terminalAspect->useTerminal; + d->debuggerServerProc.setTerminalMode(useTerminal ? TerminalMode::Run : TerminalMode::Off); + } + d->debuggerServerProc.setCommand(cmd); + connect(&d->debuggerServerProc, &Process::readyReadStandardOutput, + this, [this] { + const QByteArray data = d->debuggerServerProc.readAllRawStandardOutput(); + const QString msg = d->debuggerServerCodec->toUnicode( + data.constData(), data.length(), &d->outputCodecState); + runControl()->postMessage(msg, StdOutFormat, false); + }); + + connect(&d->debuggerServerProc, &Process::readyReadStandardError, + this, [this] { + const QByteArray data = d->debuggerServerProc.readAllRawStandardError(); + const QString msg = d->debuggerServerCodec->toUnicode( + data.constData(), data.length(), &d->errorCodecState); + runControl()->postMessage(msg, StdErrFormat, false); + }); + connect(&d->debuggerServerProc, &Process::started, this, [this] { continueAfterDebugServerStart(); }); diff --git a/src/plugins/debugger/debuggertooltipmanager.cpp b/src/plugins/debugger/debuggertooltipmanager.cpp index 946a45955f9..e3e4879c923 100644 --- a/src/plugins/debugger/debuggertooltipmanager.cpp +++ b/src/plugins/debugger/debuggertooltipmanager.cpp @@ -464,6 +464,7 @@ DebuggerToolTipWidget::DebuggerToolTipWidget(DebuggerEngine *engine, auto mainLayout = new QVBoxLayout(this); mainLayout->setSizeConstraint(QLayout::SetFixedSize); mainLayout->setContentsMargins(0, 0, 0, 0); + mainLayout->setSpacing(0); mainLayout->addWidget(toolBar); mainLayout->addWidget(treeView); diff --git a/src/plugins/languageclient/languageclientquickfix.cpp b/src/plugins/languageclient/languageclientquickfix.cpp index 1f882608771..e14c66d138a 100644 --- a/src/plugins/languageclient/languageclientquickfix.cpp +++ b/src/plugins/languageclient/languageclientquickfix.cpp @@ -87,6 +87,22 @@ void LanguageClientQuickFixAssistProcessor::cancel() } } +QuickFixOperations LanguageClientQuickFixAssistProcessor::resultToOperations(const LanguageServerProtocol::CodeActionResult &result) +{ + auto list = std::get_if>>(&result); + if (!list) + return {}; + + QuickFixOperations ops; + for (const std::variant &item : *list) { + if (auto action = std::get_if(&item)) + ops << new CodeActionQuickFixOperation(*action, m_client); + else if (auto command = std::get_if(&item)) + ops << new CommandQuickFixOperation(*command, m_client); + } + return ops; +} + void LanguageClientQuickFixAssistProcessor::handleCodeActionResponse(const CodeActionRequest::Response &response) { m_currentRequest.reset(); @@ -101,17 +117,7 @@ void LanguageClientQuickFixAssistProcessor::handleCodeActionResponse(const CodeA GenericProposal *LanguageClientQuickFixAssistProcessor::handleCodeActionResult(const CodeActionResult &result) { - if (auto list = std::get_if>>(&result)) { - QuickFixOperations ops; - for (const std::variant &item : *list) { - if (auto action = std::get_if(&item)) - ops << new CodeActionQuickFixOperation(*action, m_client); - else if (auto command = std::get_if(&item)) - ops << new CommandQuickFixOperation(*command, m_client); - } - return GenericProposal::createProposal(interface(), ops); - } - return nullptr; + return GenericProposal::createProposal(interface(), resultToOperations(result)); } LanguageClientQuickFixProvider::LanguageClientQuickFixProvider(Client *client) diff --git a/src/plugins/languageclient/languageclientquickfix.h b/src/plugins/languageclient/languageclientquickfix.h index d83a236170b..5fe85034b1a 100644 --- a/src/plugins/languageclient/languageclientquickfix.h +++ b/src/plugins/languageclient/languageclientquickfix.h @@ -67,6 +67,8 @@ public: void cancel() override; protected: + TextEditor::QuickFixOperations resultToOperations( + const LanguageServerProtocol::CodeActionResult &result); void setOnlyKinds(const QList &only); Client *client() { return m_client; } diff --git a/src/plugins/languageclient/lualanguageclient/lualanguageclient.cpp b/src/plugins/languageclient/lualanguageclient/lualanguageclient.cpp index ce37bdecda4..52b130c1d60 100644 --- a/src/plugins/languageclient/lualanguageclient/lualanguageclient.cpp +++ b/src/plugins/languageclient/lualanguageclient/lualanguageclient.cpp @@ -490,7 +490,6 @@ public: m_initializationOptions = options.as(); emit optionsChanged(); - LanguageClientManager::applySettings(); m_isUpdatingAsyncOptions = false; }); diff --git a/src/plugins/projectexplorer/buildsystem.cpp b/src/plugins/projectexplorer/buildsystem.cpp index 52c5b73f024..55c74a4bc90 100644 --- a/src/plugins/projectexplorer/buildsystem.cpp +++ b/src/plugins/projectexplorer/buildsystem.cpp @@ -242,6 +242,7 @@ ExtraCompiler *BuildSystem::extraCompilerForTarget(const Utils::FilePath &target MakeInstallCommand BuildSystem::makeInstallCommand(const FilePath &installRoot) const { QTC_ASSERT(target()->project()->hasMakeInstallEquivalent(), return {}); + QTC_ASSERT(buildConfiguration(), return {}); BuildStepList *buildSteps = buildConfiguration()->buildSteps(); QTC_ASSERT(buildSteps, return {}); diff --git a/src/plugins/qmljseditor/qmllsclient.cpp b/src/plugins/qmljseditor/qmllsclient.cpp index 6bb253f2932..1fdc30a124a 100644 --- a/src/plugins/qmljseditor/qmllsclient.cpp +++ b/src/plugins/qmljseditor/qmllsclient.cpp @@ -6,12 +6,16 @@ #include "qmljseditorconstants.h" #include "qmljseditortr.h" #include "qmljseditorsettings.h" +#include "qmljsquickfix.h" #include #include +#include #include +#include +#include #include #include #include @@ -107,6 +111,41 @@ void QmllsClient::updateQmllsSemanticHighlightingCapability() } } +class QmllsQuickFixAssistProcessor : public LanguageClientQuickFixAssistProcessor +{ +public: + using LanguageClientQuickFixAssistProcessor::LanguageClientQuickFixAssistProcessor; +private: + TextEditor::GenericProposal *perform() override + { + // Step 1: Collect qmlls code actions asynchronously + LanguageClientQuickFixAssistProcessor::perform(); + + // Step 2: Collect built-in quickfixes synchronously + m_builtinOps = findQmlJSQuickFixes(interface()); + + return nullptr; + } + + TextEditor::GenericProposal *handleCodeActionResult(const LanguageServerProtocol::CodeActionResult &result) override + { + return TextEditor::GenericProposal::createProposal( + interface(), resultToOperations(result) + m_builtinOps); + } + + QuickFixOperations m_builtinOps; +}; + +class QmllsQuickFixAssistProvider : public LanguageClientQuickFixProvider +{ +public: + using LanguageClientQuickFixProvider::LanguageClientQuickFixProvider; + TextEditor::IAssistProcessor *createProcessor(const TextEditor::AssistInterface *) const override + { + return new QmllsQuickFixAssistProcessor(client()); + } +}; + QmllsClient::QmllsClient(StdIOClientInterface *interface) : Client(interface) { @@ -178,6 +217,7 @@ QmllsClient::QmllsClient(StdIOClientInterface *interface) } return std::nullopt; }); + setQuickFixAssistProvider(new QmllsQuickFixAssistProvider(this)); } QmllsClient::~QmllsClient() diff --git a/src/plugins/webassembly/webassemblysettings.cpp b/src/plugins/webassembly/webassemblysettings.cpp index 4c90c6e1f60..b21e4048f17 100644 --- a/src/plugins/webassembly/webassemblysettings.cpp +++ b/src/plugins/webassembly/webassemblysettings.cpp @@ -70,7 +70,7 @@ WebAssemblySettings::WebAssemblySettings() "or %3 version that you plan to develop against.") .arg(R"(Emscripten SDK)") .arg(R"(Qt 5)") - .arg(R"(Qt 6)")); + .arg(R"(Qt 6)")); instruction->setOpenExternalLinks(true); instruction->setWordWrap(true);