From a7e5f80d70a8636b1b54b23123017f65fca1fc83 Mon Sep 17 00:00:00 2001 From: Christian Kamm <christian.d.kamm@nokia.com> Date: Mon, 3 Jan 2011 15:32:28 +0100 Subject: [PATCH] QmlJS indenter: Only auto-reindent if indent was unchanged. This change in how electric characters are handled has gone into the C++ indenter a while ago and works well there. It means Creator is less likely to annoyingly change the indent on lines where the indentation whas changed manually. It is still possible to trigger a reindent manually. Reviewed-by: Erik Verbruggen --- src/libs/qmljs/qmljscodeformatter.cpp | 12 ++++++++++++ src/libs/qmljs/qmljscodeformatter.h | 1 + src/plugins/qmljseditor/qmljsindenter.cpp | 10 +++++++++- 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/libs/qmljs/qmljscodeformatter.cpp b/src/libs/qmljs/qmljscodeformatter.cpp index 5fb4a9ebcf1..6914bb10e74 100644 --- a/src/libs/qmljs/qmljscodeformatter.cpp +++ b/src/libs/qmljs/qmljscodeformatter.cpp @@ -471,6 +471,18 @@ int CodeFormatter::indentFor(const QTextBlock &block) return m_indentDepth; } +int CodeFormatter::indentForNewLineAfter(const QTextBlock &block) +{ + restoreCurrentState(block); + + int lexerState = loadLexerState(block); + m_tokens.clear(); + m_currentLine.clear(); + adjustIndent(m_tokens, lexerState, &m_indentDepth); + + return m_indentDepth; +} + void CodeFormatter::updateStateUntil(const QTextBlock &endBlock) { QStack<State> previousState = initialState(); diff --git a/src/libs/qmljs/qmljscodeformatter.h b/src/libs/qmljs/qmljscodeformatter.h index 30e1bae6f6c..52a4f6ed885 100644 --- a/src/libs/qmljs/qmljscodeformatter.h +++ b/src/libs/qmljs/qmljscodeformatter.h @@ -66,6 +66,7 @@ public: void updateLineStateChange(const QTextBlock &block); int indentFor(const QTextBlock &block); + int indentForNewLineAfter(const QTextBlock &block); void setTabSize(int tabSize); diff --git a/src/plugins/qmljseditor/qmljsindenter.cpp b/src/plugins/qmljseditor/qmljsindenter.cpp index 99bd68a32e1..8dddb7747f5 100644 --- a/src/plugins/qmljseditor/qmljsindenter.cpp +++ b/src/plugins/qmljseditor/qmljsindenter.cpp @@ -66,7 +66,6 @@ void Indenter::indentBlock(QTextDocument *doc, TextEditor::BaseTextEditor *editor) { Q_UNUSED(doc) - Q_UNUSED(typedChar) Q_UNUSED(editor) const TextEditor::TabSettings &ts = editor->tabSettings(); @@ -74,5 +73,14 @@ void Indenter::indentBlock(QTextDocument *doc, codeFormatter.updateStateUntil(block); const int depth = codeFormatter.indentFor(block); + + if (isElectricCharacter(typedChar)) { + // only reindent the current line when typing electric characters if the + // indent is the same it would be if the line were empty + const int newlineIndent = codeFormatter.indentForNewLineAfter(block.previous()); + if (ts.indentationColumn(block.text()) != newlineIndent) + return; + } + ts.indentLine(block, depth); } -- GitLab