forked from qt-creator/qt-creator
ClangFormat: Make formatting mode a project option
- Added the possibility to set formatting mode for every project separately. The indenter will be switched for a file if the mode changes. Fixes: QTCREATORBUG-28188 Change-Id: I4e7f9841c54f9b6763586c16672a10ca36bf843d Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
This commit is contained in:
committed by
Christian Kandeler
parent
192605f01c
commit
feb72dd084
@@ -7,11 +7,19 @@
|
||||
#include "clangformatutils.h"
|
||||
|
||||
#include <coreplugin/icore.h>
|
||||
|
||||
#include <cppeditor/cppcodestylepreferencesfactory.h>
|
||||
|
||||
#include <extensionsystem/pluginmanager.h>
|
||||
#include <extensionsystem/pluginspec.h>
|
||||
|
||||
#include <utils/genericconstants.h>
|
||||
|
||||
#include <projectexplorer/project.h>
|
||||
#include <projectexplorer/session.h>
|
||||
|
||||
#include <texteditor/tabsettings.h>
|
||||
#include <texteditor/textdocumentlayout.h>
|
||||
#include <utils/genericconstants.h>
|
||||
|
||||
using namespace clang;
|
||||
using namespace format;
|
||||
@@ -101,4 +109,125 @@ bool ClangFormatIndenter::formatWhileTyping() const
|
||||
return ClangFormatSettings::instance().formatWhileTyping() && formatCodeInsteadOfIndent();
|
||||
}
|
||||
|
||||
// ClangFormatIndenterWrapper
|
||||
|
||||
ClangFormatForwardingIndenter::ClangFormatForwardingIndenter(QTextDocument *doc)
|
||||
: TextEditor::Indenter(doc)
|
||||
, m_clangFormatIndenter(std::make_unique<ClangFormatIndenter>(doc))
|
||||
, m_cppIndenter(CppEditor::CppCodeStylePreferencesFactory().createIndenter(doc))
|
||||
{}
|
||||
|
||||
ClangFormatForwardingIndenter::~ClangFormatForwardingIndenter() = default;
|
||||
|
||||
void ClangFormatForwardingIndenter::setFileName(const Utils::FilePath &fileName)
|
||||
{
|
||||
m_fileName = fileName;
|
||||
m_clangFormatIndenter->setFileName(fileName);
|
||||
m_cppIndenter->setFileName(fileName);
|
||||
}
|
||||
|
||||
TextEditor::Indenter *ClangFormatForwardingIndenter::currentIndenter() const
|
||||
{
|
||||
const ProjectExplorer::Project *projectForFile
|
||||
= ProjectExplorer::SessionManager::projectForFile(m_fileName);
|
||||
|
||||
ClangFormatSettings::Mode mode = projectForFile ? static_cast<ClangFormatSettings::Mode>(
|
||||
projectForFile->namedSettings(Constants::MODE_ID).toInt())
|
||||
: ClangFormatSettings::instance().mode();
|
||||
|
||||
if (mode == ClangFormatSettings::Disable)
|
||||
return m_cppIndenter.get();
|
||||
|
||||
return m_clangFormatIndenter.get();
|
||||
}
|
||||
|
||||
bool ClangFormatForwardingIndenter::isElectricCharacter(const QChar &ch) const
|
||||
{
|
||||
return currentIndenter()->isElectricCharacter(ch);
|
||||
}
|
||||
|
||||
void ClangFormatForwardingIndenter::setCodeStylePreferences(
|
||||
TextEditor::ICodeStylePreferences *preferences)
|
||||
{
|
||||
currentIndenter()->setCodeStylePreferences(preferences);
|
||||
}
|
||||
|
||||
void ClangFormatForwardingIndenter::invalidateCache()
|
||||
{
|
||||
currentIndenter()->invalidateCache();
|
||||
}
|
||||
|
||||
int ClangFormatForwardingIndenter::indentFor(const QTextBlock &block,
|
||||
const TextEditor::TabSettings &tabSettings,
|
||||
int cursorPositionInEditor)
|
||||
{
|
||||
return currentIndenter()->indentFor(block, tabSettings, cursorPositionInEditor);
|
||||
}
|
||||
|
||||
int ClangFormatForwardingIndenter::visualIndentFor(const QTextBlock &block,
|
||||
const TextEditor::TabSettings &tabSettings)
|
||||
{
|
||||
return currentIndenter()->visualIndentFor(block, tabSettings);
|
||||
}
|
||||
|
||||
void ClangFormatForwardingIndenter::autoIndent(const QTextCursor &cursor,
|
||||
const TextEditor::TabSettings &tabSettings,
|
||||
int cursorPositionInEditor)
|
||||
{
|
||||
currentIndenter()->autoIndent(cursor, tabSettings, cursorPositionInEditor);
|
||||
}
|
||||
|
||||
Utils::Text::Replacements ClangFormatForwardingIndenter::format(
|
||||
const TextEditor::RangesInLines &rangesInLines)
|
||||
{
|
||||
return currentIndenter()->format(rangesInLines);
|
||||
}
|
||||
|
||||
|
||||
bool ClangFormatForwardingIndenter::formatOnSave() const
|
||||
{
|
||||
return currentIndenter()->formatOnSave();
|
||||
}
|
||||
|
||||
TextEditor::IndentationForBlock ClangFormatForwardingIndenter::indentationForBlocks(
|
||||
const QVector<QTextBlock> &blocks,
|
||||
const TextEditor::TabSettings &tabSettings,
|
||||
int cursorPositionInEditor)
|
||||
{
|
||||
return currentIndenter()->indentationForBlocks(blocks, tabSettings, cursorPositionInEditor);
|
||||
}
|
||||
|
||||
std::optional<TextEditor::TabSettings> ClangFormatForwardingIndenter::tabSettings() const
|
||||
{
|
||||
return currentIndenter()->tabSettings();
|
||||
}
|
||||
|
||||
void ClangFormatForwardingIndenter::indentBlock(const QTextBlock &block,
|
||||
const QChar &typedChar,
|
||||
const TextEditor::TabSettings &tabSettings,
|
||||
int cursorPositionInEditor)
|
||||
{
|
||||
currentIndenter()->indentBlock(block, typedChar, tabSettings, cursorPositionInEditor);
|
||||
}
|
||||
|
||||
void ClangFormatForwardingIndenter::indent(const QTextCursor &cursor,
|
||||
const QChar &typedChar,
|
||||
const TextEditor::TabSettings &tabSettings,
|
||||
int cursorPositionInEditor)
|
||||
{
|
||||
currentIndenter()->indent(cursor, typedChar, tabSettings, cursorPositionInEditor);
|
||||
}
|
||||
|
||||
void ClangFormatForwardingIndenter::reindent(const QTextCursor &cursor,
|
||||
const TextEditor::TabSettings &tabSettings,
|
||||
int cursorPositionInEditor)
|
||||
{
|
||||
currentIndenter()->reindent(cursor, tabSettings, cursorPositionInEditor);
|
||||
}
|
||||
|
||||
std::optional<int> ClangFormatForwardingIndenter::margin() const
|
||||
{
|
||||
return currentIndenter()->margin();
|
||||
}
|
||||
|
||||
} // namespace ClangFormat
|
||||
|
||||
Reference in New Issue
Block a user