Merge remote-tracking branch 'origin/9.0' into qds/dev

Change-Id: I4305c3b37814cc3a926e8e56cabe5f8935f8f2c0
This commit is contained in:
Tim Jenssen
2022-12-14 11:30:05 +01:00
23 changed files with 259 additions and 147 deletions

101
dist/changelog/changes-9.0.1.md vendored Normal file
View File

@@ -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

View File

@@ -212,7 +212,7 @@
</message> </message>
<message> <message>
<source>Clear system environment</source> <source>Clear system environment</source>
<translation>Systemumgebung löschen</translation> <translation>Systemumgebung bereinigen</translation>
</message> </message>
<message> <message>
<source>Help</source> <source>Help</source>
@@ -2700,11 +2700,11 @@ Trotzdem fortfahren?</translation>
</message> </message>
<message> <message>
<source>Sort Members of Classes and Structs Alphabetically</source> <source>Sort Members of Classes and Structs Alphabetically</source>
<translation>Mitglieder von Klassen und Strukturen alphabetisch sortieren</translation> <translation>Member von Klassen und Strukturen alphabetisch sortieren</translation>
</message> </message>
<message> <message>
<source>Sort members of classes and structs alphabetically</source> <source>Sort members of classes and structs alphabetically</source>
<translation>Mitglieder von Klassen und Strukturen alphabetisch sortieren</translation> <translation>Member von Klassen und Strukturen alphabetisch sortieren</translation>
</message> </message>
<message> <message>
<source>Use Debugging Helpers</source> <source>Use Debugging Helpers</source>
@@ -5435,7 +5435,7 @@ Bitte wählen Sie einen 64-bit-Debugger in den Kit-Einstellungen für dieses Kit
</message> </message>
<message> <message>
<source>Debugging complex command lines is currently not supported on Windows.</source> <source>Debugging complex command lines is currently not supported on Windows.</source>
<translation>Komplexe Kommandozeilen werden beim Debuggen unter Windows gegenwärtig nicht unterstützt.</translation> <translation>Komplexe Kommandozeilen werden beim Debuggen unter Windows aktuell nicht unterstützt.</translation>
</message> </message>
<message> <message>
<source>Not enough free ports for QML debugging.</source> <source>Not enough free ports for QML debugging.</source>
@@ -6013,7 +6013,7 @@ Das Setzen von Haltepunkten anhand von Dateinamen und Zeilennummern könnte fehl
</message> </message>
<message> <message>
<source>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?</source> <source>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?</source>
<translation>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?</translation> <translation>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?</translation>
</message> </message>
<message> <message>
<source>Debugged executable</source> <source>Debugged executable</source>
@@ -8835,11 +8835,11 @@ Leer lassen, um das Dateisystem zu durchsuchen.</translation>
</message> </message>
<message> <message>
<source>Saves the current state of your work and resets the repository.</source> <source>Saves the current state of your work and resets the repository.</source>
<translation>Speichert den gegenwärtigen Stand der Arbeit und setzt das Repository zurück.</translation> <translation>Speichert den aktuellen Stand der Arbeit und setzt das Repository zurück.</translation>
</message> </message>
<message> <message>
<source>Saves the current state of your unstaged files and resets the repository to its staged state.</source> <source>Saves the current state of your unstaged files and resets the repository to its staged state.</source>
<translation>Speichert den gegenwärtigen Stand der nicht bereitgestellten Dateien und setzt das Repository auf den bereitgestellten Zustand zurück.</translation> <translation>Speichert den aktuellen Stand der nicht bereitgestellten Dateien und setzt das Repository auf den bereitgestellten Zustand zurück.</translation>
</message> </message>
<message> <message>
<source>Take Snapshot...</source> <source>Take Snapshot...</source>
@@ -8847,7 +8847,7 @@ Leer lassen, um das Dateisystem zu durchsuchen.</translation>
</message> </message>
<message> <message>
<source>Saves the current state of your work.</source> <source>Saves the current state of your work.</source>
<translation>Sichert den gegenwärtigen Arbeitsstand.</translation> <translation>Sichert den aktuellen Arbeitsstand.</translation>
</message> </message>
<message> <message>
<source>Restores changes saved to the stash list using &quot;Stash&quot;.</source> <source>Restores changes saved to the stash list using &quot;Stash&quot;.</source>
@@ -10497,7 +10497,7 @@ Außer: %2
</message> </message>
<message> <message>
<source>The build configuration &lt;b&gt;%1&lt;/b&gt; is currently being built.</source> <source>The build configuration &lt;b&gt;%1&lt;/b&gt; is currently being built.</source>
<translation>Die Build-Konfiguration &lt;b&gt;%1&lt;/b&gt; wird gegenwärtig erstellt.</translation> <translation>Die Build-Konfiguration &lt;b&gt;%1&lt;/b&gt; wird gerade erstellt.</translation>
</message> </message>
<message> <message>
<source>Do you want to cancel the build process and remove the Build Configuration anyway?</source> <source>Do you want to cancel the build process and remove the Build Configuration anyway?</source>
@@ -10855,7 +10855,7 @@ konnte dem Projekt &quot;%2&quot; nicht hinzugefügt werden.</translation>
</message> </message>
<message> <message>
<source>The deploy configuration &lt;b&gt;%1&lt;/b&gt; is currently being built.</source> <source>The deploy configuration &lt;b&gt;%1&lt;/b&gt; is currently being built.</source>
<translation>Die Deployment-Konfiguration &lt;b&gt;%1&lt;/b&gt; wird gegenwärtig ausgeführt.</translation> <translation>Die Deployment-Konfiguration &lt;b&gt;%1&lt;/b&gt; wird gerade erstellt.</translation>
</message> </message>
<message> <message>
<source>Do you want to cancel the build process and remove the Deploy Configuration anyway?</source> <source>Do you want to cancel the build process and remove the Deploy Configuration anyway?</source>
@@ -10992,7 +10992,7 @@ konnte dem Projekt &quot;%2&quot; nicht hinzugefügt werden.</translation>
</message> </message>
<message> <message>
<source>Run Without Deployment</source> <source>Run Without Deployment</source>
<translation>Ausführung ohne Deployment</translation> <translation>Ausführen ohne Deployment</translation>
</message> </message>
<message> <message>
<source>Cancel Build</source> <source>Cancel Build</source>
@@ -11548,7 +11548,7 @@ Bitte versuchen Sie es erneut.</translation>
</message> </message>
<message> <message>
<source>Expand All</source> <source>Expand All</source>
<translation>Alles aufklappen</translation> <translation>Alle aufklappen</translation>
</message> </message>
<message> <message>
<source>Quick Switch Kit Selector</source> <source>Quick Switch Kit Selector</source>
@@ -13755,7 +13755,7 @@ Was möchten Sie tun?</translation>
</message> </message>
<message> <message>
<source>Name of current build</source> <source>Name of current build</source>
<translation>Name der gegenwärtigen Build-Konfiguration</translation> <translation>Name der aktuellen Build-Konfiguration</translation>
</message> </message>
<message> <message>
<source>Main file of current project</source> <source>Main file of current project</source>
@@ -13783,7 +13783,7 @@ Was möchten Sie tun?</translation>
</message> </message>
<message> <message>
<source>Type of current build</source> <source>Type of current build</source>
<translation>Typ der gegenwärtigen Build-Konfiguration</translation> <translation>Typ der aktuellen Build-Konfiguration</translation>
</message> </message>
<message> <message>
<source>Type of the project&apos;s active build configuration</source> <source>Type of the project&apos;s active build configuration</source>
@@ -14110,7 +14110,7 @@ Locked components cannot be modified or selected.</source>
</message> </message>
<message> <message>
<source>Expand All</source> <source>Expand All</source>
<translation>Alles aufklappen</translation> <translation>Alle aufklappen</translation>
</message> </message>
<message> <message>
<source>Collapse All</source> <source>Collapse All</source>
@@ -14355,7 +14355,7 @@ Locked components cannot be modified or selected.</source>
</message> </message>
<message> <message>
<source>The following ABIs are currently not supported: %1</source> <source>The following ABIs are currently not supported: %1</source>
<translation>Die folgenden ABIs werden gegenwärtig nicht unterstützt: %1</translation> <translation>Die folgenden ABIs werden aktuell nicht unterstützt: %1</translation>
</message> </message>
<message> <message>
<source>Select a qmake Executable</source> <source>Select a qmake Executable</source>
@@ -14475,7 +14475,7 @@ Locked components cannot be modified or selected.</source>
</message> </message>
<message> <message>
<source>&lt;p&gt;The project you are about to open is located in the write-protected location:&lt;/p&gt;&lt;blockquote&gt;%1&lt;/blockquote&gt;&lt;p&gt;Please select a writable location below and click &quot;Copy Project and Open&quot; to open a modifiable copy of the project or click &quot;Keep Project and Open&quot; to open the project in location.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; You will not be able to alter or compile your project in the current location.&lt;/p&gt;</source> <source>&lt;p&gt;The project you are about to open is located in the write-protected location:&lt;/p&gt;&lt;blockquote&gt;%1&lt;/blockquote&gt;&lt;p&gt;Please select a writable location below and click &quot;Copy Project and Open&quot; to open a modifiable copy of the project or click &quot;Keep Project and Open&quot; to open the project in location.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; You will not be able to alter or compile your project in the current location.&lt;/p&gt;</source>
<translation>&lt;p&gt;Das zu öffnende Projekt befindet sich in einem schreibgeschützten Verzeichnis:&lt;/p&gt;&lt;blockquote&gt;%1&lt;/blockquote&gt;&lt;p&gt;Bitte geben Sie ein schreibbares Verzeichnis an und wählen dann &quot;Kopieren und öffne Projekt&quot;, um eine modifizierbare Kopie des Projektes erhalten, oder &quot;Öffne Projekt hier&quot;, um das Projekt im gegenwärtigen Verzeichnis zu öffnen&lt;/p&gt;&lt;p&gt;&lt;b&gt;Hinweis:&lt;/b&gt; Im gegenwärtigen.Verzeichnis kann das Projekt weder compiliert noch modifiziert werden.&lt;/p&gt;</translation> <translation>&lt;p&gt;Das zu öffnende Projekt befindet sich in einem schreibgeschützten Verzeichnis:&lt;/p&gt;&lt;blockquote&gt;%1&lt;/blockquote&gt;&lt;p&gt;Bitte geben Sie ein schreibbares Verzeichnis an und wählen dann &quot;Kopieren und öffne Projekt&quot;, um eine modifizierbare Kopie des Projektes erhalten, oder &quot;Öffne Projekt hier&quot;, um das Projekt im aktuellen Verzeichnis zu öffnen&lt;/p&gt;&lt;p&gt;&lt;b&gt;Hinweis:&lt;/b&gt; Im aktuellen Verzeichnis kann das Projekt weder compiliert noch modifiziert werden.&lt;/p&gt;</translation>
</message> </message>
<message> <message>
<source>&amp;Location:</source> <source>&amp;Location:</source>
@@ -16678,7 +16678,7 @@ Möchten Sie sie überschreiben?</translation>
</message> </message>
<message> <message>
<source>Debugging complex shell commands in a terminal is currently not supported.</source> <source>Debugging complex shell commands in a terminal is currently not supported.</source>
<translation>Das Debuggen komplexer Shell-Kommandos in einem Terminal wird gegenwärtig nicht unterstützt.</translation> <translation>Das Debuggen komplexer Shell-Kommandos in einem Terminal wird aktuell nicht unterstützt.</translation>
</message> </message>
<message> <message>
<source>Quoting error in terminal command.</source> <source>Quoting error in terminal command.</source>
@@ -16764,7 +16764,7 @@ konnte nicht unter Versionsverwaltung (%2) gestellt werden
<name>CppEditor::Internal::CppOutlineTreeView</name> <name>CppEditor::Internal::CppOutlineTreeView</name>
<message> <message>
<source>Expand All</source> <source>Expand All</source>
<translation>Alles aufklappen</translation> <translation>Alle aufklappen</translation>
</message> </message>
<message> <message>
<source>Collapse All</source> <source>Collapse All</source>
@@ -21563,7 +21563,7 @@ Außer: %3
</message> </message>
<message> <message>
<source>No updates found.</source> <source>No updates found.</source>
<translation>Es wurden keine Aktualisierungen gefunden.</translation> <translation>Keine Aktualisierungen gefunden.</translation>
</message> </message>
<message> <message>
<source>Could not determine location of maintenance tool. Please check your installation if you did not enable this plugin manually.</source> <source>Could not determine location of maintenance tool. Please check your installation if you did not enable this plugin manually.</source>
@@ -22675,7 +22675,7 @@ Gibt an, wie sich die Rücktaste bezüglich Einrückung verhält.
</message> </message>
<message> <message>
<source>Pressing Alt displays context-sensitive help or type information as tooltips.</source> <source>Pressing Alt displays context-sensitive help or type information as tooltips.</source>
<translation>Drücken Sie die Alt-Taste um kontextabhängige Hilfe oder Typinformation als Tool-Tip anzuzeigen.</translation> <translation>Drücken Sie die Alt-Taste um kontextabhängige Hilfe oder Typinformation als Tooltip anzuzeigen.</translation>
</message> </message>
<message> <message>
<source>Using Select Block Up / Down actions will now provide smarter selections.</source> <source>Using Select Block Up / Down actions will now provide smarter selections.</source>
@@ -25135,7 +25135,7 @@ the manifest file by overriding your settings. Allow override?</source>
</message> </message>
<message> <message>
<source>Scan only the currently edited document</source> <source>Scan only the currently edited document</source>
<translation>Nur im gegenwärtig bearbeiteten Dokument suchen</translation> <translation>Nur im aktuell bearbeiteten Dokument suchen</translation>
</message> </message>
<message> <message>
<source>Scan the current subproject</source> <source>Scan the current subproject</source>
@@ -25163,7 +25163,7 @@ the manifest file by overriding your settings. Allow override?</source>
</message> </message>
<message> <message>
<source>Scan only the currently edited document.</source> <source>Scan only the currently edited document.</source>
<translation>Nur im gegenwärtig bearbeiteten Dokument suchen.</translation> <translation>Nur im aktuell bearbeiteten Dokument suchen.</translation>
</message> </message>
<message> <message>
<source>Active Project</source> <source>Active Project</source>
@@ -25359,7 +25359,7 @@ the manifest file by overriding your settings. Allow override?</source>
</message> </message>
<message> <message>
<source>Type Specific</source> <source>Type Specific</source>
<translation>typspezifisch</translation> <translation>Typabhängig</translation>
</message> </message>
<message> <message>
<source>&amp;Add...</source> <source>&amp;Add...</source>
@@ -37198,11 +37198,11 @@ Warnung: Dies ist eine experimentelle Funktion und könnte dazu führen, dass di
</message> </message>
<message> <message>
<source>Expand All</source> <source>Expand All</source>
<translation>Alles aufklappen</translation> <translation>Alle aufklappen</translation>
</message> </message>
<message> <message>
<source>Collapse All</source> <source>Collapse All</source>
<translation>Alles einklappen</translation> <translation>Alle einklappen</translation>
</message> </message>
<message> <message>
<source>Sort Alphabetically</source> <source>Sort Alphabetically</source>
@@ -41490,7 +41490,7 @@ Wird benutzt um die Funktion zu markieren, die ein gesuchtes Symbol benutzt.</tr
</message> </message>
<message> <message>
<source>Class&apos; data members.</source> <source>Class&apos; data members.</source>
<translation>Mitgliedsvariablen von Klassen.</translation> <translation>Membervariablen einer Klasse.</translation>
</message> </message>
<message> <message>
<source>Global</source> <source>Global</source>
@@ -48329,7 +48329,7 @@ Useful if build directory is corrupted or when rebuilding with a newer version o
</message> </message>
<message> <message>
<source>Clear system environment</source> <source>Clear system environment</source>
<translation>Systemumgebung löschen</translation> <translation>Systemumgebung bereinigen</translation>
</message> </message>
</context> </context>
<context> <context>
@@ -53840,7 +53840,7 @@ Use drag and drop to change the order of the parameters.</source>
</message> </message>
<message> <message>
<source>Expand All</source> <source>Expand All</source>
<translation>Alles aufklappen</translation> <translation>Alle aufklappen</translation>
</message> </message>
<message> <message>
<source>Collapse All</source> <source>Collapse All</source>
@@ -55510,7 +55510,7 @@ Hinweis: Dies macht Sie anfällig für Man-in-the-middle-Angriffe.</translation>
</message> </message>
<message> <message>
<source>Use context-specific margin</source> <source>Use context-specific margin</source>
<translation>Kontextspezifischen Rand verwenden</translation> <translation>Kontextabhängigen Rand verwenden</translation>
</message> </message>
<message> <message>
<source>If available, use a different margin. For example, the ColumnLimit from the ClangFormat plugin.</source> <source>If available, use a different margin. For example, the ColumnLimit from the ClangFormat plugin.</source>

View File

@@ -433,7 +433,7 @@ QList<LookupItem> LookupContext::lookup(const Name *name, Scope *scope) const
{ {
QList<LookupItem> candidates; QList<LookupItem> candidates;
if (! name) if (!name)
return candidates; return candidates;
for (; scope; scope = scope->enclosingScope()) { for (; scope; scope = scope->enclosingScope()) {

View File

@@ -415,10 +415,10 @@ Toolchains IarToolChainFactory::autoDetect(const ToolchainDetector &detector) co
#ifdef Q_OS_WIN #ifdef Q_OS_WIN
QStringList registryNodes;
registryNodes << "HKEY_LOCAL_MACHINE\\SOFTWARE\\IAR Systems\\Embedded Workbench";
#ifdef Q_OS_WIN64 #ifdef Q_OS_WIN64
static const char kRegistryNode[] = "HKEY_LOCAL_MACHINE\\SOFTWARE\\WOW6432Node\\IAR Systems\\Embedded Workbench"; registryNodes << "HKEY_LOCAL_MACHINE\\SOFTWARE\\WOW6432Node\\IAR Systems\\Embedded Workbench";
#else
static const char kRegistryNode[] = "HKEY_LOCAL_MACHINE\\SOFTWARE\\IAR Systems\\Embedded Workbench";
#endif #endif
// Dictionary for know toolchains. // Dictionary for know toolchains.
@@ -446,33 +446,35 @@ Toolchains IarToolChainFactory::autoDetect(const ToolchainDetector &detector) co
{{"EWCR16C"}, {"/cr16c/bin/icccr16c.exe"}}, {{"EWCR16C"}, {"/cr16c/bin/icccr16c.exe"}},
}; };
QSettings registry(kRegistryNode, QSettings::NativeFormat); for (const QString &registryNode : registryNodes) {
const auto oneLevelGroups = registry.childGroups(); QSettings registry(registryNode, QSettings::NativeFormat);
for (const QString &oneLevelKey : oneLevelGroups) { const auto oneLevelGroups = registry.childGroups();
registry.beginGroup(oneLevelKey); for (const QString &oneLevelKey : oneLevelGroups) {
const auto twoLevelGroups = registry.childGroups(); registry.beginGroup(oneLevelKey);
for (const Entry &entry : knowToolchains) { const auto twoLevelGroups = registry.childGroups();
if (twoLevelGroups.contains(entry.registryKey)) { for (const Entry &entry : knowToolchains) {
registry.beginGroup(entry.registryKey); if (twoLevelGroups.contains(entry.registryKey)) {
const auto threeLevelGroups = registry.childGroups(); registry.beginGroup(entry.registryKey);
for (const QString &threeLevelKey : threeLevelGroups) { const auto threeLevelGroups = registry.childGroups();
registry.beginGroup(threeLevelKey); for (const QString &threeLevelKey : threeLevelGroups) {
QString compilerPath = registry.value("InstallPath").toString(); registry.beginGroup(threeLevelKey);
if (!compilerPath.isEmpty()) { QString compilerPath = registry.value("InstallPath").toString();
// Build full compiler path. if (!compilerPath.isEmpty()) {
compilerPath += entry.subExePath; // Build full compiler path.
const FilePath fn = FilePath::fromString(compilerPath); compilerPath += entry.subExePath;
if (compilerExists(fn)) { const FilePath fn = FilePath::fromString(compilerPath);
// Note: threeLevelKey is a guessed toolchain version. if (compilerExists(fn)) {
candidates.push_back({fn, threeLevelKey}); // Note: threeLevelKey is a guessed toolchain version.
candidates.push_back({fn, threeLevelKey});
}
} }
registry.endGroup();
} }
registry.endGroup(); registry.endGroup();
} }
registry.endGroup();
} }
registry.endGroup();
} }
registry.endGroup();
} }
#endif // Q_OS_WIN #endif // Q_OS_WIN

View File

@@ -13,6 +13,7 @@
#include <utils/layoutbuilder.h> #include <utils/layoutbuilder.h>
#include <utils/pathchooser.h> #include <utils/pathchooser.h>
#include <QButtonGroup>
#include <QComboBox> #include <QComboBox>
#include <QGroupBox> #include <QGroupBox>
#include <QLabel> #include <QLabel>
@@ -47,8 +48,10 @@ ClangFormatOptionsPageWidget::ClangFormatOptionsPageWidget(ClangFormatSettings *
auto options = new QGroupBox(tr("Options")); auto options = new QGroupBox(tr("Options"));
options->setEnabled(false); options->setEnabled(false);
auto styleButtonGroup = new QButtonGroup(this);
auto useCustomizedStyle = new QRadioButton(tr("Use customized style:")); auto useCustomizedStyle = new QRadioButton(tr("Use customized style:"));
useCustomizedStyle->setAutoExclusive(true); styleButtonGroup->addButton(useCustomizedStyle);
m_configurations = new ConfigurationPanel; m_configurations = new ConfigurationPanel;
m_configurations->setSettings(m_settings); m_configurations->setSettings(m_settings);
@@ -57,7 +60,7 @@ ClangFormatOptionsPageWidget::ClangFormatOptionsPageWidget(ClangFormatSettings *
m_usePredefinedStyle = new QRadioButton(tr("Use predefined style:")); m_usePredefinedStyle = new QRadioButton(tr("Use predefined style:"));
m_usePredefinedStyle->setChecked(true); m_usePredefinedStyle->setChecked(true);
m_usePredefinedStyle->setAutoExclusive(true); styleButtonGroup->addButton(m_usePredefinedStyle);
m_predefinedStyle = new QComboBox; m_predefinedStyle = new QComboBox;
m_predefinedStyle->addItems(m_settings->predefinedStyles()); m_predefinedStyle->addItems(m_settings->predefinedStyles());

View File

@@ -394,7 +394,12 @@ ClangdClient::ClangdClient(Project *project, const Utils::FilePath &jsonDbDir)
project ? tr("Indexing %1 with clangd").arg(project->displayName()) project ? tr("Indexing %1 with clangd").arg(project->displayName())
: tr("Indexing session with clangd")); : tr("Indexing session with clangd"));
setClickHandlerForToken(indexingToken(), [] { 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); setCurrentProject(project);
setDocumentChangeUpdateThreshold(d->settings.documentUpdateThreshold); setDocumentChangeUpdateThreshold(d->settings.documentUpdateThreshold);

View File

@@ -55,7 +55,6 @@ SaveItemsDialog::SaveItemsDialog(QWidget *parent, const QList<IDocument *> &item
} }
m_buttonBox->setStandardButtons(QDialogButtonBox::Cancel | QDialogButtonBox::Save); m_buttonBox->setStandardButtons(QDialogButtonBox::Cancel | QDialogButtonBox::Save);
QPushButton *discardButton = m_buttonBox->addButton(tr("Do &Not Save"), discardButtonRole); QPushButton *discardButton = m_buttonBox->addButton(tr("Do &Not Save"), discardButtonRole);
m_buttonBox->button(QDialogButtonBox::Save)->setDefault(true);
m_treeWidget->setFocus(); m_treeWidget->setFocus();
m_saveBeforeBuildCheckBox->setVisible(false); m_saveBeforeBuildCheckBox->setVisible(false);
@@ -103,6 +102,8 @@ SaveItemsDialog::SaveItemsDialog(QWidget *parent, const QList<IDocument *> &item
&SaveItemsDialog::collectItemsToSave); &SaveItemsDialog::collectItemsToSave);
connect(discardButton, &QAbstractButton::clicked, this, &SaveItemsDialog::discardAll); connect(discardButton, &QAbstractButton::clicked, this, &SaveItemsDialog::discardAll);
connect(m_treeWidget, &QTreeWidget::itemSelectionChanged, this, &SaveItemsDialog::updateButtons); connect(m_treeWidget, &QTreeWidget::itemSelectionChanged, this, &SaveItemsDialog::updateButtons);
m_buttonBox->button(QDialogButtonBox::Save)->setDefault(true);
} }
void SaveItemsDialog::setMessage(const QString &msg) void SaveItemsDialog::setMessage(const QString &msg)

View File

@@ -253,11 +253,6 @@ void CppCodeStylePreferencesWidget::slotCodeStyleSettingsChanged()
if (m_blockUpdates) if (m_blockUpdates)
return; return;
if (m_preferences) {
auto current = qobject_cast<CppCodeStylePreferences *>(m_preferences->currentPreferences());
if (current)
current->setCodeStyleSettings(cppCodeStyleSettings());
}
emit codeStyleSettingsChanged(cppCodeStyleSettings()); emit codeStyleSettingsChanged(cppCodeStyleSettings());
updatePreview(); updatePreview();
} }
@@ -267,12 +262,6 @@ void CppCodeStylePreferencesWidget::slotTabSettingsChanged(const TabSettings &se
if (m_blockUpdates) if (m_blockUpdates)
return; return;
if (m_preferences) {
auto current = qobject_cast<CppCodeStylePreferences *>(m_preferences->currentPreferences());
if (current)
current->setTabSettings(settings);
}
emit tabSettingsChanged(settings); emit tabSettingsChanged(settings);
updatePreview(); updatePreview();
} }
@@ -355,6 +344,14 @@ void CppCodeStylePreferencesWidget::addTab(CppCodeStyleWidget *page, QString tab
void CppCodeStylePreferencesWidget::apply() void CppCodeStylePreferencesWidget::apply()
{ {
if (m_preferences) {
auto current = qobject_cast<CppCodeStylePreferences *>(m_preferences->currentPreferences());
if (current) {
current->setTabSettings(tabSettings());
current->setCodeStyleSettings(cppCodeStyleSettings());
}
}
emit applyEmitted(); emit applyEmitted();
} }

View File

@@ -94,8 +94,7 @@ public:
// CppDeclarableElement // CppDeclarableElement
CppDeclarableElement::CppDeclarableElement(Symbol *declaration) CppDeclarableElement::CppDeclarableElement(Symbol *declaration)
: CppElement() : CppElement()
, declaration(declaration) , iconType(Icons::iconTypeForSymbol(declaration))
, icon(Icons::iconForSymbol(declaration))
{ {
Overview overview; Overview overview;
overview.showArgumentNames = true; overview.showArgumentNames = true;
@@ -135,11 +134,6 @@ CppClass::CppClass(Symbol *declaration) : CppDeclarableElement(declaration)
tooltip = qualifiedName; tooltip = qualifiedName;
} }
bool CppClass::operator==(const CppClass &other)
{
return this->declaration == other.declaration;
}
CppClass *CppClass::toCppClass() CppClass *CppClass::toCppClass()
{ {
return this; return this;
@@ -148,32 +142,30 @@ CppClass *CppClass::toCppClass()
void CppClass::lookupBases(QFutureInterfaceBase &futureInterface, void CppClass::lookupBases(QFutureInterfaceBase &futureInterface,
Symbol *declaration, const LookupContext &context) Symbol *declaration, const LookupContext &context)
{ {
using Data = QPair<ClassOrNamespace*, CppClass*>; ClassOrNamespace *hierarchy = context.lookupType(declaration);
if (!hierarchy)
return;
QSet<ClassOrNamespace *> visited;
addBaseHierarchy(futureInterface, context, hierarchy, &visited);
}
if (ClassOrNamespace *clazz = context.lookupType(declaration)) { void CppClass::addBaseHierarchy(QFutureInterfaceBase &futureInterface, const LookupContext &context,
QSet<ClassOrNamespace *> visited; ClassOrNamespace *hierarchy, QSet<ClassOrNamespace *> *visited)
{
QQueue<Data> q; if (futureInterface.isCanceled())
q.enqueue({clazz, this}); return;
while (!q.isEmpty()) { visited->insert(hierarchy);
if (futureInterface.isCanceled()) const QList<ClassOrNamespace *> &baseClasses = hierarchy->usings();
return; for (ClassOrNamespace *baseClass : baseClasses) {
Data current = q.dequeue(); const QList<Symbol *> &symbols = baseClass->symbols();
clazz = current.first; for (Symbol *symbol : symbols) {
visited.insert(clazz); if (!symbol->asClass())
const QList<ClassOrNamespace *> &bases = clazz->usings(); continue;
for (ClassOrNamespace *baseClass : bases) { ClassOrNamespace *baseHierarchy = context.lookupType(symbol);
const QList<Symbol *> &symbols = baseClass->symbols(); if (baseHierarchy && !visited->contains(baseHierarchy)) {
for (Symbol *symbol : symbols) { CppClass classSymbol(symbol);
if (symbol->asClass() && ( classSymbol.addBaseHierarchy(futureInterface, context, baseHierarchy, visited);
clazz = context.lookupType(symbol)) && bases.append(classSymbol);
!visited.contains(clazz)) {
CppClass baseCppClass(symbol);
CppClass *cppClass = current.second;
cppClass->bases.append(baseCppClass);
q.enqueue({clazz, &cppClass->bases.last()});
}
}
} }
} }
} }
@@ -182,27 +174,20 @@ void CppClass::lookupBases(QFutureInterfaceBase &futureInterface,
void CppClass::lookupDerived(QFutureInterfaceBase &futureInterface, void CppClass::lookupDerived(QFutureInterfaceBase &futureInterface,
Symbol *declaration, const Snapshot &snapshot) Symbol *declaration, const Snapshot &snapshot)
{ {
using Data = QPair<CppClass*, TypeHierarchy>;
snapshot.updateDependencyTable(futureInterface); snapshot.updateDependencyTable(futureInterface);
if (futureInterface.isCanceled()) if (futureInterface.isCanceled())
return; return;
const TypeHierarchy &completeHierarchy addDerivedHierarchy(TypeHierarchyBuilder::buildDerivedTypeHierarchy(
= TypeHierarchyBuilder::buildDerivedTypeHierarchy(futureInterface, declaration, snapshot); futureInterface, declaration, snapshot));
}
QQueue<Data> q; void CppClass::addDerivedHierarchy(const TypeHierarchy &hierarchy)
q.enqueue({this, completeHierarchy}); {
while (!q.isEmpty()) { const QList<TypeHierarchy> derivedHierarchies = hierarchy.hierarchy();
if (futureInterface.isCanceled()) for (const TypeHierarchy &derivedHierarchy : derivedHierarchies) {
return; CppClass classSymbol(derivedHierarchy.symbol());
const Data &current = q.dequeue(); classSymbol.addDerivedHierarchy(derivedHierarchy);
CppClass *clazz = current.first; derived.append(classSymbol);
const TypeHierarchy &classHierarchy = current.second;
const QList<TypeHierarchy> hierarchy = classHierarchy.hierarchy();
for (const TypeHierarchy &derivedHierarchy : hierarchy) {
clazz->derived.append(CppClass(derivedHierarchy.symbol()));
q.enqueue({&clazz->derived.last(), derivedHierarchy});
}
} }
} }

View File

@@ -3,13 +3,14 @@
#pragma once #pragma once
#include <coreplugin/helpitem.h> #include "typehierarchybuilder.h"
#include <texteditor/texteditor.h>
#include <coreplugin/helpitem.h>
#include <cplusplus/CppDocument.h> #include <cplusplus/CppDocument.h>
#include <texteditor/texteditor.h>
#include <utils/utilsicons.h>
#include <QFuture> #include <QFuture>
#include <QIcon>
#include <QSharedPointer> #include <QSharedPointer>
#include <QString> #include <QString>
#include <QStringList> #include <QStringList>
@@ -18,6 +19,7 @@
#include <functional> #include <functional>
namespace CPlusPlus { namespace CPlusPlus {
class ClassOrNamespace;
class LookupItem; class LookupItem;
class LookupContext; class LookupContext;
} }
@@ -76,11 +78,10 @@ public:
explicit CppDeclarableElement(CPlusPlus::Symbol *declaration); explicit CppDeclarableElement(CPlusPlus::Symbol *declaration);
public: public:
CPlusPlus::Symbol *declaration; Utils::CodeModelIcon::Type iconType;
QString name; QString name;
QString qualifiedName; QString qualifiedName;
QString type; QString type;
QIcon icon;
}; };
class CppClass : public CppDeclarableElement class CppClass : public CppDeclarableElement
@@ -89,8 +90,6 @@ public:
CppClass(); CppClass();
explicit CppClass(CPlusPlus::Symbol *declaration); explicit CppClass(CPlusPlus::Symbol *declaration);
bool operator==(const CppClass &other);
CppClass *toCppClass() final; CppClass *toCppClass() final;
void lookupBases(QFutureInterfaceBase &futureInterface, void lookupBases(QFutureInterfaceBase &futureInterface,
@@ -98,9 +97,15 @@ public:
void lookupDerived(QFutureInterfaceBase &futureInterface, void lookupDerived(QFutureInterfaceBase &futureInterface,
CPlusPlus::Symbol *declaration, const CPlusPlus::Snapshot &snapshot); CPlusPlus::Symbol *declaration, const CPlusPlus::Snapshot &snapshot);
public:
QList<CppClass> bases; QList<CppClass> bases;
QList<CppClass> derived; QList<CppClass> derived;
private:
void addBaseHierarchy(QFutureInterfaceBase &futureInterface,
const CPlusPlus::LookupContext &context,
CPlusPlus::ClassOrNamespace *hierarchy,
QSet<CPlusPlus::ClassOrNamespace *> *visited);
void addDerivedHierarchy(const TypeHierarchy &hierarchy);
}; };
} // namespace Internal } // namespace Internal

View File

@@ -4310,6 +4310,8 @@ void GenerateGetterSetter::match(const CppQuickFixInterface &interface, QuickFix
return; return;
declarator = path.at(n - i++)->asDeclarator(); declarator = path.at(n - i++)->asDeclarator();
} }
if (!declarator)
return;
} }
const auto variableDecl = path.at(n - i++)->asSimpleDeclaration(); const auto variableDecl = path.at(n - i++)->asSimpleDeclaration();
const auto classSpecifier = path.at(n - i++)->asClassSpecifier(); const auto classSpecifier = path.at(n - i++)->asClassSpecifier();

View File

@@ -44,7 +44,7 @@ QStandardItem *itemForClass(const CppClass &cppClass)
item->setData(cppClass.name, Qt::DisplayRole); item->setData(cppClass.name, Qt::DisplayRole);
if (cppClass.name != cppClass.qualifiedName) if (cppClass.name != cppClass.qualifiedName)
item->setData(cppClass.qualifiedName, AnnotationRole); item->setData(cppClass.qualifiedName, AnnotationRole);
item->setData(cppClass.icon, Qt::DecorationRole); item->setData(iconForType(cppClass.iconType), Qt::DecorationRole);
QVariant link; QVariant link;
link.setValue(Link(cppClass.link)); link.setValue(Link(cppClass.link));
item->setData(link, LinkRole); item->setData(link, LinkRole);

View File

@@ -111,10 +111,12 @@ void McuSdkRepository::expandVariablesAndWildcards()
continue; continue;
} }
// drop empty_split_entry(linux)|root(windows) // drop empty_split_entry(linux)|root(windows)
pathComponents.pop_front(); QString root = pathComponents.takeFirst();
if (root.isEmpty()) // Linux
root = "/";
package->setPath( package->setPath(
expandWildcards(FilePath::fromString(QDir::rootPath()), expandWildcards(FilePath::fromString(root),
{pathComponents.constBegin(), pathComponents.constEnd()}) {pathComponents.constBegin(), pathComponents.constEnd()})
.first); .first);
} }

View File

@@ -2098,7 +2098,9 @@ std::optional<QString> MsvcToolChain::generateEnvironmentSettings(const Utils::E
saver.write("set CLINK_NOAUTORUN=1\r\n"); saver.write("set CLINK_NOAUTORUN=1\r\n");
saver.write("setlocal enableextensions\r\n"); saver.write("setlocal enableextensions\r\n");
saver.write("if defined VCINSTALLDIR (\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(")\r\n");
saver.write(call + "\r\n"); saver.write(call + "\r\n");
saver.write("@echo " + marker.toLocal8Bit() + "\r\n"); saver.write("@echo " + marker.toLocal8Bit() + "\r\n");

View File

@@ -1320,7 +1320,11 @@ void SimpleTargetRunnerPrivate::stop()
switch (m_state) { switch (m_state) {
case Run: case Run:
m_process.stop(); 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; break;
case Inactive: case Inactive:
break; break;

View File

@@ -192,6 +192,8 @@ public:
} }
} }
m_addButton->setMenu(addMenu); m_addButton->setMenu(addMenu);
if (HostOsInfo::isMacHost())
m_addButton->setStyleSheet("text-align:center;");
m_cloneButton = new QPushButton(ToolChainOptionsPage::tr("Clone"), this); m_cloneButton = new QPushButton(ToolChainOptionsPage::tr("Clone"), this);
connect(m_cloneButton, &QAbstractButton::clicked, [this] { cloneToolChain(); }); connect(m_cloneButton, &QAbstractButton::clicked, [this] { cloneToolChain(); });

View File

@@ -295,20 +295,17 @@ QString PluginGenerator::processTemplate(const QString &tmpl,
{ {
Utils::FileReader reader; Utils::FileReader reader;
if (!reader.fetch(Utils::FilePath::fromString(tmpl), errorMessage)) if (!reader.fetch(Utils::FilePath::fromString(tmpl), errorMessage))
return QString(); return {};
QString cont = QString::fromUtf8(reader.data()); QString cont = QString::fromUtf8(reader.data());
// Expander needed to handle extra variable "Cpp:PragmaOnce" // Expander needed to handle extra variable "Cpp:PragmaOnce"
Utils::MacroExpander *expander = Utils::globalMacroExpander(); Utils::MacroExpander *expander = Utils::globalMacroExpander();
QString errMsg; cont = Utils::TemplateEngine::processText(expander, cont, errorMessage);
cont = Utils::TemplateEngine::processText(expander, cont, &errMsg); if (!errorMessage->isEmpty()) {
if (!errMsg.isEmpty()) {
qWarning("Error processing custom plugin file: %s\nFile:\n%s", qWarning("Error processing custom plugin file: %s\nFile:\n%s",
qPrintable(errMsg), qPrintable(cont)); qPrintable(*errorMessage), qPrintable(cont));
errorMessage = &errMsg; return {};
return QString();
} }
const QChar atChar = QLatin1Char('@'); const QChar atChar = QLatin1Char('@');

View File

@@ -490,8 +490,10 @@ bool SshProcessInterface::runInShell(const CommandLine &command, const QByteArra
process.setCommand(cmd); process.setCommand(cmd);
process.setWriteData(data); process.setWriteData(data);
process.start(); process.start();
QTC_CHECK(process.waitForFinished()); // otherwise we may start producing killers for killers bool isFinished = process.waitForFinished(2000); // TODO: it may freeze on some devices
return process.exitCode() == 0; // otherwise we may start producing killers for killers
QTC_CHECK(isFinished);
return isFinished;
} }
void SshProcessInterface::start() void SshProcessInterface::start()

View File

@@ -1021,7 +1021,7 @@ Utils::Links SquishTools::setBreakpoints()
continue; continue;
const Utils::FilePath filePath = Utils::FilePath::fromString( const Utils::FilePath filePath = Utils::FilePath::fromString(
gb->data(BreakpointFileColumn, Qt::DisplayRole).toString()); gb->data(BreakpointFileColumn, Qt::DisplayRole).toString());
auto fileName = filePath.toUserOutput(); auto fileName = filePath.canonicalPath().toUserOutput();
if (fileName.isEmpty()) if (fileName.isEmpty())
continue; continue;
if (!fileName.endsWith(extension)) if (!fileName.endsWith(extension))

View File

@@ -2696,7 +2696,8 @@ void TextEditorWidget::keyPressEvent(QKeyEvent *e)
} }
break; break;
case Qt::Key_Delete: 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()) { if (cursor.hasSelection()) {
cursor.removeSelectedText(); cursor.removeSelectedText();
} else { } else {
@@ -7848,7 +7849,7 @@ struct MappedText
void TextEditorWidget::insertFromMimeData(const QMimeData *source) void TextEditorWidget::insertFromMimeData(const QMimeData *source)
{ {
if (isReadOnly()) if (!source || isReadOnly())
return; return;
QString text = source->text(); QString text = source->text();
@@ -7858,7 +7859,6 @@ void TextEditorWidget::insertFromMimeData(const QMimeData *source)
if (d->m_codeAssistant.hasContext()) if (d->m_codeAssistant.hasContext())
d->m_codeAssistant.destroyContext(); d->m_codeAssistant.destroyContext();
if (d->m_snippetOverlay->isVisible() && (text.contains('\n') || text.contains('\t'))) if (d->m_snippetOverlay->isVisible() && (text.contains('\n') || text.contains('\t')))
d->m_snippetOverlay->accept(); d->m_snippetOverlay->accept();

View File

@@ -437,7 +437,7 @@ void VcsBaseClient::revertAll(const FilePath &workingDir,
if (cmd->result() == ProcessResult::FinishedWithSuccess) if (cmd->result() == ProcessResult::FinishedWithSuccess)
emit changed(files); emit changed(files);
}, Qt::QueuedConnection); }, Qt::QueuedConnection);
enqueueJob(createCommand(workingDir), args); enqueueJob(cmd, args);
} }
void VcsBaseClient::status(const FilePath &workingDir, void VcsBaseClient::status(const FilePath &workingDir,

View File

@@ -31,6 +31,8 @@ def __syntaxErrorDetected__():
"Expected ';' at end of declaration (fix available)", "Expected ';' at end of declaration (fix available)",
"Use of undeclared identifier 'syntaxError'"]: "Use of undeclared identifier 'syntaxError'"]:
return True return True
if re.match(issue[3], "Declaration of reference variable '.+' requires an initializer"):
return True
return False return False