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

Change-Id: I264d3ce1a2d568c9f68c12c9ecd58fefd4c672a5
This commit is contained in:
Tim Jenssen
2024-01-18 12:06:08 +01:00
50 changed files with 350 additions and 553 deletions

View File

@@ -8,7 +8,7 @@ on:
env:
QT_VERSION: 6.6.0
MACOS_DEPLOYMENT_TARGET: 10.15
MACOS_DEPLOYMENT_TARGET: 11.0
CLANG_VERSION: 17.0.1
ELFUTILS_VERSION: 0.175
CMAKE_VERSION: 3.21.1

View File

@@ -17,8 +17,11 @@ https://doc.qt.io/qtcreator/creator-overview.html
The standalone binary packages support the following platforms:
* Windows 10 (64-bit) or later
* (K)Ubuntu Linux 20.04 (64-bit) or later
* macOS 10.15 or later
* (K)Ubuntu Linux 22.04 (64-bit) or later
* macOS 11 or later
When you compile Qt Creator yourself, the Qt version that you build with
determines the supported platforms.
## Contributing

View File

@@ -1,6 +1,6 @@
set(IDE_VERSION "12.0.1") # The IDE version.
set(IDE_VERSION "12.0.2") # The IDE version.
set(IDE_VERSION_COMPAT "12.0.0") # The IDE Compatibility version.
set(IDE_VERSION_DISPLAY "12.0.1") # The IDE display version.
set(IDE_VERSION_DISPLAY "12.0.2") # The IDE display version.
set(IDE_COPYRIGHT_YEAR "2023") # The IDE current copyright year.
set(IDE_SETTINGSVARIANT "QtProject") # The IDE settings variation.

View File

@@ -13,7 +13,7 @@ instructions:
variableValue: "https://ci-files02-hki.ci.qt.io/packages/jenkins/archive/qt/6.6/6.6.0-released/Qt"
- type: EnvironmentVariable
variableName: QTC_QT_MODULES
variableValue: "qt5compat qtbase qtdeclarative qtimageformats qtquick3d qtquickcontrols2 qtquicktimeline qtserialport qtshadertools qtsvg qttools qttranslations qtwebengine"
variableValue: "qt5compat qtbase qtdeclarative qtimageformats qtquick3d qtquicktimeline qtserialport qtshadertools qtsvg qttools qttranslations qtwebengine"
- type: EnvironmentVariable
variableName: MACOSX_DEPLOYMENT_TARGET
variableValue: 10.15

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

View File

@@ -1,4 +1,4 @@
// Copyright (C) 2023 The Qt Company Ltd.
// Copyright (C) 2024 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
/*!
@@ -183,6 +183,16 @@
To hide the output, select the \inlineimage icons/rightsidebaricon.png
(\uicontrol {Hide/Show Right Sidebar}) button or press \key {Alt+Shift+0}.
\section1 CLICOLOR_FORCE Environment Variable
\QC sets the environment variable \c CLICOLOR_FORCE to \e 1 to show
ANSI-colored output for CMake. This might affect the process output.
If the output looks incorrect or different from earlier \QC versions, try
setting \c CLICOLOR_FORCE to \e 0 in \uicontrol {Use Build Environment}.
\image qtcreator-build-configuration-set-clicolor-force.webp {Build Environment with CLICOLOR_FORCE set}
\section1 CMake Build Steps
\QC builds CMake projects by running \c {cmake . --build}, which then runs

View File

@@ -25,7 +25,7 @@
\section1 Linux
(K)Ubuntu Linux 20.04 (64-bit) or later is supported.
(K)Ubuntu Linux 22.04 (64-bit) or later is supported.
To build Qt applications using \QC on Linux, you usually need the
following:
@@ -51,7 +51,7 @@
\section1 macOS
\macos 10.15 or later is supported with the Xcode tools for your \macos
\macos 11.0 or later is supported with the Xcode tools for your \macos
version available in the Mac App Store.
\section1 Windows

View File

@@ -7,7 +7,7 @@ Module {
property string qtcreator_display_version: '12.0.1'
property string ide_version_major: '12'
property string ide_version_minor: '0'
property string ide_version_release: '1'
property string ide_version_release: '2'
property string qtcreator_version: ide_version_major + '.' + ide_version_minor + '.'
+ ide_version_release

View File

@@ -1125,6 +1125,11 @@ public:
[[maybe_unused]] const Document *context,
[[maybe_unused]] ValueOwner *valueOwner,
[[maybe_unused]] Snapshot *snapshot) {}
virtual Utils::FilePaths prioritizeImportPaths([[maybe_unused]] const Document *context,
const Utils::FilePaths &importPaths)
{
return importPaths;
}
};
} // namespace QmlJS

View File

@@ -219,6 +219,7 @@ Context::ImportsPerDocument LinkPrivate::linkImports()
document.data(),
m_valueOwner,
&m_snapshot);
m_importPaths = provider->prioritizeImportPaths(document.data(), m_importPaths);
}
populateImportedTypes(imports, document);

View File

@@ -386,10 +386,13 @@ QString TerminalView::textFromSelection() const
if (!d->m_selection)
return {};
if (d->m_selection->start == d->m_selection->end)
return {};
CellIterator it = d->m_surface->iteratorAt(d->m_selection->start);
CellIterator end = d->m_surface->iteratorAt(d->m_selection->end);
if (it.position() >= end.position()) {
if (it.position() > end.position()) {
qCWarning(selectionLog) << "Invalid selection: start >= end";
return {};
}
@@ -1070,7 +1073,7 @@ void TerminalView::mousePressEvent(QMouseEvent *event)
}
if (event->button() == Qt::LeftButton) {
if (std::chrono::system_clock::now() - d->m_lastDoubleClick < 500ms) {
if (d->m_selection && std::chrono::system_clock::now() - d->m_lastDoubleClick < 500ms) {
d->m_selectLineMode = true;
const Selection newSelection{d->m_surface->gridToPos(
{0,

View File

@@ -14,6 +14,11 @@ namespace Timeline {
class TraceEvent : public SafeCastable<TraceEvent>
{
public:
TraceEvent(const TraceEvent &) = default;
TraceEvent(TraceEvent &&) = default;
TraceEvent &operator=(const TraceEvent &) = default;
TraceEvent &operator=(TraceEvent &&) = default;
qint64 timestamp() const { return m_timestamp; }
void setTimestamp(qint64 timestamp) { m_timestamp = timestamp; }
@@ -29,11 +34,6 @@ protected:
: m_timestamp(timestamp), m_typeIndex(typeIndex), m_classId(classId)
{}
TraceEvent(const TraceEvent &) = default;
TraceEvent(TraceEvent &&) = default;
TraceEvent &operator=(const TraceEvent &) = default;
TraceEvent &operator=(TraceEvent &&) = default;
private:
qint64 m_timestamp;
qint32 m_typeIndex;

View File

@@ -15,6 +15,11 @@ namespace Timeline {
class TraceEventType : public SafeCastable<TraceEventType>
{
public:
TraceEventType(const TraceEventType &) = default;
TraceEventType(TraceEventType &&) = default;
TraceEventType &operator=(const TraceEventType &) = default;
TraceEventType &operator=(TraceEventType &&) = default;
const QString &displayName() const { return m_displayName; }
void setDisplayName(const QString &displayName) { m_displayName = displayName; }
@@ -28,11 +33,6 @@ protected:
: m_displayName(displayName), m_classId(classId), m_feature(feature)
{}
TraceEventType(const TraceEventType &) = default;
TraceEventType(TraceEventType &&) = default;
TraceEventType &operator=(const TraceEventType &) = default;
TraceEventType &operator=(TraceEventType &&) = default;
private:
QString m_displayName;
qint32 m_classId;

View File

@@ -604,7 +604,7 @@ TreeItem::~TreeItem()
{
QTC_CHECK(m_parent == nullptr);
QTC_CHECK(m_model == nullptr);
removeChildren();
removeChildrenSilently();
}
TreeItem *TreeItem::childAt(int pos) const
@@ -714,6 +714,13 @@ void TreeItem::removeChildren()
}
}
void TreeItem::removeChildrenSilently()
{
if (childCount() == 0)
return;
clear();
}
void TreeItem::sortChildren(const std::function<bool(const TreeItem *, const TreeItem *)> &cmp)
{
if (m_model) {
@@ -1060,6 +1067,13 @@ TreeItem *BaseTreeModel::rootItem() const
}
void BaseTreeModel::setRootItem(TreeItem *item)
{
beginResetModel();
setRootItemInternal(item);
endResetModel();
}
void BaseTreeModel::setRootItemInternal(TreeItem *item)
{
QTC_ASSERT(item, return);
QTC_ASSERT(item->m_model == nullptr, return);
@@ -1067,19 +1081,17 @@ void BaseTreeModel::setRootItem(TreeItem *item)
QTC_ASSERT(item != m_root, return);
QTC_CHECK(m_root);
beginResetModel();
if (m_root) {
QTC_CHECK(m_root->m_parent == nullptr);
QTC_CHECK(m_root->m_model == this);
// needs to be done explicitly before setting the model to 0, otherwise it might lead to a
// crash inside a view or proxy model, especially if there are selected items
m_root->removeChildren();
m_root->removeChildrenSilently();
m_root->m_model = nullptr;
delete m_root;
}
m_root = item;
item->propagateModel(this);
endResetModel();
}
void BaseTreeModel::setHeader(const QStringList &displays)

View File

@@ -39,6 +39,7 @@ public:
void removeChildAt(int pos);
void removeChildren();
void removeChildrenSilently();
void sortChildren(const std::function<bool(const TreeItem *, const TreeItem *)> &cmp);
void update();
void updateAll();
@@ -180,7 +181,8 @@ protected:
void clear();
TreeItem *rootItem() const;
void setRootItem(TreeItem *item);
void setRootItem(TreeItem *item); // resets the model
void setRootItemInternal(TreeItem *item);
TreeItem *itemForIndex(const QModelIndex &) const;
QModelIndex indexForItem(const TreeItem *needle) const;

View File

@@ -126,10 +126,8 @@ void AndroidPlugin::kitsRestored()
return v->targetDeviceTypes().contains(Android::Constants::ANDROID_DEVICE_TYPE);
}).isEmpty();
if (!AndroidConfigurations::currentConfig().sdkFullyConfigured() && qtForAndroidInstalled) {
connect(Core::ICore::instance(), &Core::ICore::coreOpened, this,
&AndroidPlugin::askUserAboutAndroidSetup, Qt::QueuedConnection);
}
if (!AndroidConfigurations::currentConfig().sdkFullyConfigured() && qtForAndroidInstalled)
askUserAboutAndroidSetup();
AndroidConfigurations::registerNewToolChains();
AndroidConfigurations::updateAutomaticKitList();

View File

@@ -392,6 +392,7 @@ Utils::ChangeSet convertReplacements(const QTextDocument *doc,
.size();
QString replacementText = QString::fromStdString(replacement.getReplacementText().str());
replacementText.replace("\r", "");
auto sameCharAt = [&](int replacementOffset) {
if (replacementText.size() <= replacementOffset || replacementOffset < 0)
return false;
@@ -782,7 +783,8 @@ void ClangFormatBaseIndenter::autoIndent(const QTextCursor &cursor,
}
}
clang::format::FormatStyle overrideStyle(const Utils::FilePath &fileName)
clang::format::FormatStyle ClangFormatBaseIndenter::overrideStyle(
const Utils::FilePath &fileName) const
{
const ProjectExplorer::Project *projectForFile
= ProjectExplorer::ProjectManager::projectForFile(fileName);
@@ -792,6 +794,9 @@ clang::format::FormatStyle overrideStyle(const Utils::FilePath &fileName)
? projectForFile->editorConfiguration()->codeStyle("Cpp")->currentPreferences()
: TextEditor::TextEditorSettings::codeStyle("Cpp")->currentPreferences();
if (m_overriddenPreferences)
preferences = m_overriddenPreferences->currentPreferences();
Utils::FilePath filePath = filePathToCurrentSettings(preferences);
if (!filePath.exists())
@@ -854,4 +859,9 @@ const clang::format::FormatStyle &ClangFormatBaseIndenter::styleForFile() const
return m_cachedStyle.style;
}
void ClangFormatBaseIndenter::setOverriddenPreferences(TextEditor::ICodeStylePreferences *preferences)
{
m_overriddenPreferences = preferences;
}
} // namespace ClangFormat

View File

@@ -49,6 +49,8 @@ public:
const clang::format::FormatStyle &styleForFile() const;
void setOverriddenPreferences(TextEditor::ICodeStylePreferences *preferences);
protected:
virtual bool formatCodeInsteadOfIndent() const { return false; }
virtual bool formatWhileTyping() const { return false; }
@@ -84,6 +86,9 @@ private:
};
mutable CachedStyle m_cachedStyle;
clang::format::FormatStyle overrideStyle(const Utils::FilePath &fileName) const;
TextEditor::ICodeStylePreferences *m_overriddenPreferences = nullptr;
};
} // namespace ClangFormat

View File

@@ -129,7 +129,9 @@ ClangFormatConfigWidget::ClangFormatConfigWidget(TextEditor::ICodeStylePreferenc
displaySettings.m_visualizeWhitespace = true;
d->preview->setDisplaySettings(displaySettings);
d->preview->setPlainText(QLatin1String(CppEditor::Constants::DEFAULT_CODE_STYLE_SNIPPETS[0]));
d->preview->textDocument()->setIndenter(new ClangFormatIndenter(d->preview->document()));
auto *indenter = new ClangFormatIndenter(d->preview->document());
indenter->setOverriddenPreferences(codeStyle);
d->preview->textDocument()->setIndenter(indenter);
d->preview->textDocument()->setFontSettings(TextEditor::TextEditorSettings::fontSettings());
d->preview->textDocument()->setSyntaxHighlighter(new CppEditor::CppHighlighter);
d->preview->textDocument()->indenter()->setFileName(fileName);
@@ -271,7 +273,7 @@ void ClangFormatConfigWidget::updatePreview()
QTextCursor cursor(d->preview->document());
cursor.setPosition(0);
cursor.movePosition(QTextCursor::End, QTextCursor::KeepAnchor);
d->preview->textDocument()->autoIndent(cursor);
d->preview->textDocument()->autoFormatOrIndent(cursor);
}
std::string ClangFormatConfigWidget::readFile(const QString &path)

View File

@@ -216,7 +216,8 @@ void CMakeBuildSystem::requestDebugging()
bool CMakeBuildSystem::supportsAction(Node *context, ProjectAction action, const Node *node) const
{
if (dynamic_cast<CMakeTargetNode *>(context))
const auto cmakeTarget = dynamic_cast<CMakeTargetNode *>(context);
if (cmakeTarget && cmakeTarget->productType() != ProductType::Other)
return action == ProjectAction::AddNewFile || action == ProjectAction::AddExistingFile
|| action == ProjectAction::AddExistingDirectory || action == ProjectAction::Rename
|| action == ProjectAction::RemoveFile;
@@ -1623,7 +1624,9 @@ CMakeBuildConfiguration *CMakeBuildSystem::cmakeBuildConfiguration() const
static FilePaths librarySearchPaths(const CMakeBuildSystem *bs, const QString &buildKey)
{
const CMakeBuildTarget cmakeBuildTarget
= Utils::findOrDefault(bs->buildTargets(), Utils::equal(&CMakeBuildTarget::title, buildKey));
= Utils::findOrDefault(bs->buildTargets(), [buildKey](const auto &target) {
return target.title == buildKey && target.targetType != UtilityType;
});
return cmakeBuildTarget.libraryDirectories;
}

View File

@@ -48,10 +48,6 @@ static LocatorMatcherTasks cmakeMatchers(const BuildAcceptor &acceptor)
continue;
const int index = target.title.indexOf(input, 0, Qt::CaseInsensitive);
if (index >= 0) {
const FilePath path = target.backtrace.isEmpty()
? cmakeProject->projectFilePath()
: target.backtrace.last().path;
const int line = target.backtrace.isEmpty() ? 0 : target.backtrace.last().line;
const FilePath projectPath = cmakeProject->projectFilePath();
const QString displayName = target.title;
LocatorFilterEntry entry;
@@ -62,11 +58,20 @@ static LocatorMatcherTasks cmakeMatchers(const BuildAcceptor &acceptor)
return AcceptResult();
};
}
entry.linkForEditor = {path, line};
entry.extraInfo = path.shortNativePath();
bool realTarget = false;
if (!target.backtrace.isEmpty() && target.targetType != UtilityType) {
const FilePath path = target.backtrace.last().path;
const int line = target.backtrace.last().line;
entry.linkForEditor = {path, line};
entry.extraInfo = path.shortNativePath();
realTarget = true;
} else {
entry.extraInfo = projectPath.shortNativePath();
}
entry.highlightInfo = {index, int(input.length())};
entry.filePath = cmakeProject->projectFilePath();
entries.append(entry);
if (acceptor || realTarget)
entries.append(entry);
}
}
}

View File

@@ -307,6 +307,8 @@ QVariant DocumentModelPrivate::data(const QModelIndex &index, int role) const
return QVariant();
case Qt::ToolTipRole:
return entry->filePath().isEmpty() ? entry->displayName() : entry->filePath().toUserOutput();
case DocumentModel::FilePathRole:
return entry->filePath().toVariant();
default:
break;
}

View File

@@ -69,6 +69,8 @@ public:
static QList<IEditor *> editorsForDocuments(const QList<IDocument *> &entries);
static QList<IEditor *> editorsForOpenedDocuments();
static const int FilePathRole = Qt::UserRole + 23;
private:
DocumentModel();
};

View File

@@ -17,6 +17,8 @@
#include <QApplication>
#include <QMenu>
using namespace Utils;
namespace Core::Internal {
class ProxyModel : public QAbstractProxyModel
@@ -253,8 +255,8 @@ QVariant ProxyModel::data(const QModelIndex &index, int role) const
const QVariant sourceDecoration = QAbstractProxyModel::data(index, role);
if (sourceDecoration.isValid())
return sourceDecoration;
const QString fileName = QAbstractProxyModel::data(index, Qt::DisplayRole).toString();
return Utils::FileIconProvider::icon(Utils::FilePath::fromString(fileName));
const QVariant filePath = QAbstractProxyModel::data(index, DocumentModel::FilePathRole);
return FileIconProvider::icon(FilePath::fromVariant(filePath));
}
return QAbstractProxyModel::data(index, role);

View File

@@ -623,10 +623,8 @@ void ExternalToolRunner::run()
}
m_process = new Process(this);
connect(m_process, &Process::done, this, &ExternalToolRunner::done);
connect(m_process, &Process::readyReadStandardOutput,
this, &ExternalToolRunner::readStandardOutput);
connect(m_process, &Process::readyReadStandardError,
this, &ExternalToolRunner::readStandardError);
m_process->setStdOutLineCallback([this](const QString &s) { readStandardOutput(s); });
m_process->setStdErrLineCallback([this](const QString &s) { readStandardError(s); });
if (!m_resolvedWorkingDirectory.isEmpty())
m_process->setWorkingDirectory(m_resolvedWorkingDirectory);
const CommandLine cmd{m_resolvedExecutable, m_resolvedArguments, CommandLine::Raw};
@@ -665,30 +663,29 @@ void ExternalToolRunner::done()
deleteLater();
}
void ExternalToolRunner::readStandardOutput()
static QString stripNewline(const QString &output)
{
if (output.endsWith('\n'))
return output.chopped(1);
return output;
}
void ExternalToolRunner::readStandardOutput(const QString &output)
{
if (m_tool->outputHandling() == ExternalTool::Ignore)
return;
const QByteArray data = m_process->readAllRawStandardOutput();
const QString output = m_outputCodec->toUnicode(data.constData(),
data.length(),
&m_outputCodecState);
if (m_tool->outputHandling() == ExternalTool::ShowInPane)
MessageManager::writeSilently(output);
MessageManager::writeSilently(stripNewline(output));
else if (m_tool->outputHandling() == ExternalTool::ReplaceSelection)
m_processOutput.append(output);
}
void ExternalToolRunner::readStandardError()
void ExternalToolRunner::readStandardError(const QString &output)
{
if (m_tool->errorHandling() == ExternalTool::Ignore)
return;
const QByteArray data = m_process->readAllRawStandardError();
const QString output = m_outputCodec->toUnicode(data.constData(),
data.length(),
&m_errorCodecState);
if (m_tool->errorHandling() == ExternalTool::ShowInPane)
MessageManager::writeSilently(output);
MessageManager::writeSilently(stripNewline(output));
else if (m_tool->errorHandling() == ExternalTool::ReplaceSelection)
m_processOutput.append(output);
}

View File

@@ -115,8 +115,8 @@ public:
private:
void done();
void readStandardOutput();
void readStandardError();
void readStandardOutput(const QString &output);
void readStandardError(const QString &output);
void run();
bool resolve();
@@ -128,6 +128,7 @@ private:
Utils::FilePath m_resolvedWorkingDirectory;
Utils::Environment m_resolvedEnvironment;
Utils::Process *m_process;
// TODO remove codec handling, that is done by Process now
QTextCodec *m_outputCodec;
QTextCodec::ConverterState m_outputCodecState;
QTextCodec::ConverterState m_errorCodecState;

View File

@@ -811,10 +811,24 @@ ListModel *SectionedGridView::addSection(const Section &section, const QList<Lis
vbox->insertWidget(position, sectionLabel);
vbox->insertWidget(position + 1, gridView);
struct ItemHash
{
std::size_t operator()(ListItem *item) const { return std::hash<QString>{}(item->name); }
};
struct ItemEqual
{
bool operator()(ListItem *lhs, ListItem *rhs) const
{
return lhs->name == rhs->name && lhs->description == rhs->description;
}
};
// add the items also to the all products model to be able to search correctly
const QSet<ListItem *> allItems = toSet(m_allItemsModel->items());
const QList<ListItem *> newItems = filtered(items, [&allItems](ListItem *item) {
return !allItems.contains(item);
const QList<ListItem *> allItems = m_allItemsModel->items();
const std::unordered_set<ListItem *, ItemHash, ItemEqual> uniqueItems{allItems.constBegin(),
allItems.constEnd()};
const QList<ListItem *> newItems = filtered(items, [&uniqueItems](ListItem *item) {
return uniqueItems.find(item) == uniqueItems.end();
});
m_allItemsModel->appendItems(newItems);

View File

@@ -605,6 +605,11 @@ public:
m_codeStyleEditor->apply();
}
void finish() final
{
m_codeStyleEditor->finish();
}
CppCodeStylePreferences *m_pageCppCodeStylePreferences = nullptr;
CodeStyleEditorWidget *m_codeStyleEditor;
};

View File

@@ -219,7 +219,7 @@ void OutlineModel::rebuild()
auto root = new SymbolItem;
if (m_cppDocument)
buildTree(root, true);
setRootItem(root);
setRootItemInternal(root);
endResetModel();
}

View File

@@ -782,6 +782,7 @@ SearchResultItems symbolOccurrencesInDeclarationComments(
QList<Text::Range> symbolOccurrencesInText(const QTextDocument &doc, QStringView text, int offset,
const QString &symbolName)
{
QTC_ASSERT(!symbolName.isEmpty(), return QList<Text::Range>());
QList<Text::Range> ranges;
int index = 0;
while (true) {

View File

@@ -4407,6 +4407,13 @@ void GdbEngine::setupInferior()
if (rp.breakOnMain)
runCommand({"tbreak " + mainFunction()});
if (!rp.solibSearchPath.isEmpty()) {
DebuggerCommand cmd("appendSolibSearchPath");
cmd.arg("path", transform(rp.solibSearchPath, &FilePath::path));
cmd.arg("separator", HostOsInfo::pathListSeparator());
runCommand(cmd);
}
if (rp.startMode == AttachToRemoteProcess) {
handleInferiorPrepared();
@@ -4429,13 +4436,6 @@ void GdbEngine::setupInferior()
// if (!remoteArch.isEmpty())
// postCommand("set architecture " + remoteArch);
if (!rp.solibSearchPath.isEmpty()) {
DebuggerCommand cmd("appendSolibSearchPath");
for (const FilePath &filePath : rp.solibSearchPath)
cmd.arg("path", filePath.path());
cmd.arg("separator", HostOsInfo::pathListSeparator());
runCommand(cmd);
}
if (!args.isEmpty())
runCommand({"-exec-arguments " + args});

View File

@@ -1048,6 +1048,7 @@ void FakeVimPluginPrivate::initialize()
INSTALL_HANDLER, Context(Core::Constants::C_GLOBAL), true);
cmd->setDefaultKeySequence(QKeySequence(useMacShortcuts ? Tr::tr("Meta+Shift+Y,Meta+Shift+Y")
: Tr::tr("Alt+Y,Alt+Y")));
connect(cmd->action(), &QAction::triggered, [this] { settings().writeSettings(); });
ActionContainer *advancedMenu =
ActionManager::actionContainer(Core::Constants::M_EDIT_ADVANCED);

View File

@@ -236,7 +236,7 @@ bool IosDeployStep::checkProvisioningProfile()
return true;
const QStringList deviceIds = provisionPlist.value("ProvisionedDevices").toStringList();
const QString targetId = device->uniqueDeviceID();
const QString targetId = device->uniqueInternalDeviceId();
for (const QString &deviceId : deviceIds) {
if (deviceId == targetId)
return true;

View File

@@ -317,7 +317,7 @@ public:
});
setProposal(m_processor->start(std::move(interface)), prefix);
if (!m_processor->running()) {
if (m_processor && !m_processor->running()) {
delete m_processor;
m_processor = nullptr;
}

View File

@@ -119,6 +119,30 @@ void McuSupportImportProvider::loadBuiltins(ImportsPerDocument *importsPerDocume
import.info = ImportInfo::moduleImport("qul", {1, 0}, QString());
getInterfacesImport(context->fileName(), importsPerDocument, import, valueOwner, snapshot);
imports->append(import);
}
FilePaths McuSupportImportProvider::prioritizeImportPaths(const Document *context,
const FilePaths &importPaths)
{
if (!context)
return importPaths;
const std::optional<FilePath> cmakeFilesPathOpt = getTargetBuildFolder(context->fileName());
if (!cmakeFilesPathOpt)
return importPaths;
FilePaths ret;
// qmltocpp uses an incomplete QtQuick folder present in the build folder
// to avoid taking precedence over the correct qul_install/include/*/StyleDefault
// move the import path to be last
std::copy_if(importPaths.cbegin(),
importPaths.cend(),
std::back_inserter(ret),
[cmakeFilesPathOpt](const FilePath &path) { return path != *cmakeFilesPathOpt; });
// nothing was removed
if (ret.size() == importPaths.size())
return importPaths;
ret.push_back(*cmakeFilesPathOpt);
return ret;
};
void McuSupportImportProvider::getInterfacesImport(const FilePath &path,
@@ -156,6 +180,7 @@ std::optional<FilePath> McuSupportImportProvider::getFileModule(const FilePath &
const FilePath &inputFile) const
{
const auto doc = QJsonDocument::fromJson(inputFile.fileContents().value_or(""));
if (!doc.isObject())
return {};

View File

@@ -29,6 +29,9 @@ public:
ValueOwner *valueOwner,
Snapshot *snapshot) override;
virtual Utils::FilePaths prioritizeImportPaths(const Document *context,
const Utils::FilePaths &importPaths) override;
// Add to the interfaces needed for a document
// path: opened qml document
// importsPerDocument: imports available in the document (considered imported)

View File

@@ -2,6 +2,7 @@
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
#include "abi.h"
#include "projectexplorerconstants.h"
#include <utils/algorithm.h>
#include <utils/environment.h>
@@ -437,6 +438,18 @@ static Abis abiOf(const QByteArray &data)
return result;
}
static QString androidAbiFromAbi(const Abi &abi)
{
QString androidAbi;
if (abi.architecture() == Abi::Architecture::ArmArchitecture)
androidAbi = QLatin1String(abi.wordWidth() == 64 ? Constants::ANDROID_ABI_ARM64_V8A
: Constants::ANDROID_ABI_ARMEABI_V7A);
else
androidAbi = QLatin1String(abi.wordWidth() == 64 ? Constants::ANDROID_ABI_X86_64
: Constants::ANDROID_ABI_X86);
return androidAbi;
}
// --------------------------------------------------------------------------
// Abi
// --------------------------------------------------------------------------
@@ -908,7 +921,11 @@ Abi Abi::fromString(const QString &abiString)
return Abi(architecture, os, flavor, format, 0);
}
return Abi(architecture, os, flavor, format, wordWidth);
Abi abi(architecture, os, flavor, format, wordWidth);
if (abi.os() == LinuxOS && abi.osFlavor() == AndroidLinuxFlavor)
abi.m_param = androidAbiFromAbi(abi);
return abi;
}
Abi::Architecture Abi::architectureFromString(const QString &a)

View File

@@ -305,6 +305,7 @@ bool CustomToolChain::operator ==(const ToolChain &other) const
auto customTc = static_cast<const CustomToolChain *>(&other);
return m_makeCommand == customTc->m_makeCommand
&& compilerCommand() == customTc->compilerCommand()
&& targetAbi() == customTc->targetAbi()
&& m_predefinedMacros == customTc->m_predefinedMacros
&& m_builtInHeaderPaths == customTc->m_builtInHeaderPaths;

View File

@@ -348,7 +348,7 @@ FilePath Node::pathOrDirectory(bool dir) const
QTC_CHECK(!location.needsDevice());
QFileInfo fi = location.toFileInfo();
while ((!fi.exists() || !fi.isDir()) && !fi.isRoot())
while ((!fi.exists() || !fi.isDir()) && !fi.isRoot() && (fi.fileName() != fi.absolutePath()))
fi.setFile(fi.absolutePath());
return FilePath::fromString(fi.absoluteFilePath());
}

View File

@@ -78,7 +78,7 @@ class QtVersionData
{
public:
// Update version if you add data members!
static const int version = 2;
static const int version = 3;
bool installed = true;
bool hasExamples = false;
@@ -207,8 +207,11 @@ public:
hostDataPath = FilePath::fromSettings(map.value("HostDataPath"));
hostPrefixPath = FilePath::fromSettings(map.value("HostPrefixPath"));
auto it = map.find("QtAbis");
if (it != map.end())
qtAbis = Utils::transform(it.value().toStringList(), &Abi::fromString);
if (it != map.end()) {
const auto qtAbisList = it.value().toStringList();
if (!qtAbisList.isEmpty())
qtAbis = Utils::transform(qtAbisList, &Abi::fromString);
}
versionInfo = fromStore(map.value("VersionInfo").value<Store>());
}
};

View File

@@ -363,7 +363,8 @@ void ExamplesViewController::updateExamples()
const QStringList sources = m_exampleSetModel->exampleSources(&examplesInstallPath,
&demosInstallPath,
&qtVersion);
&qtVersion,
m_isExamples);
QStringList categoryOrder;
QList<ExampleItem *> items;
for (const QString &exampleSource : sources) {
@@ -493,12 +494,15 @@ QtVersion *ExampleSetModel::findHighestQtVersion(const QtVersions &versions) con
QStringList ExampleSetModel::exampleSources(QString *examplesInstallPath,
QString *demosInstallPath,
QVersionNumber *qtVersion)
QVersionNumber *qtVersion,
bool isExamples)
{
QStringList sources;
// Qt Creator shipped tutorials
sources << ":/qtsupport/qtcreator_tutorials.xml";
if (!isExamples) {
// Qt Creator shipped tutorials
sources << ":/qtsupport/qtcreator_tutorials.xml";
}
QString examplesPath;
QString demosPath;

View File

@@ -41,7 +41,8 @@ public:
bool selectExampleSet(int index);
QStringList exampleSources(QString *examplesInstallPath,
QString *demosInstallPath,
QVersionNumber *qtVersion);
QVersionNumber *qtVersion,
bool isExamples);
bool selectedQtSupports(const Utils::Id &target) const;
signals:

View File

@@ -58,7 +58,11 @@ GroupItem KillAppStep::deployRecipe()
addProgressMessage(Tr::tr("Failed to kill remote application. "
"Assuming it was not running."));
};
return DeviceProcessKillerTask(setupHandler, doneHandler, errorHandler);
const Group root {
finishAllAndDone,
DeviceProcessKillerTask(setupHandler, doneHandler, errorHandler)
};
return root;
}
KillAppStepFactory::KillAppStepFactory()

View File

@@ -20,7 +20,9 @@
#include <utils/stringutils.h>
#include <utils/utilsicons.h>
#include <QDesktopServices>
#include <QHBoxLayout>
#include <QRegularExpression>
#include <QScrollBar>
#include <QTextBrowser>
#include <QTimer>
@@ -70,9 +72,22 @@ public:
// preview
m_previewWidget = new QTextBrowser();
m_previewWidget->setOpenExternalLinks(true);
m_previewWidget->setOpenLinks(false); // we want to open files in QtC, not the browser
m_previewWidget->setFrameShape(QFrame::NoFrame);
new Utils::MarkdownHighlighter(m_previewWidget->document());
connect(m_previewWidget, &QTextBrowser::anchorClicked, this, [this](const QUrl &link) {
if (link.hasFragment() && link.path().isEmpty() && link.scheme().isEmpty()) {
// local anchor
m_previewWidget->scrollToAnchor(link.fragment(QUrl::FullyEncoded));
} else if (link.isLocalFile() || link.scheme().isEmpty()) {
// absolute path or relative (to the document)
// open in Qt Creator
EditorManager::openEditor(
document()->filePath().parentDir().resolvePath(link.path()));
} else {
QDesktopServices::openUrl(link);
}
});
// editor
m_textEditorWidget = new TextEditorWidget;
@@ -170,6 +185,26 @@ public:
m_previewRestoreScrollPosition.reset();
m_previewWidget->setMarkdown(m_document->plainText());
// Add anchors to headings. This should actually be done by Qt QTBUG-120518
for (QTextBlock block = m_previewWidget->document()->begin(); block.isValid();
block = block.next()) {
QTextBlockFormat fmt = block.blockFormat();
if (fmt.hasProperty(QTextFormat::HeadingLevel)) {
QTextCharFormat cFormat = block.charFormat();
QString anchor;
const QString text = block.text();
for (const QChar &c : text) {
if (c == ' ')
anchor.append('-');
else if (c == '_' || c == '-' || c.isDigit() || c.isLetter())
anchor.append(c.toLower());
}
cFormat.setAnchor(true);
cFormat.setAnchorNames({anchor});
QTextCursor cursor(block);
cursor.setBlockCharFormat(cFormat);
}
}
m_previewWidget->horizontalScrollBar()->setValue(positions.x());
m_previewWidget->verticalScrollBar()->setValue(positions.y());

View File

@@ -8563,7 +8563,7 @@ QAction * TextEditorWidget::insertExtraToolBarWidget(TextEditorWidget::Side side
findLeftMostAction);
return d->m_toolBar->insertWidget(before, widget);
} else {
return d->m_toolBar->insertWidget(d->m_fileEncodingLabelAction, widget);
return d->m_toolBar->insertWidget(d->m_fileLineEndingAction, widget);
}
}

View File

@@ -31,6 +31,14 @@ macro(qtc_auto_setup_compiler_standard toolchainFile)
endif()
endforeach()
endforeach()
# Forward important CMake variables to the package manager in the toolchain file
foreach(fwd_var CMAKE_MSVC_RUNTIME_LIBRARY CMAKE_SYSROOT CMAKE_OSX_SYSROOT CMAKE_OSX_ARCHITECTURES)
if (${fwd_var})
file(APPEND "${toolchainFile}"
"set(${fwd_var} ${${fwd_var}})\n")
endif()
endforeach()
endmacro()
#
@@ -101,47 +109,61 @@ macro(qtc_auto_setup_conan)
"include(\"${CMAKE_TOOLCHAIN_FILE}\")\n")
endif()
file(WRITE "${CMAKE_BINARY_DIR}/conan-dependencies/CMakeLists.txt" "
cmake_minimum_required(VERSION 3.15)
file(WRITE "${CMAKE_BINARY_DIR}/conan-dependencies/CMakeLists.txt" "
cmake_minimum_required(VERSION 3.15)
unset(CMAKE_PROJECT_INCLUDE_BEFORE CACHE)
project(conan-setup)
unset(CMAKE_PROJECT_INCLUDE_BEFORE CACHE)
project(conan-setup)
if (${conan_version} VERSION_GREATER_EQUAL 2.0)
set(CONAN_COMMAND \"${conan_program}\")
include(\"${CMAKE_CURRENT_LIST_DIR}/conan_provider.cmake\")
conan_profile_detect_default()
detect_host_profile(\"${CMAKE_BINARY_DIR}/conan-dependencies/conan_host_profile\")
if (${conan_version} VERSION_GREATER_EQUAL 2.0)
set(CONAN_COMMAND \"${conan_program}\")
include(\"${CMAKE_CURRENT_LIST_DIR}/conan_provider.cmake\")
conan_profile_detect_default()
detect_host_profile(\"${CMAKE_BINARY_DIR}/conan-dependencies/conan_host_profile\")
set(build_types \${CMAKE_BUILD_TYPE})
if (CMAKE_CONFIGURATION_TYPES)
set(build_types \${CMAKE_CONFIGURATION_TYPES})
endif()
foreach(type \${build_types})
conan_install(
-pr \"${CMAKE_BINARY_DIR}/conan-dependencies/conan_host_profile\"
--build=${QT_CREATOR_CONAN_BUILD_POLICY}
-s build_type=${CMAKE_BUILD_TYPE}
-s build_type=\${type}
-g CMakeDeps)
endforeach()
get_property(CONAN_INSTALL_SUCCESS GLOBAL PROPERTY CONAN_INSTALL_SUCCESS)
if (CONAN_INSTALL_SUCCESS)
get_property(CONAN_GENERATORS_FOLDER GLOBAL PROPERTY CONAN_GENERATORS_FOLDER)
file(WRITE \"${CMAKE_BINARY_DIR}/conan-dependencies/conan_paths.cmake\" \"
list(PREPEND CMAKE_PREFIX_PATH \\\"\${CONAN_GENERATORS_FOLDER}\\\")
list(PREPEND CMAKE_MODULE_PATH \\\"\${CONAN_GENERATORS_FOLDER}\\\")
list(REMOVE_DUPLICATES CMAKE_PREFIX_PATH)
list(REMOVE_DUPLICATES CMAKE_MODULE_PATH)
set(CMAKE_PREFIX_PATH \\\"\\\${CMAKE_PREFIX_PATH}\\\" CACHE STRING \\\"\\\" FORCE)
set(CMAKE_MODULE_PATH \\\"\\\${CMAKE_MODULE_PATH}\\\" CACHE STRING \\\"\\\" FORCE)
\")
endif()
else()
include(\"${CMAKE_CURRENT_LIST_DIR}/conan.cmake\")
conan_cmake_run(
CONANFILE \"${conanfile_txt}\"
INSTALL_FOLDER \"${CMAKE_BINARY_DIR}/conan-dependencies\"
GENERATORS cmake_paths cmake_find_package json
BUILD ${QT_CREATOR_CONAN_BUILD_POLICY}
ENV CONAN_CMAKE_TOOLCHAIN_FILE=\"${CMAKE_BINARY_DIR}/conan-dependencies/toolchain.cmake\"
)
get_property(CONAN_INSTALL_SUCCESS GLOBAL PROPERTY CONAN_INSTALL_SUCCESS)
if (CONAN_INSTALL_SUCCESS)
get_property(CONAN_GENERATORS_FOLDER GLOBAL PROPERTY CONAN_GENERATORS_FOLDER)
file(WRITE \"${CMAKE_BINARY_DIR}/conan-dependencies/conan_paths.cmake\" \"
list(PREPEND CMAKE_PREFIX_PATH \\\"\${CONAN_GENERATORS_FOLDER}\\\")
list(PREPEND CMAKE_MODULE_PATH \\\"\${CONAN_GENERATORS_FOLDER}\\\")
list(PREPEND CMAKE_FIND_ROOT_PATH \\\"\${CONAN_GENERATORS_FOLDER}\\\")
list(REMOVE_DUPLICATES CMAKE_PREFIX_PATH)
list(REMOVE_DUPLICATES CMAKE_MODULE_PATH)
list(REMOVE_DUPLICATES CMAKE_FIND_ROOT_PATH)
set(CMAKE_PREFIX_PATH \\\"\\\${CMAKE_PREFIX_PATH}\\\" CACHE STRING \\\"\\\" FORCE)
set(CMAKE_MODULE_PATH \\\"\\\${CMAKE_MODULE_PATH}\\\" CACHE STRING \\\"\\\" FORCE)
set(CMAKE_FIND_ROOT_PATH \\\"\\\${CMAKE_FIND_ROOT_PATH}\\\" CACHE STRING \\\"\\\" FORCE)
\")
endif()
")
else()
include(\"${CMAKE_CURRENT_LIST_DIR}/conan.cmake\")
conan_cmake_run(
CONANFILE \"${conanfile_txt}\"
INSTALL_FOLDER \"${CMAKE_BINARY_DIR}/conan-dependencies\"
GENERATORS cmake_paths cmake_find_package json
BUILD ${QT_CREATOR_CONAN_BUILD_POLICY}
ENV CONAN_CMAKE_TOOLCHAIN_FILE=\"${CMAKE_BINARY_DIR}/conan-dependencies/toolchain.cmake\"
)
endif()
")
if (NOT DEFINED CMAKE_BUILD_TYPE AND NOT DEFINED CMAKE_CONFIGURATION_TYPES)
set(CMAKE_CONFIGURATION_TYPES "Debug;Release")
endif()
execute_process(COMMAND ${CMAKE_COMMAND}
-S "${CMAKE_BINARY_DIR}/conan-dependencies/"
@@ -150,6 +172,7 @@ macro(qtc_auto_setup_conan)
-D "CMAKE_TOOLCHAIN_FILE=${CMAKE_BINARY_DIR}/conan-dependencies/toolchain.cmake"
-G ${CMAKE_GENERATOR}
-D CMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
-D "CMAKE_CONFIGURATION_TYPES=${CMAKE_CONFIGURATION_TYPES}"
RESULT_VARIABLE result
)
if (result EQUAL 0)

View File

@@ -3984,7 +3984,7 @@ namespace qstring {
// Check string "HiDu" QString.
// Continue.
delete pstring;
dummyStatement(&str, &string, pstring);
dummyStatement(&str, &string, &pstring);
}
void testQString4()

View File

@@ -207,7 +207,8 @@ def __getExpectedCompilers__():
for c in ('clang++', 'clang', 'afl-clang',
'clang-[0-9]', 'clang-[0-9].[0-9]', 'clang-1[0-9]', 'clang-1[0-9].[0-9]',
'*g++*', '*gcc*'):
compilers.extend(findAllFilesInPATH(c))
filesInPath = set(findAllFilesInPATH(c))
compilers.extend(filesInPath | set(map(os.path.realpath, filesInPath)))
if platform.system() == 'Darwin':
for compilerExe in ('clang++', 'clang'):
xcodeClang = getOutputFromCmdline(["xcrun", "--find", compilerExe]).strip("\n")