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 bereinigenHelp
@@ -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 sortierenSort members of classes and structs alphabetically
- Mitglieder von Klassen und Strukturen alphabetisch sortieren
+ Member von Klassen und Strukturen alphabetisch sortierenUse 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 DeploymentCancel Build
@@ -11548,7 +11548,7 @@ Bitte versuchen Sie es erneut.
Expand All
- Alles aufklappen
+ Alle aufklappenQuick 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-KonfigurationMain 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-KonfigurationType of the project's active build configuration
@@ -14110,7 +14110,7 @@ Locked components cannot be modified or selected.
Expand All
- Alles aufklappen
+ Alle aufklappenCollapse 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: %1Select 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::CppOutlineTreeViewExpand All
- Alles aufklappen
+ Alle aufklappenCollapse 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 suchenScan 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 aufklappenCollapse All
- Alles einklappen
+ Alle einklappenSort 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 aufklappenCollapse 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 verwendenIf 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