summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Schulz <david.schulz@qt.io>2016-08-25 13:25:45 +0200
committerDavid Schulz <david.schulz@qt.io>2016-08-31 05:33:56 +0000
commit89ff2c1db5ee2068cf763ff1789b17b7f2afa118 (patch)
treee09226f489917c0263745f3e54858be6abaa8868
parentb97bc4016f90435fe9e82c3c2855804a34ca97de (diff)
downloadqt-creator-89ff2c1db5ee2068cf763ff1789b17b7f2afa118.tar.gz
Editor: Collect indentation for a list of text blocks
Allows the indenter to reuse code formatter structures. Task-number: QTCREATORBUG-16420 Change-Id: Ie906d7fdcb50798da02ef5b750fb03ae752aadc1 Reviewed-by: Nikolai Kosjar <nikolai.kosjar@qt.io>
-rw-r--r--src/plugins/cpptools/cppqtstyleindenter.cpp18
-rw-r--r--src/plugins/cpptools/cppqtstyleindenter.h2
-rw-r--r--src/plugins/glsleditor/glslindenter.cpp19
-rw-r--r--src/plugins/glsleditor/glslindenter.h2
-rw-r--r--src/plugins/qmljstools/qmljsindenter.cpp16
-rw-r--r--src/plugins/qmljstools/qmljsindenter.h2
-rw-r--r--src/plugins/texteditor/indenter.cpp9
-rw-r--r--src/plugins/texteditor/indenter.h8
-rw-r--r--src/plugins/texteditor/textdocument.cpp44
9 files changed, 101 insertions, 19 deletions
diff --git a/src/plugins/cpptools/cppqtstyleindenter.cpp b/src/plugins/cpptools/cppqtstyleindenter.cpp
index e1596c60c6..8877d5b49c 100644
--- a/src/plugins/cpptools/cppqtstyleindenter.cpp
+++ b/src/plugins/cpptools/cppqtstyleindenter.cpp
@@ -186,3 +186,21 @@ CppCodeStyleSettings CppQtStyleIndenter::codeStyleSettings() const
return m_cppCodeStylePreferences->currentCodeStyleSettings();
return CppCodeStyleSettings();
}
+
+TextEditor::IndentationForBlock
+CppQtStyleIndenter::indentationForBlocks(const QVector<QTextBlock> &blocks,
+ const TextEditor::TabSettings &tabSettings)
+{
+ 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;
+}
diff --git a/src/plugins/cpptools/cppqtstyleindenter.h b/src/plugins/cpptools/cppqtstyleindenter.h
index 35b26d60ac..c633717618 100644
--- a/src/plugins/cpptools/cppqtstyleindenter.h
+++ b/src/plugins/cpptools/cppqtstyleindenter.h
@@ -58,6 +58,8 @@ public:
void setCodeStylePreferences(TextEditor::ICodeStylePreferences *preferences) override;
void invalidateCache(QTextDocument *doc) override;
int indentFor(const QTextBlock &block, const TextEditor::TabSettings &tabSettings) override;
+ TextEditor::IndentationForBlock indentationForBlocks(const QVector<QTextBlock> &blocks,
+ const TextEditor::TabSettings &tabSettings) override;
private:
CppCodeStyleSettings codeStyleSettings() const;
CppCodeStylePreferences *m_cppCodeStylePreferences;
diff --git a/src/plugins/glsleditor/glslindenter.cpp b/src/plugins/glsleditor/glslindenter.cpp
index 33aa847064..3b229f0c90 100644
--- a/src/plugins/glsleditor/glslindenter.cpp
+++ b/src/plugins/glsleditor/glslindenter.cpp
@@ -124,5 +124,24 @@ int GlslIndenter::indentFor(const QTextBlock &block, const TextEditor::TabSettin
return indent;
}
+TextEditor::IndentationForBlock
+GlslIndenter::indentationForBlocks(const QVector<QTextBlock> &blocks,
+ const TextEditor::TabSettings &tabSettings)
+{
+ CppTools::QtStyleCodeFormatter codeFormatter(tabSettings,
+ CppTools::CppToolsSettings::instance()->cppCodeStyle()->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;
+}
+
} // namespace Internal
} // namespace GlslEditor
diff --git a/src/plugins/glsleditor/glslindenter.h b/src/plugins/glsleditor/glslindenter.h
index e52a024b10..42696f0d99 100644
--- a/src/plugins/glsleditor/glslindenter.h
+++ b/src/plugins/glsleditor/glslindenter.h
@@ -48,6 +48,8 @@ public:
const TextEditor::TabSettings &tabSettings) override;
int indentFor(const QTextBlock &block, const TextEditor::TabSettings &tabSettings) override;
+ TextEditor::IndentationForBlock indentationForBlocks(const QVector<QTextBlock> &blocks,
+ const TextEditor::TabSettings &tabSettings) override;
};
} // namespace Internal
diff --git a/src/plugins/qmljstools/qmljsindenter.cpp b/src/plugins/qmljstools/qmljsindenter.cpp
index 71abf832b9..bcbff019b4 100644
--- a/src/plugins/qmljstools/qmljsindenter.cpp
+++ b/src/plugins/qmljstools/qmljsindenter.cpp
@@ -90,3 +90,19 @@ int Indenter::indentFor(const QTextBlock &block,
codeFormatter.updateStateUntil(block);
return codeFormatter.indentFor(block);
}
+
+
+TextEditor::IndentationForBlock
+Indenter::indentationForBlocks(const QVector<QTextBlock> &blocks,
+ const TextEditor::TabSettings &tabSettings)
+{
+ QmlJSTools::CreatorCodeFormatter codeFormatter(tabSettings);
+
+
+ codeFormatter.updateStateUntil(blocks.last());
+
+ TextEditor::IndentationForBlock ret;
+ foreach (QTextBlock block, blocks)
+ ret.insert(block.blockNumber(), codeFormatter.indentFor(block));
+ return ret;
+}
diff --git a/src/plugins/qmljstools/qmljsindenter.h b/src/plugins/qmljstools/qmljsindenter.h
index fb3f30c74f..1c82a1b18c 100644
--- a/src/plugins/qmljstools/qmljsindenter.h
+++ b/src/plugins/qmljstools/qmljsindenter.h
@@ -46,6 +46,8 @@ public:
void invalidateCache(QTextDocument *doc) override;
int indentFor(const QTextBlock &block, const TextEditor::TabSettings &tabSettings) override;
+ TextEditor::IndentationForBlock indentationForBlocks(const QVector<QTextBlock> &blocks,
+ const TextEditor::TabSettings &tabSettings) override;
};
} // Internal
diff --git a/src/plugins/texteditor/indenter.cpp b/src/plugins/texteditor/indenter.cpp
index 29e9f8e2a2..4f8b428a08 100644
--- a/src/plugins/texteditor/indenter.cpp
+++ b/src/plugins/texteditor/indenter.cpp
@@ -118,3 +118,12 @@ int Indenter::indentFor(const QTextBlock &block, const TabSettings &tabSettings)
Q_UNUSED(tabSettings)
return -1;
}
+
+IndentationForBlock Indenter::indentationForBlocks(const QVector<QTextBlock> &blocks,
+ const TabSettings &tabSettings)
+{
+ IndentationForBlock ret;
+ foreach (QTextBlock block, blocks)
+ ret.insert(block.blockNumber(), indentFor(block, tabSettings));
+ return ret;
+}
diff --git a/src/plugins/texteditor/indenter.h b/src/plugins/texteditor/indenter.h
index 08286b33f5..be78ea8541 100644
--- a/src/plugins/texteditor/indenter.h
+++ b/src/plugins/texteditor/indenter.h
@@ -27,6 +27,8 @@
#include "texteditor_global.h"
+#include <QMap>
+
QT_BEGIN_NAMESPACE
class QTextDocument;
class QTextCursor;
@@ -39,6 +41,8 @@ namespace TextEditor {
class ICodeStylePreferences;
class TabSettings;
+using IndentationForBlock = QMap<int, int>;
+
class TEXTEDITOR_EXPORT Indenter
{
public:
@@ -69,6 +73,10 @@ public:
virtual void invalidateCache(QTextDocument *doc);
virtual int indentFor(const QTextBlock &block, const TextEditor::TabSettings &tabSettings);
+
+ // Expects a list of blocks in order of occurrence in the document.
+ virtual IndentationForBlock indentationForBlocks(const QVector<QTextBlock> &blocks,
+ const TextEditor::TabSettings &tabSettings);
};
} // namespace TextEditor
diff --git a/src/plugins/texteditor/textdocument.cpp b/src/plugins/texteditor/textdocument.cpp
index 07dd48ba8e..e3e7354644 100644
--- a/src/plugins/texteditor/textdocument.cpp
+++ b/src/plugins/texteditor/textdocument.cpp
@@ -764,29 +764,35 @@ void TextDocument::cleanWhitespace(QTextCursor &cursor, bool cleanIndentation, b
if (cursor.hasSelection())
end = d->m_document.findBlock(cursor.selectionEnd()-1).next();
+ QVector<QTextBlock> blocks;
while (block.isValid() && block != end) {
+ if (inEntireDocument || block.revision() != documentLayout->lastSaveRevision)
+ blocks.append(block);
+ block = block.next();
+ }
+ if (blocks.isEmpty())
+ return;
+
+ const IndentationForBlock &indentations =
+ d->m_indenter->indentationForBlocks(blocks, d->m_tabSettings);
- if (inEntireDocument || block.revision() != documentLayout->lastSaveRevision) {
-
- QString blockText = block.text();
- d->m_tabSettings.removeTrailingWhitespace(cursor, block);
- const int indent = d->m_indenter->indentFor(block, d->m_tabSettings);
- if (cleanIndentation && !d->m_tabSettings.isIndentationClean(block, indent)) {
- cursor.setPosition(block.position());
- int firstNonSpace = d->m_tabSettings.firstNonSpace(blockText);
- if (firstNonSpace == blockText.length()) {
- cursor.movePosition(QTextCursor::EndOfBlock, QTextCursor::KeepAnchor);
- cursor.removeSelectedText();
- } else {
- int column = d->m_tabSettings.columnAt(blockText, firstNonSpace);
- cursor.movePosition(QTextCursor::NextCharacter, QTextCursor::KeepAnchor, firstNonSpace);
- QString indentationString = d->m_tabSettings.indentationString(0, column, column - indent, block);
- cursor.insertText(indentationString);
- }
+ foreach (block, blocks) {
+ QString blockText = block.text();
+ d->m_tabSettings.removeTrailingWhitespace(cursor, block);
+ const int indent = indentations[block.blockNumber()];
+ if (cleanIndentation && !d->m_tabSettings.isIndentationClean(block, indent)) {
+ cursor.setPosition(block.position());
+ int firstNonSpace = d->m_tabSettings.firstNonSpace(blockText);
+ if (firstNonSpace == blockText.length()) {
+ cursor.movePosition(QTextCursor::EndOfBlock, QTextCursor::KeepAnchor);
+ cursor.removeSelectedText();
+ } else {
+ int column = d->m_tabSettings.columnAt(blockText, firstNonSpace);
+ cursor.movePosition(QTextCursor::NextCharacter, QTextCursor::KeepAnchor, firstNonSpace);
+ QString indentationString = d->m_tabSettings.indentationString(0, column, column - indent, block);
+ cursor.insertText(indentationString);
}
}
-
- block = block.next();
}
}