summaryrefslogtreecommitdiff
path: root/src/plugins
diff options
context:
space:
mode:
authorOrgad Shaneh <orgad.shaneh@audiocodes.com>2019-03-01 12:20:57 +0200
committerOrgad Shaneh <orgad.shaneh@audiocodes.com>2019-03-01 13:06:57 +0200
commitcbfc6e522dced7516dbfa036197476796ca1dcf8 (patch)
treee78aa7f496b1986d127e991da685bcc3382fa1f9 /src/plugins
parent89831854059144613279affc4c37eb65dbcbf6e7 (diff)
parentaa14e396f03232ce97a723aaf18ab89f7dfad698 (diff)
downloadqt-creator-cbfc6e522dced7516dbfa036197476796ca1dcf8.tar.gz
Merge remote-tracking branch 'origin/4.9'
Change-Id: I801042a53ae4d02d1891ea582ca9ea89b00d3181
Diffstat (limited to 'src/plugins')
-rw-r--r--src/plugins/clangcodemodel/clangcompletionassistprocessor.cpp2
-rw-r--r--src/plugins/clangcodemodel/clangdiagnosticfilter.h2
-rw-r--r--src/plugins/clangcodemodel/clangfollowsymbol.cpp23
-rw-r--r--src/plugins/clangformat/clangformat.qbs1
-rw-r--r--src/plugins/clangformat/clangformat_dependencies.pri2
-rw-r--r--src/plugins/clangformat/clangformatbaseindenter.cpp26
-rw-r--r--src/plugins/clangformat/clangformatbaseindenter.h1
-rw-r--r--src/plugins/clangformat/clangformatconfigwidget.cpp136
-rw-r--r--src/plugins/clangformat/clangformatconfigwidget.h10
-rw-r--r--src/plugins/clangformat/clangformatconfigwidget.ui6
-rw-r--r--src/plugins/clangformat/clangformatindenter.cpp5
-rw-r--r--src/plugins/clangformat/clangformatutils.cpp72
-rw-r--r--src/plugins/clangpchmanager/clangpchmanagerplugin.cpp17
-rw-r--r--src/plugins/clangpchmanager/pchmanagerclient.cpp11
-rw-r--r--src/plugins/clangpchmanager/pchmanagerclient.h9
-rw-r--r--src/plugins/clangpchmanager/pchmanagerconnectionclient.cpp4
-rw-r--r--src/plugins/clangpchmanager/pchmanagerconnectionclient.h2
-rw-r--r--src/plugins/clangpchmanager/progressmanager.h3
-rw-r--r--src/plugins/clangrefactoring/refactoringconnectionclient.cpp9
-rw-r--r--src/plugins/clangrefactoring/refactoringconnectionclient.h2
-rw-r--r--src/plugins/clangtools/clangfixitsrefactoringchanges.cpp3
-rw-r--r--src/plugins/cppeditor/cpphighlighter.cpp2
-rw-r--r--src/plugins/cppeditor/cpphighlighter.h8
-rw-r--r--src/plugins/cpptools/cppcodestylesettingspage.cpp167
-rw-r--r--src/plugins/cpptools/cppcodestylesnippets.h190
-rw-r--r--src/plugins/cpptools/cppfilesettingspage.cpp4
-rw-r--r--src/plugins/cpptools/cpptools.pro1
-rw-r--r--src/plugins/cpptools/cpptools.qbs1
-rw-r--r--src/plugins/debugger/debuggermainwindow.cpp24
-rw-r--r--src/plugins/debugger/debuggerplugin.cpp2
-rw-r--r--src/plugins/git/gitclient.cpp5
-rw-r--r--src/plugins/mercurial/mercurialclient.cpp1
-rw-r--r--src/plugins/perfprofiler/PerfProfiler.json.in1
-rw-r--r--src/plugins/projectexplorer/abiwidget.cpp4
-rw-r--r--src/plugins/projectexplorer/gcctoolchain.cpp32
-rw-r--r--src/plugins/projectexplorer/makestep.ui3
-rw-r--r--src/plugins/projectexplorer/projectexplorer.cpp20
-rw-r--r--src/plugins/projectexplorer/projectmodels.cpp5
-rw-r--r--src/plugins/qmakeprojectmanager/qmakenodes.cpp9
-rw-r--r--src/plugins/qmakeprojectmanager/qmakenodes.h1
-rw-r--r--src/plugins/qmakeprojectmanager/qmakenodetreebuilder.cpp8
-rw-r--r--src/plugins/qmakeprojectmanager/qmakeparsernodes.cpp1
-rw-r--r--src/plugins/qmakeprojectmanager/qmakeprojectimporter.cpp26
-rw-r--r--src/plugins/qmakeprojectmanager/wizards/libraryparameters.cpp4
-rw-r--r--src/plugins/qmakeprojectmanager/wizards/librarywizarddialog.cpp2
-rw-r--r--src/plugins/qmldesigner/components/propertyeditor/gradientmodel.cpp50
-rw-r--r--src/plugins/qmldesigner/components/propertyeditor/gradientmodel.h1
-rw-r--r--src/plugins/qmldesigner/designercore/model/rewriterview.cpp11
-rw-r--r--src/plugins/qmldesigner/designersettings.h1
-rw-r--r--src/plugins/qmldesigner/qmldesignerplugin.cpp3
-rw-r--r--src/plugins/qtsupport/profilereader.cpp1
-rw-r--r--src/plugins/qtsupport/qtoutputformatter.cpp2
-rw-r--r--src/plugins/texteditor/basefilefind.cpp74
-rw-r--r--src/plugins/texteditor/basefilefind.h7
-rw-r--r--src/plugins/texteditor/highlighter.cpp94
-rw-r--r--src/plugins/texteditor/highlighter.h10
-rw-r--r--src/plugins/texteditor/highlightersettings.cpp7
-rw-r--r--src/plugins/texteditor/highlightersettingspage.cpp3
-rw-r--r--src/plugins/texteditor/highlightersettingspage.ui24
-rw-r--r--src/plugins/texteditor/texteditor.cpp18
-rw-r--r--src/plugins/texteditor/texteditorconstants.h2
-rw-r--r--src/plugins/vcsbase/vcsbasediffeditorcontroller.cpp7
-rw-r--r--src/plugins/vcsbase/vcsbasediffeditorcontroller.h1
63 files changed, 734 insertions, 449 deletions
diff --git a/src/plugins/clangcodemodel/clangcompletionassistprocessor.cpp b/src/plugins/clangcodemodel/clangcompletionassistprocessor.cpp
index d00d488586..db34c904d4 100644
--- a/src/plugins/clangcodemodel/clangcompletionassistprocessor.cpp
+++ b/src/plugins/clangcodemodel/clangcompletionassistprocessor.cpp
@@ -86,7 +86,7 @@ static void addFunctionOverloadAssistProposalItem(QList<AssistProposalItemInterf
const QString &name)
{
auto *item = static_cast<ClangAssistProposalItem *>(sameItem);
- item->setHasOverloadsWithParameters(true);
+ item->setHasOverloadsWithParameters(codeCompletion.hasParameters);
if (codeCompletion.completionKind == CodeCompletion::ConstructorCompletionKind) {
// It's the constructor, currently constructor definitions do not lead here.
// CLANG-UPGRADE-CHECK: Can we get here with constructor definition?
diff --git a/src/plugins/clangcodemodel/clangdiagnosticfilter.h b/src/plugins/clangcodemodel/clangdiagnosticfilter.h
index 0fe164ecf0..a61734718e 100644
--- a/src/plugins/clangcodemodel/clangdiagnosticfilter.h
+++ b/src/plugins/clangcodemodel/clangdiagnosticfilter.h
@@ -49,7 +49,7 @@ private:
void filterFixits();
private:
- const QString &m_filePath;
+ const QString m_filePath;
QVector<ClangBackEnd::DiagnosticContainer> m_warningDiagnostics;
QVector<ClangBackEnd::DiagnosticContainer> m_errorDiagnostics;
diff --git a/src/plugins/clangcodemodel/clangfollowsymbol.cpp b/src/plugins/clangcodemodel/clangfollowsymbol.cpp
index 96df23ab20..f1113de164 100644
--- a/src/plugins/clangcodemodel/clangfollowsymbol.cpp
+++ b/src/plugins/clangcodemodel/clangfollowsymbol.cpp
@@ -28,6 +28,7 @@
#include <coreplugin/editormanager/editormanager.h>
#include <cpptools/cppmodelmanager.h>
+#include <cpptools/cppfollowsymbolundercursor.h>
#include <texteditor/texteditor.h>
#include <clangsupport/tokeninfocontainer.h>
@@ -183,12 +184,22 @@ void ClangFollowSymbol::findLink(const CppTools::CursorInEditor &data,
return processLinkCallback(Utils::Link());
if (!resolveTarget) {
- processLinkCallback(linkAtCursor(cursor,
- data.filePath().toString(),
- static_cast<uint>(line),
- static_cast<uint>(column),
- processor));
- return;
+ Utils::Link link = linkAtCursor(cursor,
+ data.filePath().toString(),
+ static_cast<uint>(line),
+ static_cast<uint>(column),
+ processor);
+ if (link == Utils::Link()) {
+ CppTools::FollowSymbolUnderCursor followSymbol;
+ return followSymbol.findLink(data,
+ std::move(processLinkCallback),
+ false,
+ snapshot,
+ documentFromSemanticInfo,
+ symbolFinder,
+ inNextSplit);
+ }
+ return processLinkCallback(link);
}
QFuture<CppTools::SymbolInfo> infoFuture
diff --git a/src/plugins/clangformat/clangformat.qbs b/src/plugins/clangformat/clangformat.qbs
index c7b9182373..3e40832c57 100644
--- a/src/plugins/clangformat/clangformat.qbs
+++ b/src/plugins/clangformat/clangformat.qbs
@@ -15,6 +15,7 @@ QtcPlugin {
Depends { name: "Qt.widgets" }
condition: libclang.present
+ && libclang.llvmFormattingLibs.length
&& (!qbs.targetOS.contains("windows") || libclang.llvmBuildModeMatches)
cpp.cxxFlags: {
diff --git a/src/plugins/clangformat/clangformat_dependencies.pri b/src/plugins/clangformat/clangformat_dependencies.pri
index 5f3f81e132..6822c5d66b 100644
--- a/src/plugins/clangformat/clangformat_dependencies.pri
+++ b/src/plugins/clangformat/clangformat_dependencies.pri
@@ -5,4 +5,4 @@ QTC_LIB_DEPENDS += \
QTC_PLUGIN_DEPENDS += \
cpptools \
projectexplorer \
- texteditor
+ cppeditor
diff --git a/src/plugins/clangformat/clangformatbaseindenter.cpp b/src/plugins/clangformat/clangformatbaseindenter.cpp
index 7a87eabcd7..a53eb50adb 100644
--- a/src/plugins/clangformat/clangformatbaseindenter.cpp
+++ b/src/plugins/clangformat/clangformatbaseindenter.cpp
@@ -136,7 +136,7 @@ int forceIndentWithExtraText(QByteArray &buffer, const QTextBlock &block, bool s
int utf8Offset = Utils::Text::utf8NthLineOffset(block.document(),
buffer,
block.blockNumber() + 1);
- if (firstNonWhitespace > 0)
+ if (firstNonWhitespace >= 0)
utf8Offset += firstNonWhitespace;
else
utf8Offset += blockText.length();
@@ -336,6 +336,7 @@ ClangFormatBaseIndenter::ClangFormatBaseIndenter(QTextDocument *doc)
TextEditor::Replacements ClangFormatBaseIndenter::replacements(QByteArray buffer,
const QTextBlock &startBlock,
const QTextBlock &endBlock,
+ int cursorPositionInEditor,
ReplacementsToKeep replacementsToKeep,
const QChar &typedChar,
bool secondTry) const
@@ -353,17 +354,24 @@ TextEditor::Replacements ClangFormatBaseIndenter::replacements(QByteArray buffer
if (replacementsToKeep == ReplacementsToKeep::IndentAndBefore)
rangeStart = formattingRangeStart(startBlock, buffer, lastSaveRevision());
- if (replacementsToKeep == ReplacementsToKeep::IndentAndBefore) {
- buffer.insert(utf8Offset - 1, " //");
- utf8Offset += 3;
- }
-
adjustFormatStyleForLineBreak(style, replacementsToKeep);
if (typedChar == QChar::Null) {
- for (int index = startBlock.blockNumber(); index <= endBlock.blockNumber(); ++index) {
+ if (replacementsToKeep == ReplacementsToKeep::IndentAndBefore) {
+ if (utf8Offset > 0) {
+ buffer.insert(utf8Offset - 1, " //");
+ utf8Offset += 3;
+ }
utf8Length += forceIndentWithExtraText(buffer,
- m_doc->findBlockByNumber(index),
+ cursorPositionInEditor < 0
+ ? endBlock
+ : m_doc->findBlock(cursorPositionInEditor),
secondTry);
+ } else {
+ for (int index = startBlock.blockNumber(); index <= endBlock.blockNumber(); ++index) {
+ utf8Length += forceIndentWithExtraText(buffer,
+ m_doc->findBlockByNumber(index),
+ secondTry);
+ }
}
}
@@ -394,6 +402,7 @@ TextEditor::Replacements ClangFormatBaseIndenter::replacements(QByteArray buffer
return replacements(originalBuffer,
startBlock,
endBlock,
+ cursorPositionInEditor,
replacementsToKeep,
typedChar,
true);
@@ -468,6 +477,7 @@ TextEditor::Replacements ClangFormatBaseIndenter::indentsFor(QTextBlock startBlo
return replacements(buffer,
startBlock,
endBlock,
+ cursorPositionInEditor,
replacementsToKeep,
typedChar);
}
diff --git a/src/plugins/clangformat/clangformatbaseindenter.h b/src/plugins/clangformat/clangformatbaseindenter.h
index ed63ff6efa..b412b57d6d 100644
--- a/src/plugins/clangformat/clangformatbaseindenter.h
+++ b/src/plugins/clangformat/clangformatbaseindenter.h
@@ -87,6 +87,7 @@ private:
TextEditor::Replacements replacements(QByteArray buffer,
const QTextBlock &startBlock,
const QTextBlock &endBlock,
+ int cursorPositionInEditor,
ReplacementsToKeep replacementsToKeep,
const QChar &typedChar = QChar::Null,
bool secondTry = false) const;
diff --git a/src/plugins/clangformat/clangformatconfigwidget.cpp b/src/plugins/clangformat/clangformatconfigwidget.cpp
index f0d4808cf5..faaf6d937f 100644
--- a/src/plugins/clangformat/clangformatconfigwidget.cpp
+++ b/src/plugins/clangformat/clangformatconfigwidget.cpp
@@ -23,10 +23,10 @@
**
****************************************************************************/
-
#include "clangformatconfigwidget.h"
#include "clangformatconstants.h"
+#include "clangformatindenter.h"
#include "clangformatsettings.h"
#include "clangformatutils.h"
#include "ui_clangformatconfigwidget.h"
@@ -34,10 +34,17 @@
#include <clang/Format/Format.h>
#include <coreplugin/icore.h>
+#include <cppeditor/cpphighlighter.h>
+#include <cpptools/cppcodestylesnippets.h>
#include <projectexplorer/project.h>
#include <projectexplorer/session.h>
+#include <texteditor/displaysettings.h>
+#include <texteditor/snippets/snippeteditor.h>
+#include <texteditor/textdocument.h>
+#include <texteditor/texteditorsettings.h>
#include <QFile>
+#include <QMessageBox>
#include <sstream>
@@ -45,79 +52,7 @@ using namespace ProjectExplorer;
namespace ClangFormat {
-static void readTable(QTableWidget *table, std::istringstream &stream)
-{
- table->horizontalHeader()->hide();
- table->verticalHeader()->hide();
-
- table->setColumnCount(2);
- table->setRowCount(0);
-
- std::string line;
- while (std::getline(stream, line)) {
- if (line == "---" || line == "...")
- continue;
-
- const size_t firstLetter = line.find_first_not_of(' ');
- if (firstLetter == std::string::npos || line.at(firstLetter) == '#')
- continue;
-
- // Increase indent where it already exists.
- if (firstLetter > 0 && firstLetter < 5)
- line = " " + line;
-
- table->insertRow(table->rowCount());
- const size_t colonPos = line.find_first_of(':');
- auto *keyItem = new QTableWidgetItem;
- auto *valueItem = new QTableWidgetItem;
-
- keyItem->setFlags(keyItem->flags() & ~Qt::ItemFlags(Qt::ItemIsEditable));
- table->setItem(table->rowCount() - 1, 0, keyItem);
- table->setItem(table->rowCount() - 1, 1, valueItem);
-
- if (colonPos == std::string::npos) {
- keyItem->setText(QString::fromStdString(line));
- valueItem->setFlags(valueItem->flags() & ~Qt::ItemFlags(Qt::ItemIsEditable));
- continue;
- }
-
- keyItem->setText(QString::fromStdString(line.substr(0, colonPos)));
-
- const size_t optionValueStart = line.find_first_not_of(' ', colonPos + 1);
- if (optionValueStart == std::string::npos)
- valueItem->setFlags(valueItem->flags() & ~Qt::ItemFlags(Qt::ItemIsEditable));
- else
- valueItem->setText(QString::fromStdString(line.substr(optionValueStart)));
- }
-
- table->resizeColumnToContents(0);
- table->resizeColumnToContents(1);
-}
-
-static QByteArray tableToYAML(QTableWidget *table)
-{
- QByteArray text;
- text += "---\n";
- for (int i = 0; i < table->rowCount(); ++i) {
- auto *keyItem = table->item(i, 0);
- auto *valueItem = table->item(i, 1);
-
- QByteArray itemText = keyItem->text().toUtf8();
- // Change the indent back to 2 spaces
- itemText.replace(" ", " ");
- if (!valueItem->text().isEmpty() || !itemText.trimmed().startsWith('-'))
- itemText += ": ";
- itemText += valueItem->text().toUtf8() + '\n';
-
- text += itemText;
- }
- text += "...\n";
-
- return text;
-}
-
-ClangFormatConfigWidget::ClangFormatConfigWidget(ProjectExplorer::Project *project,
- QWidget *parent)
+ClangFormatConfigWidget::ClangFormatConfigWidget(ProjectExplorer::Project *project, QWidget *parent)
: CodeStyleEditorWidget(parent)
, m_project(project)
, m_ui(std::make_unique<Ui::ClangFormatConfigWidget>())
@@ -153,6 +88,17 @@ void ClangFormatConfigWidget::initialize()
m_ui->applyButton->show();
hideGlobalCheckboxes();
+ m_preview = new TextEditor::SnippetEditorWidget(this);
+ m_ui->horizontalLayout_2->addWidget(m_preview);
+ m_preview->setPlainText(QLatin1String(CppTools::Constants::DEFAULT_CODE_STYLE_SNIPPETS[0]));
+ m_preview->textDocument()->setIndenter(new ClangFormatIndenter(m_preview->document()));
+ m_preview->textDocument()->setFontSettings(TextEditor::TextEditorSettings::fontSettings());
+ m_preview->textDocument()->setSyntaxHighlighter(new CppEditor::CppHighlighter);
+
+ TextEditor::DisplaySettings displaySettings = m_preview->displaySettings();
+ displaySettings.m_visualizeWhitespace = true;
+ m_preview->setDisplaySettings(displaySettings);
+
QLayoutItem *lastItem = m_ui->verticalLayout->itemAt(m_ui->verticalLayout->count() - 1);
if (lastItem->spacerItem())
m_ui->verticalLayout->removeItem(lastItem);
@@ -164,8 +110,7 @@ void ClangFormatConfigWidget::initialize()
m_ui->applyButton->hide();
m_ui->verticalLayout->addStretch(1);
- connect(m_ui->createFileButton, &QPushButton::clicked,
- this, [this]() {
+ connect(m_ui->createFileButton, &QPushButton::clicked, this, [this]() {
createStyleFileIfNeeded(false);
initialize();
});
@@ -174,9 +119,11 @@ void ClangFormatConfigWidget::initialize()
m_ui->createFileButton->hide();
+ Utils::FileName fileName;
if (m_project) {
m_ui->projectHasClangFormat->hide();
connect(m_ui->applyButton, &QPushButton::clicked, this, &ClangFormatConfigWidget::apply);
+ fileName = m_project->projectFilePath().appendPath("snippet.cpp");
} else {
const Project *currentProject = SessionManager::startupProject();
if (!currentProject
@@ -186,15 +133,27 @@ void ClangFormatConfigWidget::initialize()
m_ui->projectHasClangFormat->hide();
} else {
m_ui->projectHasClangFormat->setText(
- tr("Current project has its own .clang-format file "
- "and can be configured in Projects > Code Style > C++."));
+ tr("Current project has its own .clang-format file "
+ "and can be configured in Projects > Code Style > C++."));
}
createStyleFileIfNeeded(true);
showGlobalCheckboxes();
m_ui->applyButton->hide();
+ fileName = Utils::FileName::fromString(Core::ICore::userResourcePath())
+ .appendPath("snippet.cpp");
}
+ m_preview->textDocument()->indenter()->setFileName(fileName);
fillTable();
+ updatePreview();
+}
+
+void ClangFormatConfigWidget::updatePreview()
+{
+ QTextCursor cursor(m_preview->document());
+ cursor.setPosition(0);
+ cursor.movePosition(QTextCursor::End, QTextCursor::KeepAnchor);
+ m_preview->textDocument()->autoFormatOrIndent(cursor);
}
void ClangFormatConfigWidget::fillTable()
@@ -202,8 +161,7 @@ void ClangFormatConfigWidget::fillTable()
clang::format::FormatStyle style = m_project ? currentProjectStyle() : currentGlobalStyle();
std::string configText = clang::format::configurationAsText(style);
- std::istringstream stream(configText);
- readTable(m_ui->clangFormatOptionsTable, stream);
+ m_ui->clangFormatOptionsTable->setPlainText(QString::fromStdString(configText));
}
ClangFormatConfigWidget::~ClangFormatConfigWidget() = default;
@@ -218,7 +176,19 @@ void ClangFormatConfigWidget::apply()
settings.write();
}
- const QByteArray text = tableToYAML(m_ui->clangFormatOptionsTable);
+ const QString text = m_ui->clangFormatOptionsTable->toPlainText();
+ clang::format::FormatStyle style;
+ style.Language = clang::format::FormatStyle::LK_Cpp;
+ const std::error_code error = clang::format::parseConfiguration(text.toStdString(), &style);
+ if (error.value() != static_cast<int>(clang::format::ParseError::Success)) {
+ QMessageBox::warning(this,
+ tr("Error in ClangFormat configuration"),
+ QString::fromStdString(error.message()));
+ fillTable();
+ updatePreview();
+ return;
+ }
+
QString filePath;
if (m_project)
filePath = m_project->projectDirectory().appendPath(Constants::SETTINGS_FILE_NAME).toString();
@@ -228,8 +198,10 @@ void ClangFormatConfigWidget::apply()
if (!file.open(QFile::WriteOnly))
return;
- file.write(text);
+ file.write(text.toUtf8());
file.close();
+
+ updatePreview();
}
} // namespace ClangFormat
diff --git a/src/plugins/clangformat/clangformatconfigwidget.h b/src/plugins/clangformat/clangformatconfigwidget.h
index 7d3818b7a5..58570d9bf6 100644
--- a/src/plugins/clangformat/clangformatconfigwidget.h
+++ b/src/plugins/clangformat/clangformatconfigwidget.h
@@ -29,7 +29,12 @@
#include <memory>
-namespace ProjectExplorer { class Project; }
+namespace ProjectExplorer {
+class Project;
+}
+namespace TextEditor {
+class SnippetEditorWidget;
+}
namespace ClangFormat {
@@ -54,7 +59,10 @@ private:
void hideGlobalCheckboxes();
void showGlobalCheckboxes();
+ void updatePreview();
+
ProjectExplorer::Project *m_project;
+ TextEditor::SnippetEditorWidget *m_preview;
std::unique_ptr<Ui::ClangFormatConfigWidget> m_ui;
};
diff --git a/src/plugins/clangformat/clangformatconfigwidget.ui b/src/plugins/clangformat/clangformatconfigwidget.ui
index 2094bca109..41e40ef1fd 100644
--- a/src/plugins/clangformat/clangformatconfigwidget.ui
+++ b/src/plugins/clangformat/clangformatconfigwidget.ui
@@ -55,7 +55,11 @@
</widget>
</item>
<item>
- <widget class="QTableWidget" name="clangFormatOptionsTable"/>
+ <layout class="QHBoxLayout" name="horizontalLayout_2">
+ <item>
+ <widget class="QPlainTextEdit" name="clangFormatOptionsTable"/>
+ </item>
+ </layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
diff --git a/src/plugins/clangformat/clangformatindenter.cpp b/src/plugins/clangformat/clangformatindenter.cpp
index ef9dbf5d1c..42cedb7b6c 100644
--- a/src/plugins/clangformat/clangformatindenter.cpp
+++ b/src/plugins/clangformat/clangformatindenter.cpp
@@ -84,7 +84,10 @@ Utils::optional<TabSettings> ClangFormatIndenter::tabSettings() const
int ClangFormatIndenter::lastSaveRevision() const
{
- return qobject_cast<TextEditor::TextDocumentLayout *>(m_doc->documentLayout())->lastSaveRevision;
+ auto *layout = qobject_cast<TextEditor::TextDocumentLayout *>(m_doc->documentLayout());
+ if (!layout)
+ return 0;
+ return layout->lastSaveRevision;
}
bool ClangFormatIndenter::formatOnSave() const
diff --git a/src/plugins/clangformat/clangformatutils.cpp b/src/plugins/clangformat/clangformatutils.cpp
index 6b151020d6..babe94da24 100644
--- a/src/plugins/clangformat/clangformatutils.cpp
+++ b/src/plugins/clangformat/clangformatutils.cpp
@@ -106,19 +106,44 @@ static Utils::FileName globalPath()
return Utils::FileName::fromString(Core::ICore::userResourcePath());
}
-static bool configForFileExists(Utils::FileName fileName)
+static QString configForFile(Utils::FileName fileName)
{
+ Utils::FileName topProjectPath = projectPath();
+ if (topProjectPath.isEmpty())
+ return QString();
+
QDir projectDir(fileName.parentDir().toString());
while (!projectDir.exists(Constants::SETTINGS_FILE_NAME)
&& !projectDir.exists(Constants::SETTINGS_FILE_ALT_NAME)) {
- if (!projectDir.cdUp())
- return false;
+ if (projectDir.path() == topProjectPath.toString()
+ || !Utils::FileName::fromString(projectDir.path()).isChildOf(topProjectPath)
+ || !projectDir.cdUp()) {
+ return QString();
+ }
}
- return true;
+
+ if (projectDir.exists(Constants::SETTINGS_FILE_NAME))
+ return projectDir.filePath(Constants::SETTINGS_FILE_NAME);
+ return projectDir.filePath(Constants::SETTINGS_FILE_ALT_NAME);
}
-static clang::format::FormatStyle constructStyle(bool isGlobal)
+static clang::format::FormatStyle constructStyle(bool isGlobal,
+ const QByteArray &baseStyle = QByteArray())
{
+ if (!baseStyle.isEmpty()) {
+ // Try to get the style for this base style.
+ Expected<FormatStyle> style = getStyle(baseStyle.toStdString(),
+ "dummy.cpp",
+ baseStyle.toStdString());
+ if (style)
+ return *style;
+
+ handleAllErrors(style.takeError(), [](const ErrorInfoBase &) {
+ // do nothing
+ });
+ // Fallthrough to the default style.
+ }
+
FormatStyle style = getLLVMStyle();
style.BreakBeforeBraces = FormatStyle::BS_Custom;
@@ -151,18 +176,37 @@ void createStyleFileIfNeeded(bool isGlobal)
}
}
+static QByteArray configBaseStyleName(const QString &configFile)
+{
+ if (configFile.isEmpty())
+ return QByteArray();
+
+ QFile config(configFile);
+ if (!config.open(QIODevice::ReadOnly))
+ return QByteArray();
+
+ const QByteArray content = config.readAll();
+ const char basedOnStyle[] = "BasedOnStyle:";
+ int basedOnStyleIndex = content.indexOf(basedOnStyle);
+ if (basedOnStyleIndex < 0)
+ return QByteArray();
+
+ basedOnStyleIndex += sizeof(basedOnStyle) - 1;
+ const int endOfLineIndex = content.indexOf('\n', basedOnStyleIndex);
+ return content
+ .mid(basedOnStyleIndex, endOfLineIndex < 0 ? -1 : endOfLineIndex - basedOnStyleIndex)
+ .trimmed();
+}
+
clang::format::FormatStyle styleForFile(Utils::FileName fileName)
{
bool isGlobal = false;
- if (!configForFileExists(fileName)) {
- if (fileName.isChildOf(projectPath()) && CppCodeStyleSettings::currentProjectCodeStyle()) {
- fileName = projectPath();
- } else {
- fileName = globalPath();
- isGlobal = true;
- }
+ QString configFile = configForFile(fileName);
+ if (configFile.isEmpty()) {
+ Utils::FileName path = fileName = globalPath();
fileName.appendPath(Constants::SAMPLE_FILE_NAME);
- createStyleFileIfNeeded(isGlobal);
+ createStyleFileIfNeeded(true);
+ configFile = path.appendPath(Constants::SETTINGS_FILE_NAME).toString();
}
Expected<FormatStyle> style = format::getStyle("file",
@@ -175,7 +219,7 @@ clang::format::FormatStyle styleForFile(Utils::FileName fileName)
// do nothing
});
- return constructStyle(isGlobal);
+ return constructStyle(isGlobal, configBaseStyleName(configFile));
}
clang::format::FormatStyle currentProjectStyle()
diff --git a/src/plugins/clangpchmanager/clangpchmanagerplugin.cpp b/src/plugins/clangpchmanager/clangpchmanagerplugin.cpp
index 90ba8f62bc..8f7ea72242 100644
--- a/src/plugins/clangpchmanager/clangpchmanagerplugin.cpp
+++ b/src/plugins/clangpchmanager/clangpchmanagerplugin.cpp
@@ -65,12 +65,19 @@ public:
Sqlite::Database database{Utils::PathString{Core::ICore::userResourcePath() + "/symbol-experimental-v1.db"}, 1000ms};
ClangBackEnd::RefactoringDatabaseInitializer<Sqlite::Database> databaseInitializer{database};
ClangBackEnd::FilePathCaching filePathCache{database};
- ClangPchManager::ProgressManager progressManager{
- [] (QFutureInterface<void> &promise) {
- auto title = QCoreApplication::translate("ClangPchProgressManager", "Creating PCHs", "PCH stands for precompiled header");
- Core::ProgressManager::addTask(promise.future(), title, "pch creation", nullptr);
+ ClangPchManager::ProgressManager pchCreationProgressManager{[](QFutureInterface<void> &promise) {
+ auto title = QCoreApplication::translate("ClangPchProgressManager",
+ "Creating PCHs",
+ "PCH stands for precompiled header");
+ Core::ProgressManager::addTask(promise.future(), title, "pch creation", nullptr);
}};
- PchManagerClient pchManagerClient{progressManager};
+ ClangPchManager::ProgressManager dependencyCreationProgressManager{
+ [](QFutureInterface<void> &promise) {
+ auto title = QCoreApplication::translate("ClangPchProgressManager",
+ "Creating Dependencies");
+ Core::ProgressManager::addTask(promise.future(), title, "dependency creation", nullptr);
+ }};
+ PchManagerClient pchManagerClient{pchCreationProgressManager, dependencyCreationProgressManager};
PchManagerConnectionClient connectionClient{&pchManagerClient};
QtCreatorProjectUpdater<PchManagerProjectUpdater> projectUpdate{connectionClient.serverProxy(),
pchManagerClient,
diff --git a/src/plugins/clangpchmanager/pchmanagerclient.cpp b/src/plugins/clangpchmanager/pchmanagerclient.cpp
index 56e64b2b56..4b0b5430d7 100644
--- a/src/plugins/clangpchmanager/pchmanagerclient.cpp
+++ b/src/plugins/clangpchmanager/pchmanagerclient.cpp
@@ -53,7 +53,16 @@ void PchManagerClient::precompiledHeadersUpdated(ClangBackEnd::PrecompiledHeader
void PchManagerClient::progress(ClangBackEnd::ProgressMessage &&message)
{
- m_progressManager.setProgress(message.progress, message.total);
+ switch (message.progressType) {
+ case ClangBackEnd::ProgressType::PrecompiledHeader:
+ m_pchCreationProgressManager.setProgress(message.progress, message.total);
+ break;
+ case ClangBackEnd::ProgressType::DependencyCreation:
+ m_dependencyCreationProgressManager.setProgress(message.progress, message.total);
+ break;
+ default:
+ break;
+ }
}
void PchManagerClient::precompiledHeaderRemoved(const QString &projectPartId)
diff --git a/src/plugins/clangpchmanager/pchmanagerclient.h b/src/plugins/clangpchmanager/pchmanagerclient.h
index d7c0b68f71..ccbd03299a 100644
--- a/src/plugins/clangpchmanager/pchmanagerclient.h
+++ b/src/plugins/clangpchmanager/pchmanagerclient.h
@@ -42,8 +42,10 @@ class CLANGPCHMANAGER_EXPORT PchManagerClient final : public ClangBackEnd::PchMa
{
friend class PchManagerNotifierInterface;
public:
- PchManagerClient(ProgressManagerInterface &progressManager)
- : m_progressManager(progressManager)
+ PchManagerClient(ProgressManagerInterface &pchCreationProgressManager,
+ ProgressManagerInterface &dependencyCreationProgressManager)
+ : m_pchCreationProgressManager(pchCreationProgressManager)
+ , m_dependencyCreationProgressManager(dependencyCreationProgressManager)
{}
void alive() override;
@@ -78,7 +80,8 @@ private:
ClangBackEnd::ProjectPartPchs m_projectPartPchs;
std::vector<PchManagerNotifierInterface*> m_notifiers;
PchManagerConnectionClient *m_connectionClient=nullptr;
- ProgressManagerInterface &m_progressManager;
+ ProgressManagerInterface &m_pchCreationProgressManager;
+ ProgressManagerInterface &m_dependencyCreationProgressManager;
};
} // namespace ClangPchManager
diff --git a/src/plugins/clangpchmanager/pchmanagerconnectionclient.cpp b/src/plugins/clangpchmanager/pchmanagerconnectionclient.cpp
index 812445610e..6db0db0974 100644
--- a/src/plugins/clangpchmanager/pchmanagerconnectionclient.cpp
+++ b/src/plugins/clangpchmanager/pchmanagerconnectionclient.cpp
@@ -87,9 +87,9 @@ QString PchManagerConnectionClient::outputName() const
return QStringLiteral("PchManagerConnectionClient");
}
-void PchManagerConnectionClient::newConnectedServer(QIODevice *ioDevice)
+void PchManagerConnectionClient::newConnectedServer(QLocalSocket *localSocket)
{
- m_serverProxy.setIoDevice(ioDevice);
+ m_serverProxy.setLocalSocket(localSocket);
}
} // namespace ClangPchManager
diff --git a/src/plugins/clangpchmanager/pchmanagerconnectionclient.h b/src/plugins/clangpchmanager/pchmanagerconnectionclient.h
index 672b6ef7cf..7189c83c0b 100644
--- a/src/plugins/clangpchmanager/pchmanagerconnectionclient.h
+++ b/src/plugins/clangpchmanager/pchmanagerconnectionclient.h
@@ -42,7 +42,7 @@ protected:
void sendEndCommand() override;
void resetState() override;
QString outputName() const override;
- void newConnectedServer(QIODevice *ioDevice) override;
+ void newConnectedServer(QLocalSocket *localSocket) override;
private:
ClangBackEnd::PchManagerServerProxy m_serverProxy;
diff --git a/src/plugins/clangpchmanager/progressmanager.h b/src/plugins/clangpchmanager/progressmanager.h
index cc6ab1946c..9dc9fc0366 100644
--- a/src/plugins/clangpchmanager/progressmanager.h
+++ b/src/plugins/clangpchmanager/progressmanager.h
@@ -52,7 +52,8 @@ public:
if (!m_promise)
initialize();
- m_promise->setExpectedResultCount(maximumProgress);
+ if (m_promise->progressMaximum() != maximumProgress)
+ m_promise->setProgressRange(0, maximumProgress);
m_promise->setProgressValue(currentProgress);
if (currentProgress >= maximumProgress)
diff --git a/src/plugins/clangrefactoring/refactoringconnectionclient.cpp b/src/plugins/clangrefactoring/refactoringconnectionclient.cpp
index 865c9d53d1..ff66ec20cb 100644
--- a/src/plugins/clangrefactoring/refactoringconnectionclient.cpp
+++ b/src/plugins/clangrefactoring/refactoringconnectionclient.cpp
@@ -44,9 +44,8 @@ QString currentProcessId()
RefactoringConnectionClient::RefactoringConnectionClient(RefactoringClientInterface *client)
: ConnectionClient(Utils::TemporaryDirectory::masterDirectoryPath()
- + QStringLiteral("/ClangRefactoringBackEnd-")
- + currentProcessId()),
- m_serverProxy(client, nullptr)
+ + QStringLiteral("/ClangRefactoringBackEnd-") + currentProcessId())
+ , m_serverProxy(client)
{
m_processCreator.setTemporaryDirectoryPattern("clangrefactoringbackend-XXXXXX");
m_processCreator.setArguments({connectionName(),
@@ -81,9 +80,9 @@ QString RefactoringConnectionClient::outputName() const
return QStringLiteral("RefactoringConnectionClient");
}
-void RefactoringConnectionClient::newConnectedServer(QIODevice *ioDevice)
+void RefactoringConnectionClient::newConnectedServer(QLocalSocket *localSocket)
{
- m_serverProxy.setIoDevice(ioDevice);
+ m_serverProxy.setLocalSocket(localSocket);
}
} // namespace ClangBackEnd
diff --git a/src/plugins/clangrefactoring/refactoringconnectionclient.h b/src/plugins/clangrefactoring/refactoringconnectionclient.h
index 16734f7ed9..3db871e6a2 100644
--- a/src/plugins/clangrefactoring/refactoringconnectionclient.h
+++ b/src/plugins/clangrefactoring/refactoringconnectionclient.h
@@ -44,7 +44,7 @@ protected:
void sendEndCommand() override;
void resetState() override;
QString outputName() const override;
- void newConnectedServer(QIODevice *ioDevice) override;
+ void newConnectedServer(QLocalSocket *localSocket) override;
private:
RefactoringServerProxy m_serverProxy;
diff --git a/src/plugins/clangtools/clangfixitsrefactoringchanges.cpp b/src/plugins/clangtools/clangfixitsrefactoringchanges.cpp
index 4be95a2744..c3b6f4ac3e 100644
--- a/src/plugins/clangtools/clangfixitsrefactoringchanges.cpp
+++ b/src/plugins/clangtools/clangfixitsrefactoringchanges.cpp
@@ -85,9 +85,6 @@ bool FixitsRefactoringFile::apply()
ICodeStylePreferencesFactory *factory = TextEditorSettings::codeStyleFactory(
CppTools::Constants::CPP_SETTINGS_ID);
- const TextEditor::TabSettings tabSettings
- = CppTools::CppCodeStyleSettings::currentProjectTabSettings();
-
// Apply changes
std::unique_ptr<TextEditor::Indenter> indenter;
QString lastFilename;
diff --git a/src/plugins/cppeditor/cpphighlighter.cpp b/src/plugins/cppeditor/cpphighlighter.cpp
index 075791b021..a7531acf1e 100644
--- a/src/plugins/cppeditor/cpphighlighter.cpp
+++ b/src/plugins/cppeditor/cpphighlighter.cpp
@@ -35,7 +35,7 @@
#include <QTextDocument>
-using namespace CppEditor::Internal;
+using namespace CppEditor;
using namespace TextEditor;
using namespace CPlusPlus;
diff --git a/src/plugins/cppeditor/cpphighlighter.h b/src/plugins/cppeditor/cpphighlighter.h
index e43ce63172..a982191b7e 100644
--- a/src/plugins/cppeditor/cpphighlighter.h
+++ b/src/plugins/cppeditor/cpphighlighter.h
@@ -25,6 +25,8 @@
#pragma once
+#include "cppeditor_global.h"
+
#include <texteditor/syntaxhighlighter.h>
#include <cplusplus/Token.h>
@@ -33,10 +35,7 @@
namespace CppEditor {
-namespace Internal {
-
-
-class CppHighlighter : public TextEditor::SyntaxHighlighter
+class CPPEDITOR_EXPORT CppHighlighter : public TextEditor::SyntaxHighlighter
{
Q_OBJECT
@@ -58,5 +57,4 @@ private:
CPlusPlus::LanguageFeatures m_languageFeatures = CPlusPlus::LanguageFeatures::defaultFeatures();
};
-} // namespace Internal
} // namespace CppEditor
diff --git a/src/plugins/cpptools/cppcodestylesettingspage.cpp b/src/plugins/cpptools/cppcodestylesettingspage.cpp
index 39517e6e35..ef62ad1fa3 100644
--- a/src/plugins/cpptools/cppcodestylesettingspage.cpp
+++ b/src/plugins/cpptools/cppcodestylesettingspage.cpp
@@ -26,6 +26,7 @@
#include "cppcodestylesettingspage.h"
#include "cppcodestylepreferences.h"
+#include "cppcodestylesnippets.h"
#include "cpppointerdeclarationformatter.h"
#include "cppqtstyleindenter.h"
#include "cpptoolsconstants.h"
@@ -49,170 +50,6 @@
#include <QTextBlock>
#include <QTextStream>
-static const char *defaultCodeStyleSnippets[] = {
- "#include <math.h>\n"
- "\n"
- "class Complex\n"
- " {\n"
- "public:\n"
- " Complex(double re, double im)\n"
- " : _re(re), _im(im)\n"
- " {}\n"
- " double modulus() const\n"
- " {\n"
- " return sqrt(_re * _re + _im * _im);\n"
- " }\n"
- "private:\n"
- " double _re;\n"
- " double _im;\n"
- " };\n"
- "\n"
- "void bar(int i)\n"
- " {\n"
- " static int counter = 0;\n"
- " counter += i;\n"
- " }\n"
- "\n"
- "namespace Foo\n"
- " {\n"
- " namespace Bar\n"
- " {\n"
- " void foo(int a, int b)\n"
- " {\n"
- " for (int i = 0; i < a; i++)\n"
- " {\n"
- " if (i < b)\n"
- " bar(i);\n"
- " else\n"
- " {\n"
- " bar(i);\n"
- " bar(b);\n"
- " }\n"
- " }\n"
- " }\n"
- " } // namespace Bar\n"
- " } // namespace Foo\n"
- ,
- "#include <math.h>\n"
- "\n"
- "class Complex\n"
- " {\n"
- "public:\n"
- " Complex(double re, double im)\n"
- " : _re(re), _im(im)\n"
- " {}\n"
- " double modulus() const\n"
- " {\n"
- " return sqrt(_re * _re + _im * _im);\n"
- " }\n"
- "private:\n"
- " double _re;\n"
- " double _im;\n"
- " };\n"
- "\n"
- "void bar(int i)\n"
- " {\n"
- " static int counter = 0;\n"
- " counter += i;\n"
- " }\n"
- "\n"
- "namespace Foo\n"
- " {\n"
- " namespace Bar\n"
- " {\n"
- " void foo(int a, int b)\n"
- " {\n"
- " for (int i = 0; i < a; i++)\n"
- " {\n"
- " if (i < b)\n"
- " bar(i);\n"
- " else\n"
- " {\n"
- " bar(i);\n"
- " bar(b);\n"
- " }\n"
- " }\n"
- " }\n"
- " } // namespace Bar\n"
- " } // namespace Foo\n"
- ,
- "namespace Foo\n"
- "{\n"
- "namespace Bar\n"
- "{\n"
- "class FooBar\n"
- " {\n"
- "public:\n"
- " FooBar(int a)\n"
- " : _a(a)\n"
- " {}\n"
- " int calculate() const\n"
- " {\n"
- " if (a > 10)\n"
- " {\n"
- " int b = 2 * a;\n"
- " return a * b;\n"
- " }\n"
- " return -a;\n"
- " }\n"
- "private:\n"
- " int _a;\n"
- " };\n"
- "}\n"
- "}\n"
- ,
- "#include \"bar.h\"\n"
- "\n"
- "int foo(int a)\n"
- " {\n"
- " switch (a)\n"
- " {\n"
- " case 1:\n"
- " bar(1);\n"
- " break;\n"
- " case 2:\n"
- " {\n"
- " bar(2);\n"
- " break;\n"
- " }\n"
- " case 3:\n"
- " default:\n"
- " bar(3);\n"
- " break;\n"
- " }\n"
- " return 0;\n"
- " }\n"
- ,
- "void foo() {\n"
- " if (a &&\n"
- " b)\n"
- " c;\n"
- "\n"
- " while (a ||\n"
- " b)\n"
- " break;\n"
- " a = b +\n"
- " c;\n"
- " myInstance.longMemberName +=\n"
- " foo;\n"
- " myInstance.longMemberName += bar +\n"
- " foo;\n"
- "}\n"
- ,
- "int *foo(const Bar &b1, Bar &&b2, int*, int *&rpi)\n"
- "{\n"
- " int*pi = 0;\n"
- " int*const*const cpcpi = &pi;\n"
- " int*const*pcpi = &pi;\n"
- " int**const cppi = &pi;\n"
- "\n"
- " void (*foo)(char *s) = 0;\n"
- " int (*bar)[] = 0;\n"
- "\n"
- " return pi;\n"
- "}\n"
-};
-
using namespace TextEditor;
namespace CppTools {
@@ -270,7 +107,7 @@ CppCodeStylePreferencesWidget::CppCodeStylePreferencesWidget(QWidget *parent)
<< m_ui->previewTextEditBraces << m_ui->previewTextEditSwitch
<< m_ui->previewTextEditPadding << m_ui->previewTextEditPointerReferences;
for (int i = 0; i < m_previews.size(); ++i)
- m_previews[i]->setPlainText(QLatin1String(defaultCodeStyleSnippets[i]));
+ m_previews[i]->setPlainText(QLatin1String(Constants::DEFAULT_CODE_STYLE_SNIPPETS[i]));
decorateEditors(TextEditorSettings::fontSettings());
connect(TextEditorSettings::instance(), &TextEditorSettings::fontSettingsChanged,
diff --git a/src/plugins/cpptools/cppcodestylesnippets.h b/src/plugins/cpptools/cppcodestylesnippets.h
new file mode 100644
index 0000000000..b1f8ce199c
--- /dev/null
+++ b/src/plugins/cpptools/cppcodestylesnippets.h
@@ -0,0 +1,190 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt Creator.
+**
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+****************************************************************************/
+
+#pragma once
+
+namespace CppTools {
+namespace Constants {
+
+static const char *DEFAULT_CODE_STYLE_SNIPPETS[]
+ = {"#include <math.h>\n"
+ "\n"
+ "class Complex\n"
+ " {\n"
+ "public:\n"
+ " Complex(double re, double im)\n"
+ " : _re(re), _im(im)\n"
+ " {}\n"
+ " double modulus() const\n"
+ " {\n"
+ " return sqrt(_re * _re + _im * _im);\n"
+ " }\n"
+ "private:\n"
+ " double _re;\n"
+ " double _im;\n"
+ " };\n"
+ "\n"
+ "void bar(int i)\n"
+ " {\n"
+ " static int counter = 0;\n"
+ " counter += i;\n"
+ " }\n"
+ "\n"
+ "namespace Foo\n"
+ " {\n"
+ " namespace Bar\n"
+ " {\n"
+ " void foo(int a, int b)\n"
+ " {\n"
+ " for (int i = 0; i < a; i++)\n"
+ " {\n"
+ " if (i < b)\n"
+ " bar(i);\n"
+ " else\n"
+ " {\n"
+ " bar(i);\n"
+ " bar(b);\n"
+ " }\n"
+ " }\n"
+ " }\n"
+ " } // namespace Bar\n"
+ " } // namespace Foo\n",
+ "#include <math.h>\n"
+ "\n"
+ "class Complex\n"
+ " {\n"
+ "public:\n"
+ " Complex(double re, double im)\n"
+ " : _re(re), _im(im)\n"
+ " {}\n"
+ " double modulus() const\n"
+ " {\n"
+ " return sqrt(_re * _re + _im * _im);\n"
+ " }\n"
+ "private:\n"
+ " double _re;\n"
+ " double _im;\n"
+ " };\n"
+ "\n"
+ "void bar(int i)\n"
+ " {\n"
+ " static int counter = 0;\n"
+ " counter += i;\n"
+ " }\n"
+ "\n"
+ "namespace Foo\n"
+ " {\n"
+ " namespace Bar\n"
+ " {\n"
+ " void foo(int a, int b)\n"
+ " {\n"
+ " for (int i = 0; i < a; i++)\n"
+ " {\n"
+ " if (i < b)\n"
+ " bar(i);\n"
+ " else\n"
+ " {\n"
+ " bar(i);\n"
+ " bar(b);\n"
+ " }\n"
+ " }\n"
+ " }\n"
+ " } // namespace Bar\n"
+ " } // namespace Foo\n",
+ "namespace Foo\n"
+ "{\n"
+ "namespace Bar\n"
+ "{\n"
+ "class FooBar\n"
+ " {\n"
+ "public:\n"
+ " FooBar(int a)\n"
+ " : _a(a)\n"
+ " {}\n"
+ " int calculate() const\n"
+ " {\n"
+ " if (a > 10)\n"
+ " {\n"
+ " int b = 2 * a;\n"
+ " return a * b;\n"
+ " }\n"
+ " return -a;\n"
+ " }\n"
+ "private:\n"
+ " int _a;\n"
+ " };\n"
+ "}\n"
+ "}\n",
+ "#include \"bar.h\"\n"
+ "\n"
+ "int foo(int a)\n"
+ " {\n"
+ " switch (a)\n"
+ " {\n"
+ " case 1:\n"
+ " bar(1);\n"
+ " break;\n"
+ " case 2:\n"
+ " {\n"
+ " bar(2);\n"
+ " break;\n"
+ " }\n"
+ " case 3:\n"
+ " default:\n"
+ " bar(3);\n"
+ " break;\n"
+ " }\n"
+ " return 0;\n"
+ " }\n",
+ "void foo() {\n"
+ " if (a &&\n"
+ " b)\n"
+ " c;\n"
+ "\n"
+ " while (a ||\n"
+ " b)\n"
+ " break;\n"
+ " a = b +\n"
+ " c;\n"
+ " myInstance.longMemberName +=\n"
+ " foo;\n"
+ " myInstance.longMemberName += bar +\n"
+ " foo;\n"
+ "}\n",
+ "int *foo(const Bar &b1, Bar &&b2, int*, int *&rpi)\n"
+ "{\n"
+ " int*pi = 0;\n"
+ " int*const*const cpcpi = &pi;\n"
+ " int*const*pcpi = &pi;\n"
+ " int**const cppi = &pi;\n"
+ "\n"
+ " void (*foo)(char *s) = 0;\n"
+ " int (*bar)[] = 0;\n"
+ "\n"
+ " return pi;\n"
+ "}\n"};
+
+} // namespace Constants
+} // namespace CppTools
diff --git a/src/plugins/cpptools/cppfilesettingspage.cpp b/src/plugins/cpptools/cppfilesettingspage.cpp
index 5ff64b165d..187f5d5913 100644
--- a/src/plugins/cpptools/cppfilesettingspage.cpp
+++ b/src/plugins/cpptools/cppfilesettingspage.cpp
@@ -37,6 +37,7 @@
#include <utils/environment.h>
#include <utils/fileutils.h>
+#include <utils/hostosinfo.h>
#include <utils/mimetypes/mimedatabase.h>
#include <QSettings>
@@ -173,7 +174,8 @@ static bool keyWordReplacement(const QString &keyWord,
return true;
}
if (keyWord == QLatin1String("%USER%")) {
- *value = QLatin1String("%{Env:USER}");
+ *value = Utils::HostOsInfo::isWindowsHost() ? QLatin1String("%{Env:USERNAME}")
+ : QLatin1String("%{Env:USER}");
return true;
}
// Environment variables (for example '%$EMAIL%').
diff --git a/src/plugins/cpptools/cpptools.pro b/src/plugins/cpptools/cpptools.pro
index a55e805af4..04b7ce1adc 100644
--- a/src/plugins/cpptools/cpptools.pro
+++ b/src/plugins/cpptools/cpptools.pro
@@ -26,6 +26,7 @@ HEADERS += \
cppcodestylepreferencesfactory.h \
cppcodestylesettings.h \
cppcodestylesettingspage.h \
+ cppcodestylesnippets.h \
cppcompletionassist.h \
cppcompletionassistprocessor.h \
cppcompletionassistprovider.h \
diff --git a/src/plugins/cpptools/cpptools.qbs b/src/plugins/cpptools/cpptools.qbs
index 89062d3a21..85e086ddf9 100644
--- a/src/plugins/cpptools/cpptools.qbs
+++ b/src/plugins/cpptools/cpptools.qbs
@@ -82,6 +82,7 @@ Project {
"cppcodestylesettingspage.cpp",
"cppcodestylesettingspage.h",
"cppcodestylesettingspage.ui",
+ "cppcodestylesnippets.h",
"cppcompletionassist.cpp",
"cppcompletionassist.h",
"cppcompletionassistprocessor.cpp",
diff --git a/src/plugins/debugger/debuggermainwindow.cpp b/src/plugins/debugger/debuggermainwindow.cpp
index 76f6301db6..9acc34e6ab 100644
--- a/src/plugins/debugger/debuggermainwindow.cpp
+++ b/src/plugins/debugger/debuggermainwindow.cpp
@@ -372,24 +372,16 @@ void DebuggerMainWindowPrivate::fixupLayoutIfNeeded()
{
// Evil workaround for QTCREATORBUG-21455: In some so far unknown situation
// the saveLayout/restoreLayout process leads to a situation where some docks
- // does not end up below the perspective toolbar even though they were there
+ // do not end up below the perspective toolbar even though they were there
// initially, leading to an awkward dock layout.
- // This here tries to detect the situation (no other dock directly below the
- // toolbar) and "corrects" that by restoring the default layout.
- const QRect toolbarRect = m_toolBarDock->geometry();
- const int targetX = toolbarRect.left();
- const int targetY = toolbarRect.bottom();
-
- const QList<QDockWidget *> docks = q->dockWidgets();
- for (QDockWidget *dock : docks) {
- const QRect dockRect = dock->geometry();
- // 10 for some decoration wiggle room. Found something below? Good.
- if (targetX == dockRect.left() && qAbs(targetY - dockRect.top()) < 10)
- return;
- }
+ // This here tries to detect the situation (sonmething else in the bottom
+ // area is at the right of the toolbar) "corrects" that by restoring the
+ // default layout.
- qDebug() << "Scrambled dock layout found. Resetting it.";
- resetCurrentPerspective();
+ if (m_toolBarDock->width() != q->width()) {
+ qDebug() << "Scrambled dock layout found. Resetting it.";
+ resetCurrentPerspective();
+ }
}
void DebuggerMainWindowPrivate::selectPerspective(Perspective *perspective)
diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp
index 648213c862..fd1f92ec64 100644
--- a/src/plugins/debugger/debuggerplugin.cpp
+++ b/src/plugins/debugger/debuggerplugin.cpp
@@ -1410,7 +1410,7 @@ bool DebuggerPluginPrivate::initialize(const QStringList &arguments,
m_perspective.addWindow(m_engineManagerWindow, Perspective::SplitVertical, nullptr);
m_perspective.addWindow(m_breakpointManagerWindow, Perspective::SplitHorizontal, m_engineManagerWindow);
- m_perspective.addWindow(m_globalLogWindow, Perspective::AddToTab, m_breakpointManagerWindow, false);
+ m_perspective.addWindow(m_globalLogWindow, Perspective::AddToTab, nullptr, false, Qt::TopDockWidgetArea);
setInitialState();
diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp
index d28c6bb263..9fdd6a2790 100644
--- a/src/plugins/git/gitclient.cpp
+++ b/src/plugins/git/gitclient.cpp
@@ -291,6 +291,7 @@ GitDiffEditorController::GitDiffEditorController(IDocument *document, const QStr
{
connect(&m_decorator, &DescriptionWidgetDecorator::branchListRequested,
this, &GitDiffEditorController::updateBranchList);
+ setDisplayName("Git Diff");
}
void GitDiffEditorController::updateBranchList()
@@ -514,7 +515,9 @@ public:
GitDiffEditorController(document, dir),
m_id(id),
m_state(Idle)
- { }
+ {
+ setDisplayName("Git Show");
+ }
void reload() override;
void processCommandOutput(const QString &output) override;
diff --git a/src/plugins/mercurial/mercurialclient.cpp b/src/plugins/mercurial/mercurialclient.cpp
index 4e3f6e37e3..f311d824c3 100644
--- a/src/plugins/mercurial/mercurialclient.cpp
+++ b/src/plugins/mercurial/mercurialclient.cpp
@@ -68,6 +68,7 @@ protected:
MercurialDiffEditorController::MercurialDiffEditorController(IDocument *document, const QString &workingDirectory):
VcsBaseDiffEditorController(document, MercurialPlugin::client(), workingDirectory)
{
+ setDisplayName("Hg Diff");
}
void MercurialDiffEditorController::runCommand(const QList<QStringList> &args, QTextCodec *codec)
diff --git a/src/plugins/perfprofiler/PerfProfiler.json.in b/src/plugins/perfprofiler/PerfProfiler.json.in
index 7a0d175bc1..af54edf549 100644
--- a/src/plugins/perfprofiler/PerfProfiler.json.in
+++ b/src/plugins/perfprofiler/PerfProfiler.json.in
@@ -3,7 +3,6 @@
\"Version\" : \"$$QTCREATOR_VERSION\",
\"CompatVersion\" : \"$$QTCREATOR_COMPAT_VERSION\",
\"Revision\" : \"$$QTC_PLUGIN_REVISION\",
- \"DisabledByDefault\" : true,
\"Vendor\" : \"The Qt Company Ltd\",
\"Copyright\" : \"(C) $$QTCREATOR_COPYRIGHT_YEAR The Qt Company Ltd\",
\"License\" : [ \"Commercial Usage\",
diff --git a/src/plugins/projectexplorer/abiwidget.cpp b/src/plugins/projectexplorer/abiwidget.cpp
index 835dff757d..7135f2891a 100644
--- a/src/plugins/projectexplorer/abiwidget.cpp
+++ b/src/plugins/projectexplorer/abiwidget.cpp
@@ -140,10 +140,12 @@ AbiWidget::AbiWidget(QWidget *parent) : QWidget(parent),
d->m_wordWidthComboBox = new QComboBox(this);
layout->addWidget(d->m_wordWidthComboBox);
+ d->m_wordWidthComboBox->addItem(Abi::toString(16), 16);
d->m_wordWidthComboBox->addItem(Abi::toString(32), 32);
d->m_wordWidthComboBox->addItem(Abi::toString(64), 64);
d->m_wordWidthComboBox->addItem(Abi::toString(0), 0);
- d->m_wordWidthComboBox->setCurrentIndex(2);
+ // Setup current word width of 0 by default.
+ d->m_wordWidthComboBox->setCurrentIndex(d->m_wordWidthComboBox->count() - 1);
connect(d->m_wordWidthComboBox, QOverload<int>::of(&QComboBox::currentIndexChanged),
this, &AbiWidget::customComboBoxesChanged);
diff --git a/src/plugins/projectexplorer/gcctoolchain.cpp b/src/plugins/projectexplorer/gcctoolchain.cpp
index f36a6b9440..26763ed5d5 100644
--- a/src/plugins/projectexplorer/gcctoolchain.cpp
+++ b/src/plugins/projectexplorer/gcctoolchain.cpp
@@ -52,7 +52,6 @@
#include <QLoggingCategory>
#include <QRegularExpression>
-#include <algorithm>
#include <memory>
namespace {
@@ -343,6 +342,11 @@ bool GccToolChain::isValid() const
return fi.isExecutable();
}
+static bool isNetworkCompiler(const QString &dirPath)
+{
+ return dirPath.contains("icecc") || dirPath.contains("distcc");
+}
+
static Utils::FileName findLocalCompiler(const Utils::FileName &compilerPath,
const Environment &env)
{
@@ -351,21 +355,13 @@ static Utils::FileName findLocalCompiler(const Utils::FileName &compilerPath,
// Get the path to the compiler, ignoring direct calls to icecc and distcc as we cannot
// do anything about those.
- const Utils::FileName compilerDir = compilerPath.parentDir();
- const QString compilerDirString = compilerDir.toString();
- if (!compilerDirString.contains("icecc") && !compilerDirString.contains("distcc"))
+ if (!isNetworkCompiler(compilerPath.parentDir().toString()))
return compilerPath;
- FileNameList pathComponents = env.path();
- auto it = std::find_if(pathComponents.begin(), pathComponents.end(),
- [compilerDir](const FileName &p) {
- return p == compilerDir;
+ // Filter out network compilers
+ const FileNameList pathComponents = Utils::filtered(env.path(), [] (const FileName &dirPath) {
+ return !isNetworkCompiler(dirPath.toString());
});
- if (it != pathComponents.end()) {
- std::rotate(pathComponents.begin(), it, pathComponents.end());
- pathComponents.removeFirst(); // remove directory of compilerPath
- // No need to put it at the end again, it is in PATH anyway...
- }
// This effectively searches the PATH twice, once via pathComponents and once via PATH itself:
// searchInPath filters duplicates, so that will not hurt.
@@ -402,15 +398,7 @@ ToolChain::MacroInspectionRunner GccToolChain::createMacroInspectionRunner() con
|| a == "-gcc-toolchain" || a == "-target") {
if (++iArg < allFlags.length())
arguments << a << allFlags.at(iArg);
- } else if (a == "-m128bit-long-double" || a == "-m32" || a == "-m3dnow"
- || a == "-m3dnowa" || a == "-m64" || a == "-m96bit-long-double"
- || a == "-mabm" || a == "-maes" || a.startsWith("-march=") || a == "-mavx"
- || a.startsWith("-masm=") || a.startsWith("-mfloat-abi") || a == "-mcx16"
- || a == "-mfma" || a == "-mfma4" || a == "-mlwp" || a == "-mpclmul"
- || a == "-mpopcnt" || a == "-msse" || a == "-msse2" || a == "-msse2avx"
- || a == "-msse3" || a == "-msse4" || a == "-msse4.1" || a == "-msse4.2"
- || a == "-msse4a" || a == "-mssse3" || a.startsWith("-mtune=")
- || a == "-mxop" || a == "-Os" || a == "-O0" || a == "-O1" || a == "-O2"
+ } else if (a.startsWith("-m") || a == "-Os" || a == "-O0" || a == "-O1" || a == "-O2"
|| a == "-O3" || a == "-ffinite-math-only" || a == "-fshort-double"
|| a == "-fshort-wchar" || a == "-fsignaling-nans" || a == "-fno-inline"
|| a == "-fno-exceptions" || a == "-fstack-protector"
diff --git a/src/plugins/projectexplorer/makestep.ui b/src/plugins/projectexplorer/makestep.ui
index 0ce98f0bae..b6ddcc6897 100644
--- a/src/plugins/projectexplorer/makestep.ui
+++ b/src/plugins/projectexplorer/makestep.ui
@@ -79,6 +79,9 @@
<property name="minimum">
<number>1</number>
</property>
+ <property name="maximum">
+ <number>999</number>
+ </property>
</widget>
</item>
<item>
diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp
index c3b5d68806..ad588a12bd 100644
--- a/src/plugins/projectexplorer/projectexplorer.cpp
+++ b/src/plugins/projectexplorer/projectexplorer.cpp
@@ -44,6 +44,7 @@
#include "projectexplorersettingspage.h"
#include "projectmanager.h"
#include "removetaskhandler.h"
+#include "runconfigurationaspects.h"
#include "kitfeatureprovider.h"
#include "kitmanager.h"
#include "kitoptionspage.h"
@@ -1595,8 +1596,14 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er
tr("The currently active run configuration's executable (if applicable)."),
[]() -> QString {
if (Target *target = activeTarget()) {
- if (RunConfiguration *rc = target->activeRunConfiguration())
- return rc->runnable().executable;
+ if (RunConfiguration *rc = target->activeRunConfiguration()) {
+ // TODO: This duplicates code and is not always correct, but see
+ // QTCREATORBUG-18317.
+ // Solution: Re-introduce RunConfiguration::executable()?
+ if (auto executableAspect = rc->aspect<ExecutableAspect>())
+ return executableAspect->executable().toString();
+ return QString();
+ }
}
return QString();
});
@@ -3459,15 +3466,12 @@ void ProjectExplorerPluginPrivate::removeProject()
Node *node = ProjectTree::findCurrentNode();
if (!node)
return;
- ProjectNode *subProjectNode = node->managingProject();
- if (!subProjectNode)
- return;
- ProjectNode *projectNode = subProjectNode->managingProject();
+ ProjectNode *projectNode = node->managingProject();
if (projectNode) {
- Utils::RemoveFileDialog removeFileDialog(subProjectNode->filePath().toString(), ICore::mainWindow());
+ Utils::RemoveFileDialog removeFileDialog(node->filePath().toString(), ICore::mainWindow());
removeFileDialog.setDeleteFileVisible(false);
if (removeFileDialog.exec() == QDialog::Accepted)
- projectNode->removeSubProject(subProjectNode->filePath().toString());
+ projectNode->removeSubProject(node->filePath().toString());
}
}
diff --git a/src/plugins/projectexplorer/projectmodels.cpp b/src/plugins/projectexplorer/projectmodels.cpp
index ae0c72bdd2..874b38df57 100644
--- a/src/plugins/projectexplorer/projectmodels.cpp
+++ b/src/plugins/projectexplorer/projectmodels.cpp
@@ -378,6 +378,8 @@ void FlatModel::saveExpandData()
void FlatModel::addFolderNode(WrapperNode *parent, FolderNode *folderNode, QSet<Node *> *seen)
{
for (Node *node : folderNode->nodes()) {
+ if (m_filterGeneratedFiles && node->isGenerated())
+ continue;
if (FolderNode *subFolderNode = node->asFolderNode()) {
const bool isHidden = m_filterProjects && !subFolderNode->showInSimpleTree();
if (!isHidden && !seen->contains(subFolderNode)) {
@@ -390,8 +392,7 @@ void FlatModel::addFolderNode(WrapperNode *parent, FolderNode *folderNode, QSet<
addFolderNode(parent, subFolderNode, seen);
}
} else if (FileNode *fileNode = node->asFileNode()) {
- const bool isHidden = m_filterGeneratedFiles && fileNode->isGenerated();
- if (!isHidden && !seen->contains(fileNode)) {
+ if (!seen->contains(fileNode)) {
seen->insert(fileNode);
parent->appendChild(new WrapperNode(fileNode));
}
diff --git a/src/plugins/qmakeprojectmanager/qmakenodes.cpp b/src/plugins/qmakeprojectmanager/qmakenodes.cpp
index fc1cdc4e5a..a3c06295ae 100644
--- a/src/plugins/qmakeprojectmanager/qmakenodes.cpp
+++ b/src/plugins/qmakeprojectmanager/qmakenodes.cpp
@@ -132,7 +132,7 @@ bool QmakePriFileNode::supportsAction(ProjectAction action, const Node *node) co
break;
}
case ProjectType::SubDirsTemplate:
- if (action == AddSubProject || action == RemoveSubProject || action == AddExistingProject)
+ if (action == AddSubProject || action == AddExistingProject)
return true;
break;
default:
@@ -344,6 +344,13 @@ bool QmakeProFileNode::includedInExactParse() const
return pro && pro->includedInExactParse();
}
+bool QmakeProFileNode::supportsAction(ProjectAction action, const Node *node) const
+{
+ if (action == RemoveSubProject)
+ return parentProjectNode() && !parentProjectNode()->asContainerNode();
+ return QmakePriFileNode::supportsAction(action, node);
+}
+
FolderNode::AddNewInformation QmakeProFileNode::addNewInformation(const QStringList &files, Node *context) const
{
Q_UNUSED(files)
diff --git a/src/plugins/qmakeprojectmanager/qmakenodes.h b/src/plugins/qmakeprojectmanager/qmakenodes.h
index 6b2f79131d..0f25f13474 100644
--- a/src/plugins/qmakeprojectmanager/qmakenodes.h
+++ b/src/plugins/qmakeprojectmanager/qmakenodes.h
@@ -90,6 +90,7 @@ public:
bool isQtcRunnable() const;
bool includedInExactParse() const;
+ bool supportsAction(ProjectExplorer::ProjectAction action, const Node *node) const override;
bool showInSimpleTree() const override;
QString buildKey() const override;
diff --git a/src/plugins/qmakeprojectmanager/qmakenodetreebuilder.cpp b/src/plugins/qmakeprojectmanager/qmakenodetreebuilder.cpp
index adba361c15..5e7f1e7880 100644
--- a/src/plugins/qmakeprojectmanager/qmakenodetreebuilder.cpp
+++ b/src/plugins/qmakeprojectmanager/qmakenodetreebuilder.cpp
@@ -168,8 +168,12 @@ static void createTree(const QmakePriFile *pri, QmakePriFileNode *node, const Fi
int eid = vfs->idForFileName(file.toString(), QMakeVfs::VfsExact);
vfs->readFile(eid, &contents, &errorMessage);
}
- vfolder->addNode(std::make_unique<ResourceEditor::ResourceTopLevelNode>
- (file, vfolder->filePath(), contents));
+ auto topLevel = std::make_unique<ResourceEditor::ResourceTopLevelNode>
+ (file, vfolder->filePath(), contents);
+ const QString baseName = file.toFileInfo().completeBaseName();
+ topLevel->setIsGenerated(baseName.startsWith("qmake_")
+ || baseName.endsWith("_qmlcache"));
+ vfolder->addNode(std::move(topLevel));
}
} else {
for (const FileName &fn : newFilePaths) {
diff --git a/src/plugins/qmakeprojectmanager/qmakeparsernodes.cpp b/src/plugins/qmakeprojectmanager/qmakeparsernodes.cpp
index c0034972d6..1a401ee953 100644
--- a/src/plugins/qmakeprojectmanager/qmakeparsernodes.cpp
+++ b/src/plugins/qmakeprojectmanager/qmakeparsernodes.cpp
@@ -1246,6 +1246,7 @@ static bool evaluateOne(const QmakeEvalInput &input, ProFile *pro,
QStringList basecfgs = reader->values(build + QLatin1String(".CONFIG"));
basecfgs += build;
basecfgs += QLatin1String("build_pass");
+ basecfgs += "qtc_run";
basevars[QLatin1String("BUILD_PASS")] = QStringList(build);
QStringList buildname = reader->values(build + QLatin1String(".name"));
basevars[QLatin1String("BUILD_NAME")] = (buildname.isEmpty() ? QStringList(build) : buildname);
diff --git a/src/plugins/qmakeprojectmanager/qmakeprojectimporter.cpp b/src/plugins/qmakeprojectmanager/qmakeprojectimporter.cpp
index b5a29ba620..d440818d4c 100644
--- a/src/plugins/qmakeprojectmanager/qmakeprojectimporter.cpp
+++ b/src/plugins/qmakeprojectmanager/qmakeprojectimporter.cpp
@@ -265,19 +265,30 @@ void QmakeProjectImporter::deleteDirectoryData(void *directoryData) const
delete static_cast<DirectoryData *>(directoryData);
}
-static ToolChain *preferredToolChain(BaseQtVersion *qtVersion, const FileName &ms,
- const QMakeStepConfig::TargetArchConfig &archConfig)
+static const QList<ToolChain *> preferredToolChains(BaseQtVersion *qtVersion, const FileName &ms,
+ const QMakeStepConfig::TargetArchConfig &archConfig)
{
const FileName spec = ms.isEmpty() ? qtVersion->mkspec() : ms;
const QList<ToolChain *> toolchains = ToolChainManager::toolChains();
QList<Abi> qtAbis = qtVersion->qtAbis();
- return findOr(toolchains, toolchains.isEmpty() ? nullptr : toolchains.first(),
- [&](ToolChain *tc) {
+ const auto matcher = [&](const ToolChain *tc) {
return qtAbis.contains(tc->targetAbi())
- && tc->suggestedMkspecList().contains(spec)
- && QMakeStepConfig::targetArchFor(tc->targetAbi(), qtVersion) == archConfig;
+ && tc->suggestedMkspecList().contains(spec)
+ && QMakeStepConfig::targetArchFor(tc->targetAbi(), qtVersion) == archConfig;
+ };
+ ToolChain * const cxxToolchain = findOrDefault(toolchains, [matcher](const ToolChain *tc) {
+ return tc->language() == ProjectExplorer::Constants::CXX_LANGUAGE_ID && matcher(tc);
});
+ ToolChain * const cToolchain = findOrDefault(toolchains, [matcher](const ToolChain *tc) {
+ return tc->language() == ProjectExplorer::Constants::C_LANGUAGE_ID && matcher(tc);
+ });
+ QList<ToolChain *> chosenToolchains;
+ for (ToolChain * const tc : {cxxToolchain, cToolchain}) {
+ if (tc)
+ chosenToolchains << tc;
+ };
+ return chosenToolchains;
}
Kit *QmakeProjectImporter::createTemporaryKit(const QtProjectImporter::QtVersionData &data,
@@ -288,7 +299,8 @@ Kit *QmakeProjectImporter::createTemporaryKit(const QtProjectImporter::QtVersion
Q_UNUSED(osType); // TODO use this to select the right toolchain?
return QtProjectImporter::createTemporaryKit(data,
[&data, parsedSpec, archConfig](Kit *k) -> void {
- ToolChainKitAspect::setToolChain(k, preferredToolChain(data.qt, parsedSpec, archConfig));
+ for (ToolChain * const tc : preferredToolChains(data.qt, parsedSpec, archConfig))
+ ToolChainKitAspect::setToolChain(k, tc);
if (parsedSpec != data.qt->mkspec())
QmakeKitAspect::setMkspec(k, parsedSpec);
});
diff --git a/src/plugins/qmakeprojectmanager/wizards/libraryparameters.cpp b/src/plugins/qmakeprojectmanager/wizards/libraryparameters.cpp
index aa46476ae0..83217ce2bf 100644
--- a/src/plugins/qmakeprojectmanager/wizards/libraryparameters.cpp
+++ b/src/plugins/qmakeprojectmanager/wizards/libraryparameters.cpp
@@ -32,6 +32,8 @@
#include <QTextStream>
#include <QStringList>
+#include <cstring>
+
namespace QmakeProjectManager {
namespace Internal {
@@ -150,7 +152,7 @@ void LibraryParameters::generateCode(QtProjectParameters:: Type t,
}
QTC_ASSERT(nameIndex != -1, continue);
sourceStr << '\n' << namespaceIndent << signature.left(nameIndex);
- if (signature.at(nameIndex - 1) != ' ')
+ if (!std::strchr("&* ", signature.at(nameIndex - 1).toLatin1()))
sourceStr << ' ';
sourceStr << unqualifiedClassName << "::" << signature.mid(nameIndex) << '\n';
sourceStr << namespaceIndent << "{\n" << indent
diff --git a/src/plugins/qmakeprojectmanager/wizards/librarywizarddialog.cpp b/src/plugins/qmakeprojectmanager/wizards/librarywizarddialog.cpp
index 0381e2670a..2aed6d43cd 100644
--- a/src/plugins/qmakeprojectmanager/wizards/librarywizarddialog.cpp
+++ b/src/plugins/qmakeprojectmanager/wizards/librarywizarddialog.cpp
@@ -56,7 +56,7 @@ using QSL = QStringList;
static const PluginBaseClasses pluginBaseClasses[] =
{
{"QAccessiblePlugin", "QtGui",
- QSL{"QAccessibleInterface * create(const QString &key, QObject *object)"},
+ QSL{"QAccessibleInterface *create(const QString &key, QObject *object)"},
"QtCore", "accessible", "QAccessibleFactoryInterface"},
{"QGenericPlugin", "QtGui", QSL{"QObject *create(const QString &name, const QString &spec)"},
"QtCore", "generic", "QGenericPluginFactoryInterface"},
diff --git a/src/plugins/qmldesigner/components/propertyeditor/gradientmodel.cpp b/src/plugins/qmldesigner/components/propertyeditor/gradientmodel.cpp
index 8c0c322858..a6616cf05f 100644
--- a/src/plugins/qmldesigner/components/propertyeditor/gradientmodel.cpp
+++ b/src/plugins/qmldesigner/components/propertyeditor/gradientmodel.cpp
@@ -104,28 +104,29 @@ int GradientModel::addStop(qreal position, const QColor &color)
return -1;
if (m_itemNode.modelNode().hasNodeProperty(gradientPropertyName().toUtf8())) {
- //QmlDesigner::RewriterTransaction transaction = m_itemNode.modelNode().view()->beginRewriterTransaction();
- //### TODO does not work
+ int properPos = 0;
+ try {
- QmlDesigner::ModelNode gradientNode = m_itemNode.modelNode().nodeProperty(gradientPropertyName().toUtf8()).modelNode();
+ QmlDesigner::ModelNode gradientNode = m_itemNode.modelNode().nodeProperty(gradientPropertyName().toUtf8()).modelNode();
- QmlDesigner::ModelNode gradientStopNode =
- m_itemNode.modelNode().view()->createModelNode("QtQuick.GradientStop",
- m_itemNode.modelNode().view()->majorQtQuickVersion(), 0);
- gradientStopNode.variantProperty("position").setValue(position);
- gradientStopNode.variantProperty("color").setValue(color);
- gradientNode.nodeListProperty("stops").reparentHere(gradientStopNode);
+ QmlDesigner::ModelNode gradientStopNode = createGradientStopNode();
- const QList<QmlDesigner::ModelNode> stopNodes = gradientNode.nodeListProperty("stops").toModelNodeList();
+ gradientStopNode.variantProperty("position").setValue(position);
+ gradientStopNode.variantProperty("color").setValue(color);
+ gradientNode.nodeListProperty("stops").reparentHere(gradientStopNode);
- int properPos = 0;
- for (int i = 0; i < stopNodes.count(); i++) {
- if (QmlDesigner::QmlObjectNode(stopNodes.at(i)).modelValue("position").toReal() < position)
- properPos = i + 1;
- }
- gradientNode.nodeListProperty("stops").slide(stopNodes.count() - 1, properPos);
+ const QList<QmlDesigner::ModelNode> stopNodes = gradientNode.nodeListProperty("stops").toModelNodeList();
- setupModel();
+ for (int i = 0; i < stopNodes.count(); i++) {
+ if (QmlDesigner::QmlObjectNode(stopNodes.at(i)).modelValue("position").toReal() < position)
+ properPos = i + 1;
+ }
+ gradientNode.nodeListProperty("stops").slide(stopNodes.count() - 1, properPos);
+
+ setupModel();
+ } catch (const QmlDesigner::Exception &e) {
+ e.showException();
+ }
return properPos;
}
@@ -155,12 +156,12 @@ void GradientModel::addGradient()
m_itemNode.modelNode().nodeProperty(gradientPropertyName().toUtf8()).reparentHere(gradientNode);
- QmlDesigner::ModelNode gradientStopNode = view()->createModelNode("QtQuick.GradientStop", view()->majorQtQuickVersion(), 0);
+ QmlDesigner::ModelNode gradientStopNode = createGradientStopNode();
gradientStopNode.variantProperty("position").setValue(0.0);
gradientStopNode.variantProperty("color").setValue(color);
gradientNode.nodeListProperty("stops").reparentHere(gradientStopNode);
- gradientStopNode = view()->createModelNode("QtQuick.GradientStop", view()->majorQtQuickVersion(), 0);
+ gradientStopNode = createGradientStopNode();
gradientStopNode.variantProperty("position").setValue(1.0);
gradientStopNode.variantProperty("color").setValue(QColor(Qt::black));
gradientNode.nodeListProperty("stops").reparentHere(gradientStopNode);
@@ -459,6 +460,17 @@ QmlDesigner::ModelNode GradientModel::createGradientNode()
return gradientNode;
}
+QmlDesigner::ModelNode GradientModel::createGradientStopNode()
+{
+ QByteArray fullTypeName = "QtQuick.GradientStop";
+ auto metaInfo = model()->metaInfo(fullTypeName);
+
+ int minorVersion = metaInfo.minorVersion();
+ int majorVersion = metaInfo.majorVersion();
+
+ return view()->createModelNode(fullTypeName, majorVersion, minorVersion);
+}
+
void GradientModel::setGradientProperty(const QString &propertyName, qreal value)
{
QTC_ASSERT(m_itemNode.isValid(), return);
diff --git a/src/plugins/qmldesigner/components/propertyeditor/gradientmodel.h b/src/plugins/qmldesigner/components/propertyeditor/gradientmodel.h
index ecb9ba53fd..804731c1e2 100644
--- a/src/plugins/qmldesigner/components/propertyeditor/gradientmodel.h
+++ b/src/plugins/qmldesigner/components/propertyeditor/gradientmodel.h
@@ -86,6 +86,7 @@ private:
bool hasGradient() const;
bool locked() const;
QmlDesigner::ModelNode createGradientNode();
+ QmlDesigner::ModelNode createGradientStopNode();
private:
QmlDesigner::QmlItemNode m_itemNode;
diff --git a/src/plugins/qmldesigner/designercore/model/rewriterview.cpp b/src/plugins/qmldesigner/designercore/model/rewriterview.cpp
index f4cd9c7e79..2b22844bb9 100644
--- a/src/plugins/qmldesigner/designercore/model/rewriterview.cpp
+++ b/src/plugins/qmldesigner/designercore/model/rewriterview.cpp
@@ -486,6 +486,8 @@ QString RewriterView::auxiliaryDataAsQML() const
QString str = "Designer {\n ";
+ QTC_ASSERT(!m_canonicalIntModelNode.isEmpty(), return {});
+
int columnCount = 0;
for (const auto &node : allModelNodes()) {
QHash<PropertyName, QVariant> data = node.auxiliaryData();
@@ -727,8 +729,11 @@ void RewriterView::setupCanonicalHashes() const
using myPair = std::pair<ModelNode,int>;
std::vector<myPair> data;
- for (const ModelNode &node : allModelNodes())
- data.emplace_back(std::make_pair(node, nodeOffset(node)));
+ for (const ModelNode &node : allModelNodes()) {
+ int offset = nodeOffset(node);
+ QTC_ASSERT(offset > 0, qDebug() << Q_FUNC_INFO << "no offset" << node; return);
+ data.emplace_back(std::make_pair(node, offset));
+ }
std::sort(data.begin(), data.end(), [](myPair a, myPair b) {
return a.second < b.second;
@@ -1066,6 +1071,8 @@ void RewriterView::restoreAuxiliaryData()
setupCanonicalHashes();
+ QTC_ASSERT(!m_canonicalIntModelNode.isEmpty(), return);
+
const QString text = m_textModifier->text();
int startIndex = text.indexOf(annotationsStart());
diff --git a/src/plugins/qmldesigner/designersettings.h b/src/plugins/qmldesigner/designersettings.h
index bdaa22bb4b..9b73dc1faf 100644
--- a/src/plugins/qmldesigner/designersettings.h
+++ b/src/plugins/qmldesigner/designersettings.h
@@ -65,6 +65,7 @@ const char REFORMAT_UI_QML_FILES[] = "ReformatUiQmlFiles"; /* These setti
const char IGNORE_DEVICE_PIXEL_RATIO[] = "IgnoreDevicePixelRaio"; /* The settings can be used to turn off the feature, if there are serious issues */
const char STANDALONE_MODE[] = "StandAloneMode";
const char ENABLE_TIMELINEVIEW[] = "EnableTimelineView";
+const char ENABLE_TIMELINEVIEW_ENVVAR[] = "QTC_ENABLE_QTQUICKTIMELINE_EDITOR";
}
class DesignerSettings : public QHash<QByteArray, QVariant>
diff --git a/src/plugins/qmldesigner/qmldesignerplugin.cpp b/src/plugins/qmldesigner/qmldesignerplugin.cpp
index 84b95cccc3..09e10c3b0c 100644
--- a/src/plugins/qmldesigner/qmldesignerplugin.cpp
+++ b/src/plugins/qmldesigner/qmldesignerplugin.cpp
@@ -194,7 +194,8 @@ bool QmlDesignerPlugin::delayedInitialize()
d->settings.fromSettings(Core::ICore::settings());
d->viewManager.registerViewTakingOwnership(new QmlDesigner::Internal::ConnectionView);
- if (DesignerSettings::getValue(DesignerSettingsKey::ENABLE_TIMELINEVIEW).toBool())
+ if (DesignerSettings::getValue(DesignerSettingsKey::ENABLE_TIMELINEVIEW).toBool()
+ || qEnvironmentVariableIsSet(DesignerSettingsKey::ENABLE_TIMELINEVIEW_ENVVAR))
d->viewManager.registerViewTakingOwnership(new QmlDesigner::TimelineView);
d->viewManager.registerFormEditorToolTakingOwnership(new QmlDesigner::SourceTool);
d->viewManager.registerFormEditorToolTakingOwnership(new QmlDesigner::ColorTool);
diff --git a/src/plugins/qtsupport/profilereader.cpp b/src/plugins/qtsupport/profilereader.cpp
index ba0eb7dd90..9c04012b05 100644
--- a/src/plugins/qtsupport/profilereader.cpp
+++ b/src/plugins/qtsupport/profilereader.cpp
@@ -79,6 +79,7 @@ ProFileReader::ProFileReader(QMakeGlobals *option, QMakeVfs *vfs)
, ProFileEvaluator(option, this, vfs, this)
, m_ignoreLevel(0)
{
+ setExtraConfigs(QStringList("qtc_run"));
}
ProFileReader::~ProFileReader()
diff --git a/src/plugins/qtsupport/qtoutputformatter.cpp b/src/plugins/qtsupport/qtoutputformatter.cpp
index c5a4d7a427..cb98654858 100644
--- a/src/plugins/qtsupport/qtoutputformatter.cpp
+++ b/src/plugins/qtsupport/qtoutputformatter.cpp
@@ -228,7 +228,7 @@ void QtOutputFormatter::handleLink(const QString &href)
if (qmlLineMatch.hasMatch()) {
const QUrl fileUrl = QUrl(qmlLineMatch.captured(1));
const int line = qmlLineMatch.captured(2).toInt();
- openEditor(d->projectFinder.findFile(d->projectFinder.findFile(fileUrl)), line);
+ openEditor(d->projectFinder.findFile(fileUrl), line);
return;
}
diff --git a/src/plugins/texteditor/basefilefind.cpp b/src/plugins/texteditor/basefilefind.cpp
index 39e85f5031..a910de019c 100644
--- a/src/plugins/texteditor/basefilefind.cpp
+++ b/src/plugins/texteditor/basefilefind.cpp
@@ -65,18 +65,17 @@ public:
InternalEngine() : m_widget(new QWidget) {}
~InternalEngine() override { delete m_widget;}
QString title() const override { return TextEditor::SearchEngine::tr("Internal"); }
- QString toolTip() const override { return QString(); }
+ QString toolTip() const override { return {}; }
QWidget *widget() const override { return m_widget; }
- QVariant parameters() const override { return QVariant(); }
+ QVariant parameters() const override { return {}; }
void readSettings(QSettings * /*settings*/) override {}
void writeSettings(QSettings * /*settings*/) const override {}
QFuture<Utils::FileSearchResultList> executeSearch(
const TextEditor::FileFindParameters &parameters,
BaseFileFind *baseFileFind) override
{
- auto func = parameters.flags & FindRegularExpression
- ? Utils::findInFilesRegExp
- : Utils::findInFiles;
+ const auto func = parameters.flags & FindRegularExpression ? Utils::findInFilesRegExp
+ : Utils::findInFiles;
return func(parameters.text,
baseFileFind->files(parameters.nameFilters, parameters.exclusionFilters,
@@ -112,7 +111,8 @@ public:
class BaseFileFindPrivate
{
public:
- ~BaseFileFindPrivate() { delete m_internalSearchEngine; }
+ BaseFileFindPrivate() : m_internalSearchEngine(std::make_unique<InternalEngine>()) {}
+
QPointer<IFindSupport> m_currentFindSupport;
QLabel *m_resultLabel = nullptr;
@@ -125,7 +125,7 @@ public:
QPointer<QComboBox> m_filterCombo;
QPointer<QComboBox> m_exclusionCombo;
QVector<SearchEngine *> m_searchEngines;
- SearchEngine *m_internalSearchEngine;
+ std::unique_ptr<SearchEngine> m_internalSearchEngine;
int m_currentSearchEngineIndex = -1;
};
@@ -182,8 +182,7 @@ void SearchEngine::setEnabled(bool enabled)
BaseFileFind::BaseFileFind() : d(new BaseFileFindPrivate)
{
- d->m_internalSearchEngine = new InternalEngine;
- addSearchEngine(d->m_internalSearchEngine);
+ addSearchEngine(d->m_internalSearchEngine.get());
}
BaseFileFind::~BaseFileFind()
@@ -200,14 +199,14 @@ QStringList BaseFileFind::fileNameFilters() const
{
if (d->m_filterCombo)
return splitFilterUiText(d->m_filterCombo->currentText());
- return QStringList();
+ return {};
}
QStringList BaseFileFind::fileExclusionFilters() const
{
if (d->m_exclusionCombo)
return splitFilterUiText(d->m_exclusionCombo->currentText());
- return QStringList();
+ return {};
}
SearchEngine *BaseFileFind::currentSearchEngine() const
@@ -233,11 +232,11 @@ void BaseFileFind::setCurrentSearchEngine(int index)
static void displayResult(QFutureWatcher<FileSearchResultList> *watcher,
SearchResult *search, int index)
{
- FileSearchResultList results = watcher->resultAt(index);
+ const FileSearchResultList results = watcher->resultAt(index);
QList<SearchResultItem> items;
- foreach (const FileSearchResult &result, results) {
+ for (const FileSearchResult &result : results) {
SearchResultItem item;
- item.path = QStringList() << QDir::toNativeSeparators(result.fileName);
+ item.path = QStringList(QDir::toNativeSeparators(result.fileName));
item.mainRange.begin.line = result.lineNumber;
item.mainRange.begin.column = result.matchStart;
item.mainRange.end = item.mainRange.begin;
@@ -258,7 +257,7 @@ void BaseFileFind::runNewSearch(const QString &txt, FindFlags findFlags,
updateComboEntries(d->m_filterCombo, true);
if (d->m_exclusionCombo)
updateComboEntries(d->m_exclusionCombo, true);
- QString tooltip = toolTip();
+ const QString tooltip = toolTip();
SearchResult *search = SearchResultWindow::instance()->startNewSearch(
label(),
@@ -276,20 +275,26 @@ void BaseFileFind::runNewSearch(const QString &txt, FindFlags findFlags,
parameters.searchEngineParameters = currentSearchEngine()->parameters();
parameters.searchEngineIndex = d->m_currentSearchEngineIndex;
search->setUserData(qVariantFromValue(parameters));
- connect(search, &SearchResult::activated, this, &BaseFileFind::openEditor);
+ connect(search, &SearchResult::activated, this, [this, search](const SearchResultItem &item) {
+ openEditor(search, item);
+ });
if (searchMode == SearchResultWindow::SearchAndReplace)
connect(search, &SearchResult::replaceButtonClicked, this, &BaseFileFind::doReplace);
connect(search, &SearchResult::visibilityChanged, this, &BaseFileFind::hideHighlightAll);
- connect(search, &SearchResult::searchAgainRequested, this, &BaseFileFind::searchAgain);
+ connect(search, &SearchResult::searchAgainRequested, this, [this, search] {
+ searchAgain(search);
+ });
connect(this, &BaseFileFind::enabledChanged, search, &SearchResult::requestEnabledCheck);
- connect(search, &SearchResult::requestEnabledCheck, this, &BaseFileFind::recheckEnabled);
+ connect(search, &SearchResult::requestEnabledCheck, this, [this, search] {
+ recheckEnabled(search);
+ });
runSearch(search);
}
void BaseFileFind::runSearch(SearchResult *search)
{
- FileFindParameters parameters = search->userData().value<FileFindParameters>();
+ const FileFindParameters parameters = search->userData().value<FileFindParameters>();
auto label = new CountingLabel;
connect(search, &SearchResult::countChanged, label, &CountingLabel::updateCount);
auto statusLabel = new CountingLabel;
@@ -341,7 +346,7 @@ void BaseFileFind::doReplace(const QString &text,
const QList<SearchResultItem> &items,
bool preserveCase)
{
- QStringList files = replaceAll(text, items, preserveCase);
+ const QStringList files = replaceAll(text, items, preserveCase);
if (!files.isEmpty()) {
Utils::FadingIndicator::showText(ICore::mainWindow(),
tr("%n occurrences replaced.", nullptr, items.size()),
@@ -391,7 +396,7 @@ QList<QPair<QWidget *, QWidget *>> BaseFileFind::createPatternWidgets()
void BaseFileFind::writeCommonSettings(QSettings *settings)
{
- std::function<QStringList(const QStringList &)> fromNativeSeparators = [](const QStringList &files) {
+ const auto fromNativeSeparators = [](const QStringList &files) -> QStringList {
return Utils::transform(files, &QDir::fromNativeSeparators);
};
@@ -404,7 +409,7 @@ void BaseFileFind::writeCommonSettings(QSettings *settings)
settings->setValue("currentExclusionFilter",
QDir::fromNativeSeparators(d->m_exclusionCombo->currentText()));
- foreach (SearchEngine *searchEngine, d->m_searchEngines)
+ for (const SearchEngine *searchEngine : qAsConst(d->m_searchEngines))
searchEngine->writeSettings(settings);
settings->setValue("currentSearchEngineIndex", d->m_currentSearchEngineIndex);
}
@@ -412,13 +417,13 @@ void BaseFileFind::writeCommonSettings(QSettings *settings)
void BaseFileFind::readCommonSettings(QSettings *settings, const QString &defaultFilter,
const QString &defaultExclusionFilter)
{
- std::function<QStringList(const QStringList &)> toNativeSeparators = [](const QStringList &files) {
+ const auto toNativeSeparators = [](const QStringList &files) -> QStringList {
return Utils::transform(files, &QDir::toNativeSeparators);
};
- QStringList filters = settings->value("filters").toStringList();
- if (filters.isEmpty())
- filters << defaultFilter;
+ const QStringList filterSetting = settings->value("filters").toStringList();
+ const QStringList filters = filterSetting.isEmpty() ? QStringList(defaultFilter)
+ : filterSetting;
const QVariant currentFilter = settings->value("currentFilter");
d->m_filterSetting = currentFilter.isValid() ? currentFilter.toString()
: filters.first();
@@ -436,16 +441,15 @@ void BaseFileFind::readCommonSettings(QSettings *settings, const QString &defaul
if (d->m_exclusionCombo)
syncComboWithSettings(d->m_exclusionCombo, d->m_exclusionSetting);
- foreach (SearchEngine* searchEngine, d->m_searchEngines)
+ for (SearchEngine* searchEngine : qAsConst(d->m_searchEngines))
searchEngine->readSettings(settings);
const int currentSearchEngineIndex = settings->value("currentSearchEngineIndex", 0).toInt();
syncSearchEngineCombo(currentSearchEngineIndex);
}
-void BaseFileFind::openEditor(const SearchResultItem &item)
+void BaseFileFind::openEditor(SearchResult *result, const SearchResultItem &item)
{
- auto result = qobject_cast<SearchResult *>(sender());
- FileFindParameters parameters = result->userData().value<FileFindParameters>();
+ const FileFindParameters parameters = result->userData().value<FileFindParameters>();
IEditor *openedEditor =
d->m_searchEngines[parameters.searchEngineIndex]->openEditor(item, parameters);
if (!openedEditor)
@@ -468,16 +472,14 @@ void BaseFileFind::hideHighlightAll(bool visible)
d->m_currentFindSupport->clearHighlights();
}
-void BaseFileFind::searchAgain()
+void BaseFileFind::searchAgain(SearchResult *search)
{
- auto search = qobject_cast<SearchResult *>(sender());
search->restart();
runSearch(search);
}
-void BaseFileFind::recheckEnabled()
+void BaseFileFind::recheckEnabled(SearchResult *search)
{
- auto search = qobject_cast<SearchResult *>(sender());
if (!search)
return;
search->setSearchAgainEnabled(isEnabled());
@@ -493,7 +495,7 @@ QStringList BaseFileFind::replaceAll(const QString &text,
RefactoringChanges refactoring;
QHash<QString, QList<SearchResultItem> > changes;
- foreach (const SearchResultItem &item, items)
+ for (const SearchResultItem &item : items)
changes[QDir::fromNativeSeparators(item.path.first())].append(item);
// Checking for files without write permissions
@@ -523,7 +525,7 @@ QStringList BaseFileFind::replaceAll(const QString &text,
ChangeSet changeSet;
RefactoringFilePtr file = refactoring.file(fileName);
QSet<QPair<int, int> > processed;
- foreach (const SearchResultItem &item, changeItems) {
+ for (const SearchResultItem &item : changeItems) {
const QPair<int, int> &p = qMakePair(item.mainRange.begin.line,
item.mainRange.begin.column);
if (processed.contains(p))
diff --git a/src/plugins/texteditor/basefilefind.h b/src/plugins/texteditor/basefilefind.h
index 32595b0398..1297e1a2ac 100644
--- a/src/plugins/texteditor/basefilefind.h
+++ b/src/plugins/texteditor/basefilefind.h
@@ -67,6 +67,7 @@ class TEXTEDITOR_EXPORT SearchEngine : public QObject
public:
SearchEngine(QObject *parent = nullptr);
~SearchEngine() override;
+
virtual QString title() const = 0;
virtual QString toolTip() const = 0; // add %1 placeholder where the find flags should be put
virtual QWidget *widget() const = 0;
@@ -132,13 +133,13 @@ signals:
void currentSearchEngineChanged();
private:
- void openEditor(const Core::SearchResultItem &item);
+ void openEditor(Core::SearchResult *result, const Core::SearchResultItem &item);
void doReplace(const QString &txt,
const QList<Core::SearchResultItem> &items,
bool preserveCase);
void hideHighlightAll(bool visible);
- void searchAgain();
- void recheckEnabled();
+ void searchAgain(Core::SearchResult *search);
+ void recheckEnabled(Core::SearchResult *search);
void runNewSearch(const QString &txt, Core::FindFlags findFlags,
Core::SearchResultWindow::SearchMode searchMode);
diff --git a/src/plugins/texteditor/highlighter.cpp b/src/plugins/texteditor/highlighter.cpp
index 857c0f88cc..b21af3644c 100644
--- a/src/plugins/texteditor/highlighter.cpp
+++ b/src/plugins/texteditor/highlighter.cpp
@@ -43,6 +43,10 @@
using namespace TextEditor;
+static const char kDefinitionForMimeType[] = "definitionForMimeType";
+static const char kDefinitionForExtension[] = "definitionForExtension";
+static const char kDefinitionForFilePath[] = "definitionForFilePath";
+
KSyntaxHighlighting::Repository *highlightRepository()
{
static KSyntaxHighlighting::Repository *repository = nullptr;
@@ -107,18 +111,24 @@ Highlighter::Definition Highlighter::definitionForDocument(const TextDocument *d
if (mimeType.isValid())
definition = Highlighter::definitionForMimeType(mimeType.name());
if (!definition.isValid())
- definition = Highlighter::definitionForFileName(document->filePath().fileName());
+ definition = Highlighter::definitionForFilePath(document->filePath());
return definition;
}
Highlighter::Definition Highlighter::definitionForMimeType(const QString &mimeType)
{
+ const Definitions definitions = definitionsForMimeType(mimeType);
+ if (definitions.size() == 1)
+ return definitions.first();
return highlightRepository()->definitionForMimeType(mimeType);
}
-Highlighter::Definition Highlighter::definitionForFileName(const QString &fileName)
+Highlighter::Definition Highlighter::definitionForFilePath(const Utils::FileName &fileName)
{
- return highlightRepository()->definitionForFileName(fileName);
+ const Definitions definitions = definitionsForFileName(fileName);
+ if (definitions.size() == 1)
+ return definitions.first();
+ return highlightRepository()->definitionForFileName(fileName.fileName());
}
Highlighter::Definition Highlighter::definitionForName(const QString &name)
@@ -133,18 +143,88 @@ Highlighter::Definitions Highlighter::definitionsForDocument(const TextDocument
if (mimeType.isValid())
definitions = Highlighter::definitionsForMimeType(mimeType.name());
if (definitions.isEmpty())
- definitions = Highlighter::definitionsForFileName(document->filePath().fileName());
+ definitions = Highlighter::definitionsForFileName(document->filePath());
return definitions;
}
+static Highlighter::Definition definitionForSetting(const QString &settingsKey,
+ const QString &mapKey)
+{
+ QSettings *settings = Core::ICore::settings();
+ settings->beginGroup(Constants::HIGHLIGHTER_SETTINGS_CATEGORY);
+ const QString &definitionName = settings->value(settingsKey).toMap().value(mapKey).toString();
+ settings->endGroup();
+ return Highlighter::definitionForName(definitionName);
+}
+
Highlighter::Definitions Highlighter::definitionsForMimeType(const QString &mimeType)
{
- return highlightRepository()->definitionsForMimeType(mimeType).toList();
+ Definitions definitions = highlightRepository()->definitionsForMimeType(mimeType).toList();
+ if (definitions.size() > 1) {
+ const Definition &rememberedDefinition = definitionForSetting(kDefinitionForMimeType,
+ mimeType);
+ if (rememberedDefinition.isValid() && definitions.contains(rememberedDefinition))
+ definitions = {rememberedDefinition};
+ }
+ return definitions;
+}
+
+Highlighter::Definitions Highlighter::definitionsForFileName(const Utils::FileName &fileName)
+{
+ Definitions definitions
+ = highlightRepository()->definitionsForFileName(fileName.fileName()).toList();
+
+ if (definitions.size() > 1) {
+ const QString &fileExtension = fileName.toFileInfo().completeSuffix();
+ const Definition &rememberedDefinition
+ = fileExtension.isEmpty()
+ ? definitionForSetting(kDefinitionForFilePath,
+ fileName.toFileInfo().canonicalFilePath())
+ : definitionForSetting(kDefinitionForExtension, fileExtension);
+ if (rememberedDefinition.isValid() && definitions.contains(rememberedDefinition))
+ definitions = {rememberedDefinition};
+ }
+
+ return definitions;
+}
+
+void Highlighter::rememberDefintionForDocument(const Highlighter::Definition &definition,
+ const TextDocument *document)
+{
+ if (!definition.isValid())
+ return;
+ const QString &mimeType = document->mimeType();
+ const QString &fileExtension = document->filePath().toFileInfo().completeSuffix();
+ const QString &path = document->filePath().toFileInfo().canonicalFilePath();
+ QSettings *settings = Core::ICore::settings();
+ settings->beginGroup(Constants::HIGHLIGHTER_SETTINGS_CATEGORY);
+ if (!mimeType.isEmpty()) {
+ const QString id(kDefinitionForMimeType);
+ QMap<QString, QVariant> map = settings->value(id).toMap();
+ map.insert(mimeType, definition.name());
+ settings->setValue(id, map);
+ } else if (!fileExtension.isEmpty()) {
+ const QString id(kDefinitionForExtension);
+ QMap<QString, QVariant> map = settings->value(id).toMap();
+ map.insert(fileExtension, definition.name());
+ settings->setValue(id, map);
+ } else if (!path.isEmpty()) {
+ const QString id(kDefinitionForFilePath);
+ QMap<QString, QVariant> map = settings->value(id).toMap();
+ map.insert(document->filePath().toFileInfo().absoluteFilePath(), definition.name());
+ settings->setValue(id, map);
+ }
+ settings->endGroup();
}
-Highlighter::Definitions Highlighter::definitionsForFileName(const QString &fileName)
+void Highlighter::clearDefintionForDocumentCache()
{
- return highlightRepository()->definitionsForFileName(fileName).toList();
+ QSettings *settings = Core::ICore::settings();
+ settings->beginGroup(Constants::HIGHLIGHTER_SETTINGS_CATEGORY);
+ settings->remove(kDefinitionForMimeType);
+ settings->remove(kDefinitionForExtension);
+ settings->remove(kDefinitionForFilePath);
+ settings->endGroup();
}
void Highlighter::addCustomHighlighterPath(const Utils::FileName &path)
diff --git a/src/plugins/texteditor/highlighter.h b/src/plugins/texteditor/highlighter.h
index 776f92faf3..92e7e136c1 100644
--- a/src/plugins/texteditor/highlighter.h
+++ b/src/plugins/texteditor/highlighter.h
@@ -38,6 +38,8 @@ class TextDocument;
class Highlighter : public SyntaxHighlighter, public KSyntaxHighlighting::AbstractHighlighter
{
+ Q_OBJECT
+ Q_INTERFACES(KSyntaxHighlighting::AbstractHighlighter)
public:
using Definition = KSyntaxHighlighting::Definition;
using Definitions = QList<Definition>;
@@ -45,12 +47,16 @@ public:
static Definition definitionForDocument(const TextDocument *document);
static Definition definitionForMimeType(const QString &mimeType);
- static Definition definitionForFileName(const QString &fileName);
+ static Definition definitionForFilePath(const Utils::FileName &fileName);
static Definition definitionForName(const QString &name);
static Definitions definitionsForDocument(const TextDocument *document);
static Definitions definitionsForMimeType(const QString &mimeType);
- static Definitions definitionsForFileName(const QString &fileName);
+ static Definitions definitionsForFileName(const Utils::FileName &fileName);
+
+ static void rememberDefintionForDocument(const Definition &definition,
+ const TextDocument *document);
+ static void clearDefintionForDocumentCache();
static void addCustomHighlighterPath(const Utils::FileName &path);
static void updateDefinitions(std::function<void()> callback = nullptr);
diff --git a/src/plugins/texteditor/highlightersettings.cpp b/src/plugins/texteditor/highlightersettings.cpp
index 76b88b063a..84afbd79de 100644
--- a/src/plugins/texteditor/highlightersettings.cpp
+++ b/src/plugins/texteditor/highlightersettings.cpp
@@ -25,6 +25,8 @@
#include "highlightersettings.h"
+#include "texteditorconstants.h"
+
#include <coreplugin/icore.h>
#include <utils/hostosinfo.h>
#include <utils/synchronousprocess.h>
@@ -97,7 +99,6 @@ namespace {
static const QLatin1String kDefinitionFilesPath("UserDefinitionFilesPath");
static const QLatin1String kIgnoredFilesPatterns("IgnoredFilesPatterns");
-static const QLatin1String kGroupPostfix("HighlighterSettings");
QString groupSpecifier(const QString &postFix, const QString &category)
{
@@ -113,7 +114,7 @@ using namespace Internal;
void HighlighterSettings::toSettings(const QString &category, QSettings *s) const
{
- const QString &group = groupSpecifier(kGroupPostfix, category);
+ const QString &group = groupSpecifier(Constants::HIGHLIGHTER_SETTINGS_CATEGORY, category);
s->beginGroup(group);
s->setValue(kDefinitionFilesPath, m_definitionFilesPath);
s->setValue(kIgnoredFilesPatterns, ignoredFilesPatterns());
@@ -122,7 +123,7 @@ void HighlighterSettings::toSettings(const QString &category, QSettings *s) cons
void HighlighterSettings::fromSettings(const QString &category, QSettings *s)
{
- const QString &group = groupSpecifier(kGroupPostfix, category);
+ const QString &group = groupSpecifier(Constants::HIGHLIGHTER_SETTINGS_CATEGORY, category);
s->beginGroup(group);
m_definitionFilesPath = s->value(kDefinitionFilesPath, QString()).toString();
if (!s->contains(kDefinitionFilesPath))
diff --git a/src/plugins/texteditor/highlightersettingspage.cpp b/src/plugins/texteditor/highlightersettingspage.cpp
index ec9d34ee65..86a1a7fdbf 100644
--- a/src/plugins/texteditor/highlightersettingspage.cpp
+++ b/src/plugins/texteditor/highlightersettingspage.cpp
@@ -112,6 +112,9 @@ QWidget *HighlighterSettingsPage::widget()
label->setText(tr("Update finished"));
});
});
+ connect(m_d->m_page->resetCache, &QPushButton::clicked, []() {
+ Highlighter::clearDefintionForDocumentCache();
+ });
settingsToUI();
}
diff --git a/src/plugins/texteditor/highlightersettingspage.ui b/src/plugins/texteditor/highlightersettingspage.ui
index bcc5d5fe11..fcd4919b12 100644
--- a/src/plugins/texteditor/highlightersettingspage.ui
+++ b/src/plugins/texteditor/highlightersettingspage.ui
@@ -110,6 +110,30 @@
</item>
</layout>
</item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_5">
+ <item>
+ <spacer name="horizontalSpacer_2">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QPushButton" name="resetCache">
+ <property name="text">
+ <string>Reset Remembered Definitions</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
</layout>
</widget>
</item>
diff --git a/src/plugins/texteditor/texteditor.cpp b/src/plugins/texteditor/texteditor.cpp
index 559617ac2d..36abfc01e2 100644
--- a/src/plugins/texteditor/texteditor.cpp
+++ b/src/plugins/texteditor/texteditor.cpp
@@ -613,6 +613,7 @@ public:
void reconfigure();
void updateSyntaxInfoBar(const Highlighter::Definitions &definitions, const QString &fileName);
void configureGenericHighlighter(const KSyntaxHighlighting::Definition &definition);
+ void rememberCurrentSyntaxDefinition();
public:
TextEditorWidget *q;
@@ -3306,6 +3307,11 @@ void TextEditorWidgetPrivate::updateSyntaxInfoBar(const Highlighter::Definitions
this->configureGenericHighlighter(Highlighter::definitionForName(definition));
});
+ info.setCustomButtonInfo(BaseTextEditor::tr("Remember My Choice"), [multiple, this]() {
+ m_document->infoBar()->removeInfo(multiple);
+ rememberCurrentSyntaxDefinition();
+ });
+
infoBar->removeInfo(missing);
infoBar->addInfo(info);
} else {
@@ -3333,6 +3339,16 @@ void TextEditorWidgetPrivate::configureGenericHighlighter(
m_document->setFontSettings(TextEditorSettings::fontSettings());
}
+void TextEditorWidgetPrivate::rememberCurrentSyntaxDefinition()
+{
+ auto highlighter = qobject_cast<Highlighter *>(m_document->syntaxHighlighter());
+ if (!highlighter)
+ return;
+ const Highlighter::Definition &definition = highlighter->definition();
+ if (definition.isValid())
+ Highlighter::rememberDefintionForDocument(definition, m_document.data());
+}
+
bool TextEditorWidget::codeFoldingVisible() const
{
return d->m_codeFoldingVisible;
@@ -8539,7 +8555,7 @@ QString TextEditorWidget::textAt(int from, int to) const
void TextEditorWidget::configureGenericHighlighter()
{
- const Highlighter::Definitions definitions = Highlighter::definitionsForDocument(textDocument());
+ Highlighter::Definitions definitions = Highlighter::definitionsForDocument(textDocument());
d->configureGenericHighlighter(definitions.isEmpty() ? Highlighter::Definition()
: definitions.first());
d->updateSyntaxInfoBar(definitions, textDocument()->filePath().fileName());
diff --git a/src/plugins/texteditor/texteditorconstants.h b/src/plugins/texteditor/texteditorconstants.h
index 949b493457..78c9c1cb71 100644
--- a/src/plugins/texteditor/texteditorconstants.h
+++ b/src/plugins/texteditor/texteditorconstants.h
@@ -214,6 +214,8 @@ const char TEXT_EDITOR_DISPLAY_SETTINGS[] = "D.DisplaySettings";
const char TEXT_EDITOR_HIGHLIGHTER_SETTINGS[] = "E.HighlighterSettings";
const char TEXT_EDITOR_SNIPPETS_SETTINGS[] = "F.SnippetsSettings";
+const char HIGHLIGHTER_SETTINGS_CATEGORY[] = "HighlighterSettings";
+
const char SNIPPET_EDITOR_ID[] = "TextEditor.SnippetEditor";
const char TEXT_SNIPPET_GROUP_ID[] = "Text";
diff --git a/src/plugins/vcsbase/vcsbasediffeditorcontroller.cpp b/src/plugins/vcsbase/vcsbasediffeditorcontroller.cpp
index 6ece9c8b9d..cb41e7e7d2 100644
--- a/src/plugins/vcsbase/vcsbasediffeditorcontroller.cpp
+++ b/src/plugins/vcsbase/vcsbasediffeditorcontroller.cpp
@@ -98,6 +98,7 @@ public:
const QString m_directory;
QString m_startupFile;
QString m_output;
+ QString m_displayName;
QPointer<VcsCommand> m_command;
QPointer<VcsCommandResultProxy> m_commandResultProxy;
QFutureWatcher<QList<FileData>> *m_processWatcher = nullptr;
@@ -251,6 +252,7 @@ void VcsBaseDiffEditorController::runCommand(const QList<QStringList> &args, uns
d->cancelReload();
d->m_command = new VcsCommand(workingDirectory(), d->m_client->processEnvironment());
+ d->m_command->setDisplayName(d->m_displayName);
d->m_command->setCodec(codec ? codec : EditorManager::defaultTextCodec());
d->m_commandResultProxy = new VcsCommandResultProxy(d->m_command.data(), d);
d->m_command->addFlags(flags);
@@ -289,6 +291,11 @@ QString VcsBaseDiffEditorController::startupFile() const
return d->m_startupFile;
}
+void VcsBaseDiffEditorController::setDisplayName(const QString &displayName)
+{
+ d->m_displayName = displayName;
+}
+
} // namespace VcsBase
#include "vcsbasediffeditorcontroller.moc"
diff --git a/src/plugins/vcsbase/vcsbasediffeditorcontroller.h b/src/plugins/vcsbase/vcsbasediffeditorcontroller.h
index eb6e97157f..8b4668dbf0 100644
--- a/src/plugins/vcsbase/vcsbasediffeditorcontroller.h
+++ b/src/plugins/vcsbase/vcsbasediffeditorcontroller.h
@@ -53,6 +53,7 @@ protected:
QString workingDirectory() const;
void setStartupFile(const QString &startupFile);
QString startupFile() const;
+ void setDisplayName(const QString &displayName);
private:
friend class VcsBaseDiffEditorControllerPrivate;