diff --git a/dist/changes-8.0.2.md b/dist/changelog/changes-8.0.2.md similarity index 100% rename from dist/changes-8.0.2.md rename to dist/changelog/changes-8.0.2.md diff --git a/dist/changelog/changes-9.0.1.md b/dist/changelog/changes-9.0.1.md new file mode 100644 index 00000000000..9436a7cead9 --- /dev/null +++ b/dist/changelog/changes-9.0.1.md @@ -0,0 +1,101 @@ +Qt Creator 9.0.1 +================ + +Qt Creator version 9.0.1 contains bug fixes. + +The most important changes are listed in this document. For a complete list of +changes, see the Git log for the Qt Creator sources that you can check out from +the public Git repository. For example: + + git clone git://code.qt.io/qt-creator/qt-creator.git + git log --cherry-pick --pretty=oneline origin/v9.0.0..v9.0.1 + +General +------- + +* Improved performance in the context of file path handling +* Fixed missing `No updates found.` message after looking for updates +* Fixed loading of custom external tools definitions + +Editing +------- + +* Fixed double `*` sign at end of long document names in dropdown + +### C++ + +* Fixed jumping to wrong symbol with `Follow Symbol` (QTCREATORBUG-28452) +* Fixed display of tab size in code style settings (QTCREATORBUG-28450) +* Fixed crash after closing settings when opened from indexing progress + (QTCREATORBUG-28566) +* Fixed crash when opening type hierarchy (QTCREATORBUG-28529) +* Fixed code style settings being saved even when canceling +* Fixed checkbox state in Beautifier settings (QTCREATORBUG-28525) + +Projects +-------- + +### CMake + +* Fixed that build environment was not migrated to the new configuration + environment (QTCREATORBUG-28372) +* Fixed handling of `inherits` for deeper hierarchies (QTCREATORBUG-28498) + +Debugging +--------- + +* Fixed handling of macros in source path mapping (QTCREATORBUG-28484) + +### GDB + +* Fixed pretty printer of `std::string` from `libc++` (QTCREATORBUG-28511) + +### CDB + +* Fixed source path mapping (QTCREATORBUG-28521) + +Analyzer +-------- + +### Clang + +* Fixed crash when clearing selection in settings (QTCREATORBUG-28524) + +Test Integration +---------------- + +### Google Test + +* Fixed debugging (QTCREATORBUG-28504) + +Platforms +--------- + +### Linux + +* Fixed wrong colors with GTK3 platform theme (QTCREATORBUG-28497) + +### Docker + +* Fixed that working directory for remote processes was not made reachable + +Credits for these changes go to: +-------------------------------- +Alessandro Portale +André Pönitz +Artem Sokolovskii +Christian Kandeler +Christian Stenger +Cristian Adam +David Schulz +Eike Ziller +Jaroslaw Kobus +Kai Köhne +Kwangsub Kim +Leena Miettinen +Marcus Tillmanns +Orgad Shaneh +Riitta-Leena Miettinen +Thomas Hartmann +Tim Jenssen +Ulf Hermann diff --git a/share/qtcreator/translations/qtcreator_de.ts b/share/qtcreator/translations/qtcreator_de.ts index 790c66800c7..eeb1f1091f4 100644 --- a/share/qtcreator/translations/qtcreator_de.ts +++ b/share/qtcreator/translations/qtcreator_de.ts @@ -212,7 +212,7 @@ Clear system environment - Systemumgebung löschen + Systemumgebung bereinigen Help @@ -2700,11 +2700,11 @@ Trotzdem fortfahren? Sort Members of Classes and Structs Alphabetically - Mitglieder von Klassen und Strukturen alphabetisch sortieren + Member von Klassen und Strukturen alphabetisch sortieren Sort members of classes and structs alphabetically - Mitglieder von Klassen und Strukturen alphabetisch sortieren + Member von Klassen und Strukturen alphabetisch sortieren Use Debugging Helpers @@ -5435,7 +5435,7 @@ Bitte wählen Sie einen 64-bit-Debugger in den Kit-Einstellungen für dieses Kit Debugging complex command lines is currently not supported on Windows. - Komplexe Kommandozeilen werden beim Debuggen unter Windows gegenwärtig nicht unterstützt. + Komplexe Kommandozeilen werden beim Debuggen unter Windows aktuell nicht unterstützt. Not enough free ports for QML debugging. @@ -6013,7 +6013,7 @@ Das Setzen von Haltepunkten anhand von Dateinamen und Zeilennummern könnte fehl A debugging session is still in progress. Terminating the session in the current state can leave the target in an inconsistent state. Would you still like to terminate it? - Der Debugger läuft noch. Das Beenden im gegenwärtigen Zustand könnte zu einem inkonsistenten Zustand des untersuchten Prozesses führen. Möchten Sie ihn trotzdem beenden? + Der Debugger läuft noch. Das Beenden im aktuellen Zustand könnte zu einem inkonsistenten Zustand des untersuchten Prozesses führen. Möchten Sie ihn trotzdem beenden? Debugged executable @@ -8835,11 +8835,11 @@ Leer lassen, um das Dateisystem zu durchsuchen. Saves the current state of your work and resets the repository. - Speichert den gegenwärtigen Stand der Arbeit und setzt das Repository zurück. + Speichert den aktuellen Stand der Arbeit und setzt das Repository zurück. Saves the current state of your unstaged files and resets the repository to its staged state. - Speichert den gegenwärtigen Stand der nicht bereitgestellten Dateien und setzt das Repository auf den bereitgestellten Zustand zurück. + Speichert den aktuellen Stand der nicht bereitgestellten Dateien und setzt das Repository auf den bereitgestellten Zustand zurück. Take Snapshot... @@ -8847,7 +8847,7 @@ Leer lassen, um das Dateisystem zu durchsuchen. Saves the current state of your work. - Sichert den gegenwärtigen Arbeitsstand. + Sichert den aktuellen Arbeitsstand. Restores changes saved to the stash list using "Stash". @@ -10497,7 +10497,7 @@ Außer: %2 The build configuration <b>%1</b> is currently being built. - Die Build-Konfiguration <b>%1</b> wird gegenwärtig erstellt. + Die Build-Konfiguration <b>%1</b> wird gerade erstellt. Do you want to cancel the build process and remove the Build Configuration anyway? @@ -10855,7 +10855,7 @@ konnte dem Projekt "%2" nicht hinzugefügt werden. The deploy configuration <b>%1</b> is currently being built. - Die Deployment-Konfiguration <b>%1</b> wird gegenwärtig ausgeführt. + Die Deployment-Konfiguration <b>%1</b> wird gerade erstellt. Do you want to cancel the build process and remove the Deploy Configuration anyway? @@ -10992,7 +10992,7 @@ konnte dem Projekt "%2" nicht hinzugefügt werden. Run Without Deployment - Ausführung ohne Deployment + Ausführen ohne Deployment Cancel Build @@ -11548,7 +11548,7 @@ Bitte versuchen Sie es erneut. Expand All - Alles aufklappen + Alle aufklappen Quick Switch Kit Selector @@ -13755,7 +13755,7 @@ Was möchten Sie tun? Name of current build - Name der gegenwärtigen Build-Konfiguration + Name der aktuellen Build-Konfiguration Main file of current project @@ -13783,7 +13783,7 @@ Was möchten Sie tun? Type of current build - Typ der gegenwärtigen Build-Konfiguration + Typ der aktuellen Build-Konfiguration Type of the project's active build configuration @@ -14110,7 +14110,7 @@ Locked components cannot be modified or selected. Expand All - Alles aufklappen + Alle aufklappen Collapse All @@ -14355,7 +14355,7 @@ Locked components cannot be modified or selected. The following ABIs are currently not supported: %1 - Die folgenden ABIs werden gegenwärtig nicht unterstützt: %1 + Die folgenden ABIs werden aktuell nicht unterstützt: %1 Select a qmake Executable @@ -14475,7 +14475,7 @@ Locked components cannot be modified or selected. <p>The project you are about to open is located in the write-protected location:</p><blockquote>%1</blockquote><p>Please select a writable location below and click "Copy Project and Open" to open a modifiable copy of the project or click "Keep Project and Open" to open the project in location.</p><p><b>Note:</b> You will not be able to alter or compile your project in the current location.</p> - <p>Das zu öffnende Projekt befindet sich in einem schreibgeschützten Verzeichnis:</p><blockquote>%1</blockquote><p>Bitte geben Sie ein schreibbares Verzeichnis an und wählen dann "Kopieren und öffne Projekt", um eine modifizierbare Kopie des Projektes erhalten, oder "Öffne Projekt hier", um das Projekt im gegenwärtigen Verzeichnis zu öffnen</p><p><b>Hinweis:</b> Im gegenwärtigen.Verzeichnis kann das Projekt weder compiliert noch modifiziert werden.</p> + <p>Das zu öffnende Projekt befindet sich in einem schreibgeschützten Verzeichnis:</p><blockquote>%1</blockquote><p>Bitte geben Sie ein schreibbares Verzeichnis an und wählen dann "Kopieren und öffne Projekt", um eine modifizierbare Kopie des Projektes erhalten, oder "Öffne Projekt hier", um das Projekt im aktuellen Verzeichnis zu öffnen</p><p><b>Hinweis:</b> Im aktuellen Verzeichnis kann das Projekt weder compiliert noch modifiziert werden.</p> &Location: @@ -16678,7 +16678,7 @@ Möchten Sie sie überschreiben? Debugging complex shell commands in a terminal is currently not supported. - Das Debuggen komplexer Shell-Kommandos in einem Terminal wird gegenwärtig nicht unterstützt. + Das Debuggen komplexer Shell-Kommandos in einem Terminal wird aktuell nicht unterstützt. Quoting error in terminal command. @@ -16764,7 +16764,7 @@ konnte nicht unter Versionsverwaltung (%2) gestellt werden CppEditor::Internal::CppOutlineTreeView Expand All - Alles aufklappen + Alle aufklappen Collapse All @@ -21563,7 +21563,7 @@ Außer: %3 No updates found. - Es wurden keine Aktualisierungen gefunden. + Keine Aktualisierungen gefunden. Could not determine location of maintenance tool. Please check your installation if you did not enable this plugin manually. @@ -22675,7 +22675,7 @@ Gibt an, wie sich die Rücktaste bezüglich Einrückung verhält. Pressing Alt displays context-sensitive help or type information as tooltips. - Drücken Sie die Alt-Taste um kontextabhängige Hilfe oder Typinformation als Tool-Tip anzuzeigen. + Drücken Sie die Alt-Taste um kontextabhängige Hilfe oder Typinformation als Tooltip anzuzeigen. Using Select Block Up / Down actions will now provide smarter selections. @@ -25135,7 +25135,7 @@ the manifest file by overriding your settings. Allow override? Scan only the currently edited document - Nur im gegenwärtig bearbeiteten Dokument suchen + Nur im aktuell bearbeiteten Dokument suchen Scan the current subproject @@ -25163,7 +25163,7 @@ the manifest file by overriding your settings. Allow override? Scan only the currently edited document. - Nur im gegenwärtig bearbeiteten Dokument suchen. + Nur im aktuell bearbeiteten Dokument suchen. Active Project @@ -25359,7 +25359,7 @@ the manifest file by overriding your settings. Allow override? Type Specific - typspezifisch + Typabhängig &Add... @@ -37198,11 +37198,11 @@ Warnung: Dies ist eine experimentelle Funktion und könnte dazu führen, dass di Expand All - Alles aufklappen + Alle aufklappen Collapse All - Alles einklappen + Alle einklappen Sort Alphabetically @@ -41490,7 +41490,7 @@ Wird benutzt um die Funktion zu markieren, die ein gesuchtes Symbol benutzt. Class' data members. - Mitgliedsvariablen von Klassen. + Membervariablen einer Klasse. Global @@ -48329,7 +48329,7 @@ Useful if build directory is corrupted or when rebuilding with a newer version o Clear system environment - Systemumgebung löschen + Systemumgebung bereinigen @@ -53840,7 +53840,7 @@ Use drag and drop to change the order of the parameters. Expand All - Alles aufklappen + Alle aufklappen Collapse All @@ -55510,7 +55510,7 @@ Hinweis: Dies macht Sie anfällig für Man-in-the-middle-Angriffe. Use context-specific margin - Kontextspezifischen Rand verwenden + Kontextabhängigen Rand verwenden If available, use a different margin. For example, the ColumnLimit from the ClangFormat plugin. diff --git a/src/libs/cplusplus/LookupContext.cpp b/src/libs/cplusplus/LookupContext.cpp index dee9e65d21a..14d7f922efa 100644 --- a/src/libs/cplusplus/LookupContext.cpp +++ b/src/libs/cplusplus/LookupContext.cpp @@ -433,7 +433,7 @@ QList LookupContext::lookup(const Name *name, Scope *scope) const { QList candidates; - if (! name) + if (!name) return candidates; for (; scope; scope = scope->enclosingScope()) { diff --git a/src/plugins/baremetal/iarewtoolchain.cpp b/src/plugins/baremetal/iarewtoolchain.cpp index 6972a92bd9b..d75610681c3 100644 --- a/src/plugins/baremetal/iarewtoolchain.cpp +++ b/src/plugins/baremetal/iarewtoolchain.cpp @@ -415,10 +415,10 @@ Toolchains IarToolChainFactory::autoDetect(const ToolchainDetector &detector) co #ifdef Q_OS_WIN + QStringList registryNodes; + registryNodes << "HKEY_LOCAL_MACHINE\\SOFTWARE\\IAR Systems\\Embedded Workbench"; #ifdef Q_OS_WIN64 - static const char kRegistryNode[] = "HKEY_LOCAL_MACHINE\\SOFTWARE\\WOW6432Node\\IAR Systems\\Embedded Workbench"; -#else - static const char kRegistryNode[] = "HKEY_LOCAL_MACHINE\\SOFTWARE\\IAR Systems\\Embedded Workbench"; + registryNodes << "HKEY_LOCAL_MACHINE\\SOFTWARE\\WOW6432Node\\IAR Systems\\Embedded Workbench"; #endif // Dictionary for know toolchains. @@ -446,33 +446,35 @@ Toolchains IarToolChainFactory::autoDetect(const ToolchainDetector &detector) co {{"EWCR16C"}, {"/cr16c/bin/icccr16c.exe"}}, }; - QSettings registry(kRegistryNode, QSettings::NativeFormat); - const auto oneLevelGroups = registry.childGroups(); - for (const QString &oneLevelKey : oneLevelGroups) { - registry.beginGroup(oneLevelKey); - const auto twoLevelGroups = registry.childGroups(); - for (const Entry &entry : knowToolchains) { - if (twoLevelGroups.contains(entry.registryKey)) { - registry.beginGroup(entry.registryKey); - const auto threeLevelGroups = registry.childGroups(); - for (const QString &threeLevelKey : threeLevelGroups) { - registry.beginGroup(threeLevelKey); - QString compilerPath = registry.value("InstallPath").toString(); - if (!compilerPath.isEmpty()) { - // Build full compiler path. - compilerPath += entry.subExePath; - const FilePath fn = FilePath::fromString(compilerPath); - if (compilerExists(fn)) { - // Note: threeLevelKey is a guessed toolchain version. - candidates.push_back({fn, threeLevelKey}); + for (const QString ®istryNode : registryNodes) { + QSettings registry(registryNode, QSettings::NativeFormat); + const auto oneLevelGroups = registry.childGroups(); + for (const QString &oneLevelKey : oneLevelGroups) { + registry.beginGroup(oneLevelKey); + const auto twoLevelGroups = registry.childGroups(); + for (const Entry &entry : knowToolchains) { + if (twoLevelGroups.contains(entry.registryKey)) { + registry.beginGroup(entry.registryKey); + const auto threeLevelGroups = registry.childGroups(); + for (const QString &threeLevelKey : threeLevelGroups) { + registry.beginGroup(threeLevelKey); + QString compilerPath = registry.value("InstallPath").toString(); + if (!compilerPath.isEmpty()) { + // Build full compiler path. + compilerPath += entry.subExePath; + const FilePath fn = FilePath::fromString(compilerPath); + if (compilerExists(fn)) { + // Note: threeLevelKey is a guessed toolchain version. + candidates.push_back({fn, threeLevelKey}); + } } + registry.endGroup(); } registry.endGroup(); } - registry.endGroup(); } + registry.endGroup(); } - registry.endGroup(); } #endif // Q_OS_WIN diff --git a/src/plugins/beautifier/clangformat/clangformatoptionspage.cpp b/src/plugins/beautifier/clangformat/clangformatoptionspage.cpp index d6244eb466d..1e6a9f5c14a 100644 --- a/src/plugins/beautifier/clangformat/clangformatoptionspage.cpp +++ b/src/plugins/beautifier/clangformat/clangformatoptionspage.cpp @@ -13,6 +13,7 @@ #include #include +#include #include #include #include @@ -47,8 +48,10 @@ ClangFormatOptionsPageWidget::ClangFormatOptionsPageWidget(ClangFormatSettings * auto options = new QGroupBox(tr("Options")); options->setEnabled(false); + auto styleButtonGroup = new QButtonGroup(this); + auto useCustomizedStyle = new QRadioButton(tr("Use customized style:")); - useCustomizedStyle->setAutoExclusive(true); + styleButtonGroup->addButton(useCustomizedStyle); m_configurations = new ConfigurationPanel; m_configurations->setSettings(m_settings); @@ -57,7 +60,7 @@ ClangFormatOptionsPageWidget::ClangFormatOptionsPageWidget(ClangFormatSettings * m_usePredefinedStyle = new QRadioButton(tr("Use predefined style:")); m_usePredefinedStyle->setChecked(true); - m_usePredefinedStyle->setAutoExclusive(true); + styleButtonGroup->addButton(m_usePredefinedStyle); m_predefinedStyle = new QComboBox; m_predefinedStyle->addItems(m_settings->predefinedStyles()); diff --git a/src/plugins/clangcodemodel/clangdclient.cpp b/src/plugins/clangcodemodel/clangdclient.cpp index 329b91b6318..eec93aa46c9 100644 --- a/src/plugins/clangcodemodel/clangdclient.cpp +++ b/src/plugins/clangcodemodel/clangdclient.cpp @@ -394,7 +394,12 @@ ClangdClient::ClangdClient(Project *project, const Utils::FilePath &jsonDbDir) project ? tr("Indexing %1 with clangd").arg(project->displayName()) : tr("Indexing session with clangd")); setClickHandlerForToken(indexingToken(), [] { - ICore::showOptionsDialog(CppEditor::Constants::CPP_CLANGD_SETTINGS_ID); + // don't directly open modal dialog from click handler, because that would mess + // up the stack + QMetaObject::invokeMethod( + ICore::instance(), + [] { ICore::showOptionsDialog(CppEditor::Constants::CPP_CLANGD_SETTINGS_ID); }, + Qt::QueuedConnection); }); setCurrentProject(project); setDocumentChangeUpdateThreshold(d->settings.documentUpdateThreshold); diff --git a/src/plugins/coreplugin/dialogs/saveitemsdialog.cpp b/src/plugins/coreplugin/dialogs/saveitemsdialog.cpp index 25e77a77785..57b43c92933 100644 --- a/src/plugins/coreplugin/dialogs/saveitemsdialog.cpp +++ b/src/plugins/coreplugin/dialogs/saveitemsdialog.cpp @@ -55,7 +55,6 @@ SaveItemsDialog::SaveItemsDialog(QWidget *parent, const QList &item } m_buttonBox->setStandardButtons(QDialogButtonBox::Cancel | QDialogButtonBox::Save); QPushButton *discardButton = m_buttonBox->addButton(tr("Do &Not Save"), discardButtonRole); - m_buttonBox->button(QDialogButtonBox::Save)->setDefault(true); m_treeWidget->setFocus(); m_saveBeforeBuildCheckBox->setVisible(false); @@ -103,6 +102,8 @@ SaveItemsDialog::SaveItemsDialog(QWidget *parent, const QList &item &SaveItemsDialog::collectItemsToSave); connect(discardButton, &QAbstractButton::clicked, this, &SaveItemsDialog::discardAll); connect(m_treeWidget, &QTreeWidget::itemSelectionChanged, this, &SaveItemsDialog::updateButtons); + + m_buttonBox->button(QDialogButtonBox::Save)->setDefault(true); } void SaveItemsDialog::setMessage(const QString &msg) diff --git a/src/plugins/cppeditor/cppcodestylesettingspage.cpp b/src/plugins/cppeditor/cppcodestylesettingspage.cpp index 6493c13589f..67a785809d5 100644 --- a/src/plugins/cppeditor/cppcodestylesettingspage.cpp +++ b/src/plugins/cppeditor/cppcodestylesettingspage.cpp @@ -253,11 +253,6 @@ void CppCodeStylePreferencesWidget::slotCodeStyleSettingsChanged() if (m_blockUpdates) return; - if (m_preferences) { - auto current = qobject_cast(m_preferences->currentPreferences()); - if (current) - current->setCodeStyleSettings(cppCodeStyleSettings()); - } emit codeStyleSettingsChanged(cppCodeStyleSettings()); updatePreview(); } @@ -267,12 +262,6 @@ void CppCodeStylePreferencesWidget::slotTabSettingsChanged(const TabSettings &se if (m_blockUpdates) return; - if (m_preferences) { - auto current = qobject_cast(m_preferences->currentPreferences()); - if (current) - current->setTabSettings(settings); - } - emit tabSettingsChanged(settings); updatePreview(); } @@ -355,6 +344,14 @@ void CppCodeStylePreferencesWidget::addTab(CppCodeStyleWidget *page, QString tab void CppCodeStylePreferencesWidget::apply() { + if (m_preferences) { + auto current = qobject_cast(m_preferences->currentPreferences()); + if (current) { + current->setTabSettings(tabSettings()); + current->setCodeStyleSettings(cppCodeStyleSettings()); + } + } + emit applyEmitted(); } diff --git a/src/plugins/cppeditor/cppelementevaluator.cpp b/src/plugins/cppeditor/cppelementevaluator.cpp index 281083f6ebd..98c31606e5f 100644 --- a/src/plugins/cppeditor/cppelementevaluator.cpp +++ b/src/plugins/cppeditor/cppelementevaluator.cpp @@ -94,8 +94,7 @@ public: // CppDeclarableElement CppDeclarableElement::CppDeclarableElement(Symbol *declaration) : CppElement() - , declaration(declaration) - , icon(Icons::iconForSymbol(declaration)) + , iconType(Icons::iconTypeForSymbol(declaration)) { Overview overview; overview.showArgumentNames = true; @@ -135,11 +134,6 @@ CppClass::CppClass(Symbol *declaration) : CppDeclarableElement(declaration) tooltip = qualifiedName; } -bool CppClass::operator==(const CppClass &other) -{ - return this->declaration == other.declaration; -} - CppClass *CppClass::toCppClass() { return this; @@ -148,32 +142,30 @@ CppClass *CppClass::toCppClass() void CppClass::lookupBases(QFutureInterfaceBase &futureInterface, Symbol *declaration, const LookupContext &context) { - using Data = QPair; + ClassOrNamespace *hierarchy = context.lookupType(declaration); + if (!hierarchy) + return; + QSet visited; + addBaseHierarchy(futureInterface, context, hierarchy, &visited); +} - if (ClassOrNamespace *clazz = context.lookupType(declaration)) { - QSet visited; - - QQueue q; - q.enqueue({clazz, this}); - while (!q.isEmpty()) { - if (futureInterface.isCanceled()) - return; - Data current = q.dequeue(); - clazz = current.first; - visited.insert(clazz); - const QList &bases = clazz->usings(); - for (ClassOrNamespace *baseClass : bases) { - const QList &symbols = baseClass->symbols(); - for (Symbol *symbol : symbols) { - if (symbol->asClass() && ( - clazz = context.lookupType(symbol)) && - !visited.contains(clazz)) { - CppClass baseCppClass(symbol); - CppClass *cppClass = current.second; - cppClass->bases.append(baseCppClass); - q.enqueue({clazz, &cppClass->bases.last()}); - } - } +void CppClass::addBaseHierarchy(QFutureInterfaceBase &futureInterface, const LookupContext &context, + ClassOrNamespace *hierarchy, QSet *visited) +{ + if (futureInterface.isCanceled()) + return; + visited->insert(hierarchy); + const QList &baseClasses = hierarchy->usings(); + for (ClassOrNamespace *baseClass : baseClasses) { + const QList &symbols = baseClass->symbols(); + for (Symbol *symbol : symbols) { + if (!symbol->asClass()) + continue; + ClassOrNamespace *baseHierarchy = context.lookupType(symbol); + if (baseHierarchy && !visited->contains(baseHierarchy)) { + CppClass classSymbol(symbol); + classSymbol.addBaseHierarchy(futureInterface, context, baseHierarchy, visited); + bases.append(classSymbol); } } } @@ -182,27 +174,20 @@ void CppClass::lookupBases(QFutureInterfaceBase &futureInterface, void CppClass::lookupDerived(QFutureInterfaceBase &futureInterface, Symbol *declaration, const Snapshot &snapshot) { - using Data = QPair; - snapshot.updateDependencyTable(futureInterface); if (futureInterface.isCanceled()) return; - const TypeHierarchy &completeHierarchy - = TypeHierarchyBuilder::buildDerivedTypeHierarchy(futureInterface, declaration, snapshot); + addDerivedHierarchy(TypeHierarchyBuilder::buildDerivedTypeHierarchy( + futureInterface, declaration, snapshot)); +} - QQueue q; - q.enqueue({this, completeHierarchy}); - while (!q.isEmpty()) { - if (futureInterface.isCanceled()) - return; - const Data ¤t = q.dequeue(); - CppClass *clazz = current.first; - const TypeHierarchy &classHierarchy = current.second; - const QList hierarchy = classHierarchy.hierarchy(); - for (const TypeHierarchy &derivedHierarchy : hierarchy) { - clazz->derived.append(CppClass(derivedHierarchy.symbol())); - q.enqueue({&clazz->derived.last(), derivedHierarchy}); - } +void CppClass::addDerivedHierarchy(const TypeHierarchy &hierarchy) +{ + const QList derivedHierarchies = hierarchy.hierarchy(); + for (const TypeHierarchy &derivedHierarchy : derivedHierarchies) { + CppClass classSymbol(derivedHierarchy.symbol()); + classSymbol.addDerivedHierarchy(derivedHierarchy); + derived.append(classSymbol); } } diff --git a/src/plugins/cppeditor/cppelementevaluator.h b/src/plugins/cppeditor/cppelementevaluator.h index 0b77dda08c8..14f2659b864 100644 --- a/src/plugins/cppeditor/cppelementevaluator.h +++ b/src/plugins/cppeditor/cppelementevaluator.h @@ -3,13 +3,14 @@ #pragma once -#include -#include +#include "typehierarchybuilder.h" +#include #include +#include +#include #include -#include #include #include #include @@ -18,6 +19,7 @@ #include namespace CPlusPlus { +class ClassOrNamespace; class LookupItem; class LookupContext; } @@ -76,11 +78,10 @@ public: explicit CppDeclarableElement(CPlusPlus::Symbol *declaration); public: - CPlusPlus::Symbol *declaration; + Utils::CodeModelIcon::Type iconType; QString name; QString qualifiedName; QString type; - QIcon icon; }; class CppClass : public CppDeclarableElement @@ -89,8 +90,6 @@ public: CppClass(); explicit CppClass(CPlusPlus::Symbol *declaration); - bool operator==(const CppClass &other); - CppClass *toCppClass() final; void lookupBases(QFutureInterfaceBase &futureInterface, @@ -98,9 +97,15 @@ public: void lookupDerived(QFutureInterfaceBase &futureInterface, CPlusPlus::Symbol *declaration, const CPlusPlus::Snapshot &snapshot); -public: QList bases; QList derived; + +private: + void addBaseHierarchy(QFutureInterfaceBase &futureInterface, + const CPlusPlus::LookupContext &context, + CPlusPlus::ClassOrNamespace *hierarchy, + QSet *visited); + void addDerivedHierarchy(const TypeHierarchy &hierarchy); }; } // namespace Internal diff --git a/src/plugins/cppeditor/cppquickfixes.cpp b/src/plugins/cppeditor/cppquickfixes.cpp index 0c33c377332..6392917b6c2 100644 --- a/src/plugins/cppeditor/cppquickfixes.cpp +++ b/src/plugins/cppeditor/cppquickfixes.cpp @@ -4310,6 +4310,8 @@ void GenerateGetterSetter::match(const CppQuickFixInterface &interface, QuickFix return; declarator = path.at(n - i++)->asDeclarator(); } + if (!declarator) + return; } const auto variableDecl = path.at(n - i++)->asSimpleDeclaration(); const auto classSpecifier = path.at(n - i++)->asClassSpecifier(); diff --git a/src/plugins/cppeditor/cpptypehierarchy.cpp b/src/plugins/cppeditor/cpptypehierarchy.cpp index 1720161a1b6..c3b808d4722 100644 --- a/src/plugins/cppeditor/cpptypehierarchy.cpp +++ b/src/plugins/cppeditor/cpptypehierarchy.cpp @@ -44,7 +44,7 @@ QStandardItem *itemForClass(const CppClass &cppClass) item->setData(cppClass.name, Qt::DisplayRole); if (cppClass.name != cppClass.qualifiedName) item->setData(cppClass.qualifiedName, AnnotationRole); - item->setData(cppClass.icon, Qt::DecorationRole); + item->setData(iconForType(cppClass.iconType), Qt::DecorationRole); QVariant link; link.setValue(Link(cppClass.link)); item->setData(link, LinkRole); diff --git a/src/plugins/mcusupport/mcusupportoptions.cpp b/src/plugins/mcusupport/mcusupportoptions.cpp index d2d57973b11..96ed4cd654a 100644 --- a/src/plugins/mcusupport/mcusupportoptions.cpp +++ b/src/plugins/mcusupport/mcusupportoptions.cpp @@ -111,10 +111,12 @@ void McuSdkRepository::expandVariablesAndWildcards() continue; } // drop empty_split_entry(linux)|root(windows) - pathComponents.pop_front(); + QString root = pathComponents.takeFirst(); + if (root.isEmpty()) // Linux + root = "/"; package->setPath( - expandWildcards(FilePath::fromString(QDir::rootPath()), + expandWildcards(FilePath::fromString(root), {pathComponents.constBegin(), pathComponents.constEnd()}) .first); } diff --git a/src/plugins/projectexplorer/msvctoolchain.cpp b/src/plugins/projectexplorer/msvctoolchain.cpp index 8a598c2624a..468c408adf5 100644 --- a/src/plugins/projectexplorer/msvctoolchain.cpp +++ b/src/plugins/projectexplorer/msvctoolchain.cpp @@ -2098,7 +2098,9 @@ std::optional MsvcToolChain::generateEnvironmentSettings(const Utils::E saver.write("set CLINK_NOAUTORUN=1\r\n"); saver.write("setlocal enableextensions\r\n"); saver.write("if defined VCINSTALLDIR (\r\n"); - saver.write(" call \"%VCINSTALLDIR%/Auxiliary/Build/vcvarsall.bat\" /clean_env\r\n"); + saver.write(" if not defined QTC_NO_MSVC_CLEAN_ENV (\r\n"); + saver.write(" call \"%VCINSTALLDIR%/Auxiliary/Build/vcvarsall.bat\" /clean_env\r\n"); + saver.write(" )\r\n"); saver.write(")\r\n"); saver.write(call + "\r\n"); saver.write("@echo " + marker.toLocal8Bit() + "\r\n"); diff --git a/src/plugins/projectexplorer/runcontrol.cpp b/src/plugins/projectexplorer/runcontrol.cpp index 0f24f238909..162ce90b45a 100644 --- a/src/plugins/projectexplorer/runcontrol.cpp +++ b/src/plugins/projectexplorer/runcontrol.cpp @@ -1320,7 +1320,11 @@ void SimpleTargetRunnerPrivate::stop() switch (m_state) { case Run: m_process.stop(); - m_process.waitForFinished(); + if (!m_process.waitForFinished(2000)) { // TODO: it may freeze on some devices + QTC_CHECK(false); // Shouldn't happen, just emergency handling + m_process.close(); + forwardDone(); + } break; case Inactive: break; diff --git a/src/plugins/projectexplorer/toolchainoptionspage.cpp b/src/plugins/projectexplorer/toolchainoptionspage.cpp index 9f8548aedb0..273f86e59f6 100644 --- a/src/plugins/projectexplorer/toolchainoptionspage.cpp +++ b/src/plugins/projectexplorer/toolchainoptionspage.cpp @@ -192,6 +192,8 @@ public: } } m_addButton->setMenu(addMenu); + if (HostOsInfo::isMacHost()) + m_addButton->setStyleSheet("text-align:center;"); m_cloneButton = new QPushButton(ToolChainOptionsPage::tr("Clone"), this); connect(m_cloneButton, &QAbstractButton::clicked, [this] { cloneToolChain(); }); diff --git a/src/plugins/qmakeprojectmanager/customwidgetwizard/plugingenerator.cpp b/src/plugins/qmakeprojectmanager/customwidgetwizard/plugingenerator.cpp index c3475fd1334..4795c77509f 100644 --- a/src/plugins/qmakeprojectmanager/customwidgetwizard/plugingenerator.cpp +++ b/src/plugins/qmakeprojectmanager/customwidgetwizard/plugingenerator.cpp @@ -295,20 +295,17 @@ QString PluginGenerator::processTemplate(const QString &tmpl, { Utils::FileReader reader; if (!reader.fetch(Utils::FilePath::fromString(tmpl), errorMessage)) - return QString(); - + return {}; QString cont = QString::fromUtf8(reader.data()); // Expander needed to handle extra variable "Cpp:PragmaOnce" Utils::MacroExpander *expander = Utils::globalMacroExpander(); - QString errMsg; - cont = Utils::TemplateEngine::processText(expander, cont, &errMsg); - if (!errMsg.isEmpty()) { + cont = Utils::TemplateEngine::processText(expander, cont, errorMessage); + if (!errorMessage->isEmpty()) { qWarning("Error processing custom plugin file: %s\nFile:\n%s", - qPrintable(errMsg), qPrintable(cont)); - errorMessage = &errMsg; - return QString(); + qPrintable(*errorMessage), qPrintable(cont)); + return {}; } const QChar atChar = QLatin1Char('@'); diff --git a/src/plugins/remotelinux/linuxdevice.cpp b/src/plugins/remotelinux/linuxdevice.cpp index db6057ba486..12246586730 100644 --- a/src/plugins/remotelinux/linuxdevice.cpp +++ b/src/plugins/remotelinux/linuxdevice.cpp @@ -490,8 +490,10 @@ bool SshProcessInterface::runInShell(const CommandLine &command, const QByteArra process.setCommand(cmd); process.setWriteData(data); process.start(); - QTC_CHECK(process.waitForFinished()); // otherwise we may start producing killers for killers - return process.exitCode() == 0; + bool isFinished = process.waitForFinished(2000); // TODO: it may freeze on some devices + // otherwise we may start producing killers for killers + QTC_CHECK(isFinished); + return isFinished; } void SshProcessInterface::start() diff --git a/src/plugins/squish/squishtools.cpp b/src/plugins/squish/squishtools.cpp index 4a33d45cf3a..a788ce2810e 100644 --- a/src/plugins/squish/squishtools.cpp +++ b/src/plugins/squish/squishtools.cpp @@ -1021,7 +1021,7 @@ Utils::Links SquishTools::setBreakpoints() continue; const Utils::FilePath filePath = Utils::FilePath::fromString( gb->data(BreakpointFileColumn, Qt::DisplayRole).toString()); - auto fileName = filePath.toUserOutput(); + auto fileName = filePath.canonicalPath().toUserOutput(); if (fileName.isEmpty()) continue; if (!fileName.endsWith(extension)) diff --git a/src/plugins/texteditor/texteditor.cpp b/src/plugins/texteditor/texteditor.cpp index 074c35a26c8..d8077ad5f7e 100644 --- a/src/plugins/texteditor/texteditor.cpp +++ b/src/plugins/texteditor/texteditor.cpp @@ -2696,7 +2696,8 @@ void TextEditorWidget::keyPressEvent(QKeyEvent *e) } break; case Qt::Key_Delete: - if (hasMultipleCursors && !ro && e->modifiers() == Qt::NoModifier) { + if (hasMultipleCursors && !ro + && (e->modifiers() == Qt::NoModifier || e->modifiers() == Qt::KeypadModifier)) { if (cursor.hasSelection()) { cursor.removeSelectedText(); } else { @@ -7848,7 +7849,7 @@ struct MappedText void TextEditorWidget::insertFromMimeData(const QMimeData *source) { - if (isReadOnly()) + if (!source || isReadOnly()) return; QString text = source->text(); @@ -7858,7 +7859,6 @@ void TextEditorWidget::insertFromMimeData(const QMimeData *source) if (d->m_codeAssistant.hasContext()) d->m_codeAssistant.destroyContext(); - if (d->m_snippetOverlay->isVisible() && (text.contains('\n') || text.contains('\t'))) d->m_snippetOverlay->accept(); diff --git a/src/plugins/vcsbase/vcsbaseclient.cpp b/src/plugins/vcsbase/vcsbaseclient.cpp index 0ba1497cf1e..7513c02e47d 100644 --- a/src/plugins/vcsbase/vcsbaseclient.cpp +++ b/src/plugins/vcsbase/vcsbaseclient.cpp @@ -437,7 +437,7 @@ void VcsBaseClient::revertAll(const FilePath &workingDir, if (cmd->result() == ProcessResult::FinishedWithSuccess) emit changed(files); }, Qt::QueuedConnection); - enqueueJob(createCommand(workingDir), args); + enqueueJob(cmd, args); } void VcsBaseClient::status(const FilePath &workingDir, diff --git a/tests/system/suite_editors/tst_memberoperator/test.py b/tests/system/suite_editors/tst_memberoperator/test.py index 18d5547f324..2e9980bf2b4 100644 --- a/tests/system/suite_editors/tst_memberoperator/test.py +++ b/tests/system/suite_editors/tst_memberoperator/test.py @@ -31,6 +31,8 @@ def __syntaxErrorDetected__(): "Expected ';' at end of declaration (fix available)", "Use of undeclared identifier 'syntaxError'"]: return True + if re.match(issue[3], "Declaration of reference variable '.+' requires an initializer"): + return True return False