Merge remote-tracking branch 'origin/11.0'

Conflicts:
	src/plugins/clangformat/clangformatutils.cpp

Change-Id: Ide285cc25fca9101843ab9dca01c5a33644aca7f
This commit is contained in:
Eike Ziller
2023-06-14 08:43:08 +02:00
95 changed files with 759 additions and 517 deletions

View File

@@ -7,15 +7,16 @@
#include <coreplugin/icore.h>
#include <cppeditor/cppcodestylepreferences.h>
#include <projectexplorer/editorconfiguration.h>
#include <projectexplorer/project.h>
#include <projectexplorer/projectmanager.h>
#include <texteditor/icodestylepreferences.h>
#include <texteditor/tabsettings.h>
#include <texteditor/texteditorsettings.h>
#include <clang/Tooling/Core/Replacement.h>
#include <utils/algorithm.h>
#include <utils/fileutils.h>
#include <utils/qtcassert.h>
@@ -24,6 +25,8 @@
#include <QDebug>
#include <QTextDocument>
#include <clang/Tooling/Core/Replacement.h>
namespace ClangFormat {
Internal::LlvmFileSystemAdapter llvmFileSystemAdapter = {};
@@ -760,7 +763,7 @@ clang::format::FormatStyle overrideStyle(const Utils::FilePath &fileName)
Utils::FilePath filePath = filePathToCurrentSettings(preferences);
if (!filePath.exists())
return qtcStyle();
return currentQtStyle(preferences);
clang::format::FormatStyle currentSettingsStyle;
currentSettingsStyle.Language = clang::format::FormatStyle::LK_Cpp;
@@ -769,7 +772,7 @@ clang::format::FormatStyle overrideStyle(const Utils::FilePath &fileName)
.toStdString(),
&currentSettingsStyle);
QTC_ASSERT(error.value() == static_cast<int>(clang::format::ParseError::Success),
return qtcStyle());
return currentQtStyle(preferences));
return currentSettingsStyle;
}

View File

@@ -80,7 +80,7 @@ ClangFormatConfigWidget::ClangFormatConfigWidget(TextEditor::ICodeStylePreferenc
: CppCodeStyleWidget(parent), d(new Private)
{
d->project = project;
d->config = std::make_unique<ClangFormatFile>(filePathToCurrentSettings(codeStyle->currentPreferences()));
d->config = std::make_unique<ClangFormatFile>(codeStyle->currentPreferences());
d->fallbackConfig = new QLabel(Tr::tr("Clang-Format Style"));
d->checksScrollArea = new QScrollArea();
@@ -136,7 +136,7 @@ void ClangFormatConfigWidget::slotCodeStyleChanged(
{
if (!codeStyle)
return;
d->config.reset(new ClangFormatFile(filePathToCurrentSettings(codeStyle)));
d->config.reset(new ClangFormatFile(codeStyle));
d->config->setIsReadOnly(codeStyle->isReadOnly());
d->style = d->config->style();

View File

@@ -4,17 +4,23 @@
#include "clangformatfile.h"
#include "clangformatsettings.h"
#include "clangformatutils.h"
#include <cppeditor/cppcodestylepreferences.h>
#include <cppeditor/cppcodestylesettings.h>
#include <projectexplorer/project.h>
#include <texteditor/icodestylepreferences.h>
#include <texteditor/tabsettings.h>
#include <utils/qtcassert.h>
#include <sstream>
using namespace ClangFormat;
ClangFormatFile::ClangFormatFile(Utils::FilePath filePath)
: m_filePath(filePath)
ClangFormatFile::ClangFormatFile(const TextEditor::ICodeStylePreferences *preferences)
: m_filePath(filePathToCurrentSettings(preferences))
{
if (!m_filePath.exists()) {
// create file and folder
@@ -23,7 +29,7 @@ ClangFormatFile::ClangFormatFile(Utils::FilePath filePath)
if (newStyleFile.is_open()) {
newStyleFile.close();
}
resetStyleToQtC();
resetStyleToQtC(preferences);
return;
}
@@ -33,7 +39,7 @@ ClangFormatFile::ClangFormatFile(Utils::FilePath filePath)
.toStdString(),
&m_style);
if (error.value() != static_cast<int>(clang::format::ParseError::Success)) {
resetStyleToQtC();
resetStyleToQtC(preferences);
}
}
@@ -62,9 +68,9 @@ void ClangFormatFile::setIsReadOnly(bool isReadOnly)
m_isReadOnly = isReadOnly;
}
void ClangFormatFile::resetStyleToQtC()
void ClangFormatFile::resetStyleToQtC(const TextEditor::ICodeStylePreferences *preferences)
{
m_style = qtcStyle();
m_style = currentQtStyle(preferences);
saveStyleToFile(m_style, m_filePath);
}
@@ -178,48 +184,7 @@ CppEditor::CppCodeStyleSettings ClangFormatFile::toCppCodeStyleSettings(
void ClangFormatFile::fromCppCodeStyleSettings(const CppEditor::CppCodeStyleSettings &settings)
{
using namespace clang::format;
if (settings.indentAccessSpecifiers)
m_style.AccessModifierOffset = 0;
else
m_style.AccessModifierOffset = -1 * m_style.IndentWidth;
if (settings.indentNamespaceBody || settings.indentNamespaceBraces)
m_style.NamespaceIndentation = FormatStyle::NamespaceIndentationKind::NI_All;
else
m_style.NamespaceIndentation = FormatStyle::NamespaceIndentationKind::NI_None;
if (settings.indentClassBraces || settings.indentEnumBraces || settings.indentBlockBraces
|| settings.indentFunctionBraces)
m_style.BreakBeforeBraces = FormatStyle::BS_Whitesmiths;
else
m_style.BreakBeforeBraces = FormatStyle::BS_Custom;
m_style.IndentCaseLabels = settings.indentSwitchLabels;
#if LLVM_VERSION_MAJOR >= 11
m_style.IndentCaseBlocks = settings.indentBlocksRelativeToSwitchLabels;
#endif
if (settings.extraPaddingForConditionsIfConfusingAlign)
m_style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
else if (settings.alignAssignments)
m_style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
else
m_style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
m_style.DerivePointerAlignment = settings.bindStarToIdentifier || settings.bindStarToTypeName
|| settings.bindStarToLeftSpecifier
|| settings.bindStarToRightSpecifier;
if ((settings.bindStarToIdentifier || settings.bindStarToRightSpecifier)
&& ClangFormatSettings::instance().mode() == ClangFormatSettings::Mode::Formatting)
m_style.PointerAlignment = FormatStyle::PAS_Right;
if ((settings.bindStarToTypeName || settings.bindStarToLeftSpecifier)
&& ClangFormatSettings::instance().mode() == ClangFormatSettings::Mode::Formatting)
m_style.PointerAlignment = FormatStyle::PAS_Left;
::fromCppCodeStyleSettings(m_style, settings);
saveNewFormat();
}
@@ -258,22 +223,6 @@ TextEditor::TabSettings ClangFormatFile::toTabSettings(ProjectExplorer::Project
void ClangFormatFile::fromTabSettings(const TextEditor::TabSettings &settings)
{
using namespace clang::format;
m_style.IndentWidth = settings.m_indentSize;
m_style.TabWidth = settings.m_tabSize;
switch (settings.m_tabPolicy) {
case TextEditor::TabSettings::TabPolicy::MixedTabPolicy:
m_style.UseTab = FormatStyle::UT_ForContinuationAndIndentation;
break;
case TextEditor::TabSettings::TabPolicy::SpacesOnlyTabPolicy:
m_style.UseTab = FormatStyle::UT_Never;
break;
case TextEditor::TabSettings::TabPolicy::TabsOnlyTabPolicy:
m_style.UseTab = FormatStyle::UT_Always;
break;
}
::fromTabSettings(m_style, settings);
saveNewFormat();
}

View File

@@ -9,18 +9,21 @@
namespace CppEditor { class CppCodeStyleSettings; }
namespace ProjectExplorer { class Project; }
namespace TextEditor { class TabSettings; }
namespace TextEditor {
class ICodeStylePreferences;
class TabSettings;
}
namespace ClangFormat {
class ClangFormatFile
{
public:
explicit ClangFormatFile(Utils::FilePath file);
explicit ClangFormatFile(const TextEditor::ICodeStylePreferences *preferences);
clang::format::FormatStyle style();
Utils::FilePath filePath();
void resetStyleToQtC();
void resetStyleToQtC(const TextEditor::ICodeStylePreferences *codeStyle);
void setBasedOnStyle(QString styleName);
void setStyle(clang::format::FormatStyle style);
QString setStyle(QString style);

View File

@@ -205,15 +205,15 @@ void ClangFormatGlobalConfigWidget::initOverrideCheckBox()
connect(m_indentingOrFormatting, &QComboBox::currentIndexChanged,
this, setEnableOverrideCheckBox);
m_overrideDefault->setToolTip(Tr::tr(
"When this option is enabled, ClangFormat will use a\n"
"user-specified configuration from the widget below,\n"
"instead of the project .clang-format file. You can\n"
"customize the formatting options for your code by\n"
"adjusting the settings in the widget. Note that any\n"
"changes made there will only affect the current\n"
"configuration, and will not modify the project\n"
".clang-format file."));
m_overrideDefault->setToolTip("<html>"
+ Tr::tr("When this option is enabled, ClangFormat will use a "
"user-specified configuration from the widget below, "
"instead of the project .clang-format file. You can "
"customize the formatting options for your code by "
"adjusting the settings in the widget. Note that any "
"changes made there will only affect the current "
"configuration, and will not modify the project "
".clang-format file."));
m_overrideDefault->setChecked(getProjectOverriddenSettings(m_project));
setTemporarilyReadOnly();

View File

@@ -7,6 +7,7 @@
#include <coreplugin/icore.h>
#include <cppeditor/cppcodestylepreferences.h>
#include <cppeditor/cppcodestylesettings.h>
#include <texteditor/icodestylepreferences.h>
@@ -185,6 +186,83 @@ clang::format::FormatStyle qtcStyle()
return style;
}
clang::format::FormatStyle currentQtStyle(const TextEditor::ICodeStylePreferences *preferences)
{
clang::format::FormatStyle style = qtcStyle();
if (!preferences)
return style;
fromTabSettings(style, preferences->tabSettings());
if (auto ccpPreferences = dynamic_cast<const CppEditor::CppCodeStylePreferences *>(preferences))
fromCppCodeStyleSettings(style, ccpPreferences->codeStyleSettings());
return style;
}
void fromCppCodeStyleSettings(clang::format::FormatStyle &style,
const CppEditor::CppCodeStyleSettings &settings)
{
using namespace clang::format;
if (settings.indentAccessSpecifiers)
style.AccessModifierOffset = 0;
else
style.AccessModifierOffset = -1 * style.IndentWidth;
if (settings.indentNamespaceBody || settings.indentNamespaceBraces)
style.NamespaceIndentation = FormatStyle::NamespaceIndentationKind::NI_All;
else
style.NamespaceIndentation = FormatStyle::NamespaceIndentationKind::NI_None;
if (settings.indentClassBraces || settings.indentEnumBraces || settings.indentBlockBraces
|| settings.indentFunctionBraces)
style.BreakBeforeBraces = FormatStyle::BS_Whitesmiths;
else
style.BreakBeforeBraces = FormatStyle::BS_Custom;
style.IndentCaseLabels = settings.indentSwitchLabels;
#if LLVM_VERSION_MAJOR >= 11
style.IndentCaseBlocks = settings.indentBlocksRelativeToSwitchLabels;
#endif
if (settings.extraPaddingForConditionsIfConfusingAlign)
style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
else if (settings.alignAssignments)
style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment;
else
style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
style.DerivePointerAlignment = settings.bindStarToIdentifier || settings.bindStarToTypeName
|| settings.bindStarToLeftSpecifier
|| settings.bindStarToRightSpecifier;
if ((settings.bindStarToIdentifier || settings.bindStarToRightSpecifier)
&& ClangFormatSettings::instance().mode() == ClangFormatSettings::Mode::Formatting)
style.PointerAlignment = FormatStyle::PAS_Right;
if ((settings.bindStarToTypeName || settings.bindStarToLeftSpecifier)
&& ClangFormatSettings::instance().mode() == ClangFormatSettings::Mode::Formatting)
style.PointerAlignment = FormatStyle::PAS_Left;
}
void fromTabSettings(clang::format::FormatStyle &style, const TextEditor::TabSettings &settings)
{
using namespace clang::format;
style.IndentWidth = settings.m_indentSize;
style.TabWidth = settings.m_tabSize;
switch (settings.m_tabPolicy) {
case TextEditor::TabSettings::TabPolicy::MixedTabPolicy:
style.UseTab = FormatStyle::UT_ForContinuationAndIndentation;
break;
case TextEditor::TabSettings::TabPolicy::SpacesOnlyTabPolicy:
style.UseTab = FormatStyle::UT_Never;
break;
case TextEditor::TabSettings::TabPolicy::TabsOnlyTabPolicy:
style.UseTab = FormatStyle::UT_Always;
break;
}
}
QString projectUniqueId(ProjectExplorer::Project *project)
{
if (!project)

View File

@@ -14,8 +14,12 @@
#include <fstream>
namespace TextEditor { class ICodeStylePreferences; }
namespace TextEditor {
class ICodeStylePreferences;
class TabSettings;
}
namespace ProjectExplorer { class Project; }
namespace CppEditor { class CppCodeStyleSettings; }
namespace ClangFormat {
QString projectUniqueId(ProjectExplorer::Project *project);
@@ -32,10 +36,15 @@ ClangFormatSettings::Mode getCurrentIndentationOrFormattingSettings(const Utils:
Utils::FilePath configForFile(const Utils::FilePath &fileName);
Utils::FilePath findConfig(const Utils::FilePath &fileName);
void fromTabSettings(clang::format::FormatStyle &style, const TextEditor::TabSettings &settings);
void fromCppCodeStyleSettings(clang::format::FormatStyle &style,
const CppEditor::CppCodeStyleSettings &settings);
bool getProjectOverriddenSettings(const ProjectExplorer::Project *project);
void addQtcStatementMacros(clang::format::FormatStyle &style);
clang::format::FormatStyle qtcStyle();
clang::format::FormatStyle currentQtStyle(const TextEditor::ICodeStylePreferences *codeStyle);
Utils::FilePath filePathToCurrentSettings(const TextEditor::ICodeStylePreferences *codeStyle);
}