diff options
author | Christian Kandeler <christian.kandeler@qt.io> | 2020-08-13 17:58:40 +0200 |
---|---|---|
committer | Christian Kandeler <christian.kandeler@qt.io> | 2020-08-20 08:10:22 +0000 |
commit | ddf7f5f232d70c8598654fdad08af3064f95903f (patch) | |
tree | f3267c7d5d2c34636fdb088cd93bfe75809bb1b9 | |
parent | d6c3846ab1c26ba6a1e6aea7df6e2119d50e9d4b (diff) | |
download | qt-creator-ddf7f5f232d70c8598654fdad08af3064f95903f.tar.gz |
CppTools: Do not indent within string literals
Multi-line strings must be kept as the user wrote them.
Fixes: QTCREATORBUG-20180
Change-Id: I141eff52b55d31215e6f5c6c5a0e026689db877a
Reviewed-by: David Schulz <david.schulz@qt.io>
-rw-r--r-- | src/plugins/cpptools/cppcodeformatter.cpp | 11 | ||||
-rw-r--r-- | src/plugins/cpptools/cppcodeformatter.h | 1 | ||||
-rw-r--r-- | src/plugins/cpptools/cppqtstyleindenter.cpp | 12 |
3 files changed, 19 insertions, 5 deletions
diff --git a/src/plugins/cpptools/cppcodeformatter.cpp b/src/plugins/cpptools/cppcodeformatter.cpp index dc81915227..c8ba07fbe0 100644 --- a/src/plugins/cpptools/cppcodeformatter.cpp +++ b/src/plugins/cpptools/cppcodeformatter.cpp @@ -635,7 +635,6 @@ void CodeFormatter::updateStateUntil(const QTextBlock &endBlock) break; if (loadLexerState(it) == -1) break; - previousState = blockData.m_endState; } @@ -673,6 +672,16 @@ void CodeFormatter::updateLineStateChange(const QTextBlock &block) saveBlockData(&next, BlockData()); } +bool CodeFormatter::isInStringLiteral(const QTextBlock &block) const +{ + if (!block.previous().isValid()) + return false; + BlockData blockData; + if (!loadBlockData(block.previous(), &blockData)) + return false; + return !blockData.m_endState.isEmpty() && blockData.m_endState.top().type == string_open; +} + CodeFormatter::State CodeFormatter::state(int belowTop) const { if (belowTop < m_currentState.size()) diff --git a/src/plugins/cpptools/cppcodeformatter.h b/src/plugins/cpptools/cppcodeformatter.h index b55724dc65..cf3eab98cb 100644 --- a/src/plugins/cpptools/cppcodeformatter.h +++ b/src/plugins/cpptools/cppcodeformatter.h @@ -57,6 +57,7 @@ public: // calculates the state change introduced by changing a single line void updateLineStateChange(const QTextBlock &block); + bool isInStringLiteral(const QTextBlock &block) const; void indentFor(const QTextBlock &block, int *indent, int *padding); void indentForNewLineAfter(const QTextBlock &block, int *indent, int *padding); diff --git a/src/plugins/cpptools/cppqtstyleindenter.cpp b/src/plugins/cpptools/cppqtstyleindenter.cpp index 8979ad62e8..3eebaf1321 100644 --- a/src/plugins/cpptools/cppqtstyleindenter.cpp +++ b/src/plugins/cpptools/cppqtstyleindenter.cpp @@ -99,6 +99,8 @@ void CppQtStyleIndenter::indentBlock(const QTextBlock &block, QtStyleCodeFormatter codeFormatter(tabSettings, codeStyleSettings()); codeFormatter.updateStateUntil(block); + if (codeFormatter.isInStringLiteral(block)) + return; int indent; int padding; codeFormatter.indentFor(block, &indent, &padding); @@ -135,10 +137,12 @@ void CppQtStyleIndenter::indent(const QTextCursor &cursor, QTextCursor tc = cursor; tc.beginEditBlock(); do { - int indent; - int padding; - codeFormatter.indentFor(block, &indent, &padding); - tabSettings.indentLine(block, indent + padding, padding); + if (!codeFormatter.isInStringLiteral(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); |