diff options
author | Christian Kandeler <christian.kandeler@qt.io> | 2021-08-30 10:58:08 +0200 |
---|---|---|
committer | Christian Kandeler <christian.kandeler@qt.io> | 2021-09-01 14:53:58 +0000 |
commit | 284817fae6514701902ccdb834c2faa46462f2e8 (patch) | |
tree | 44a8c7d9813dc110b61c4639036366c7696bd7e9 /src/plugins/cpptools/cppqtstyleindenter.cpp | |
parent | 3e1fa0f170d523971d2c3c12da15a6e291f56511 (diff) | |
download | qt-creator-284817fae6514701902ccdb834c2faa46462f2e8.tar.gz |
Merge CppTools into CppEditor
There was no proper separation of responsibilities between these
plugins. In particular, CppTools had lots of editor-related
functionality, so it's not clear why it was separated out in the first
place.
In fact, for a lot of code, it seemed quite arbitrary where it was put
(just one example: switchHeaderSource() was in CppTools, wheras
switchDeclarationDefinition() was in CppEditor).
Merging the plugins will enable us to get rid of various convoluted
pseudo-abstractions that were only introduced to keep up the artificial
separation.
Change-Id: Iafc3bce625b4794f6d4aa03df6cddc7f2d26716a
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
Diffstat (limited to 'src/plugins/cpptools/cppqtstyleindenter.cpp')
-rw-r--r-- | src/plugins/cpptools/cppqtstyleindenter.cpp | 206 |
1 files changed, 0 insertions, 206 deletions
diff --git a/src/plugins/cpptools/cppqtstyleindenter.cpp b/src/plugins/cpptools/cppqtstyleindenter.cpp deleted file mode 100644 index cc3f272c45..0000000000 --- a/src/plugins/cpptools/cppqtstyleindenter.cpp +++ /dev/null @@ -1,206 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 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. -** -****************************************************************************/ - -#include "cppqtstyleindenter.h" - -#include "cppcodeformatter.h" -#include "cpptoolssettings.h" -#include "cppcodestylepreferences.h" - -#include <QChar> -#include <QTextDocument> -#include <QTextBlock> -#include <QTextCursor> - -using namespace CppTools; - -CppQtStyleIndenter::CppQtStyleIndenter(QTextDocument *doc) - : TextEditor::TextIndenter(doc) -{ - // Just for safety. setCodeStylePreferences should be called when the editor the - // indenter belongs to gets initialized. - m_cppCodeStylePreferences = CppToolsSettings::instance()->cppCodeStyle(); -} - -CppQtStyleIndenter::~CppQtStyleIndenter() = default; - -bool CppQtStyleIndenter::isElectricCharacter(const QChar &ch) const -{ - switch (ch.toLatin1()) { - case '{': - case '}': - case ':': - case '#': - case '<': - case '>': - case ';': - return true; - } - return false; -} - -static bool isElectricInLine(const QChar ch, const QString &text) -{ - switch (ch.toLatin1()) { - case ';': - return text.contains(QLatin1String("break")); - case ':': - // switch cases and access declarations should be reindented - if (text.contains(QLatin1String("case")) || text.contains(QLatin1String("default")) - || text.contains(QLatin1String("public")) || text.contains(QLatin1String("private")) - || text.contains(QLatin1String("protected")) || text.contains(QLatin1String("signals")) - || text.contains(QLatin1String("Q_SIGNALS"))) { - return true; - } - - Q_FALLTHROUGH(); - // lines that start with : might have a constructor initializer list - case '<': - case '>': { - // Electric if at line beginning (after space indentation) - for (int i = 0, len = text.count(); i < len; ++i) { - if (!text.at(i).isSpace()) - return text.at(i) == ch; - } - return false; - } - } - - return true; -} - -void CppQtStyleIndenter::indentBlock(const QTextBlock &block, - const QChar &typedChar, - const TextEditor::TabSettings &tabSettings, - int /*cursorPositionInEditor*/) -{ - QtStyleCodeFormatter codeFormatter(tabSettings, codeStyleSettings()); - - codeFormatter.updateStateUntil(block); - if (codeFormatter.isInRawStringLiteral(block)) - return; - int indent; - int padding; - codeFormatter.indentFor(block, &indent, &padding); - - if (isElectricCharacter(typedChar)) { - // : should not be electric for labels - if (!isElectricInLine(typedChar, block.text())) - return; - - // only reindent the current line when typing electric characters if the - // indent is the same it would be if the line were empty - int newlineIndent; - int newlinePadding; - codeFormatter.indentForNewLineAfter(block.previous(), &newlineIndent, &newlinePadding); - if (tabSettings.indentationColumn(block.text()) != newlineIndent + newlinePadding) - return; - } - - tabSettings.indentLine(block, indent + padding, padding); -} - -void CppQtStyleIndenter::indent(const QTextCursor &cursor, - const QChar &typedChar, - const TextEditor::TabSettings &tabSettings, - int /*cursorPositionInEditor*/) -{ - if (cursor.hasSelection()) { - QTextBlock block = m_doc->findBlock(cursor.selectionStart()); - const QTextBlock end = m_doc->findBlock(cursor.selectionEnd()).next(); - - QtStyleCodeFormatter codeFormatter(tabSettings, codeStyleSettings()); - codeFormatter.updateStateUntil(block); - - QTextCursor tc = cursor; - tc.beginEditBlock(); - do { - if (!codeFormatter.isInRawStringLiteral(block)) { - int indent; - int padding; - codeFormatter.indentFor(block, &indent, &padding); - tabSettings.indentLine(block, indent + padding, padding); - } - codeFormatter.updateLineStateChange(block); - block = block.next(); - } while (block.isValid() && block != end); - tc.endEditBlock(); - } else { - indentBlock(cursor.block(), typedChar, tabSettings); - } -} - -void CppQtStyleIndenter::setCodeStylePreferences(TextEditor::ICodeStylePreferences *preferences) -{ - auto cppCodeStylePreferences = qobject_cast<CppCodeStylePreferences *>(preferences); - if (cppCodeStylePreferences) - m_cppCodeStylePreferences = cppCodeStylePreferences; -} - -void CppQtStyleIndenter::invalidateCache() -{ - QtStyleCodeFormatter formatter; - formatter.invalidateCache(m_doc); -} - -int CppQtStyleIndenter::indentFor(const QTextBlock &block, - const TextEditor::TabSettings &tabSettings, - int /*cursorPositionInEditor*/) -{ - QtStyleCodeFormatter codeFormatter(tabSettings, codeStyleSettings()); - - codeFormatter.updateStateUntil(block); - int indent; - int padding; - codeFormatter.indentFor(block, &indent, &padding); - - return indent; -} - -CppCodeStyleSettings CppQtStyleIndenter::codeStyleSettings() const -{ - if (m_cppCodeStylePreferences) - return m_cppCodeStylePreferences->currentCodeStyleSettings(); - return {}; -} - -TextEditor::IndentationForBlock CppQtStyleIndenter::indentationForBlocks( - const QVector<QTextBlock> &blocks, - const TextEditor::TabSettings &tabSettings, - int /*cursorPositionInEditor*/) -{ - QtStyleCodeFormatter codeFormatter(tabSettings, codeStyleSettings()); - - codeFormatter.updateStateUntil(blocks.last()); - - TextEditor::IndentationForBlock ret; - foreach (QTextBlock block, blocks) { - int indent; - int padding; - codeFormatter.indentFor(block, &indent, &padding); - ret.insert(block.blockNumber(), indent); - } - return ret; -} |