From c6ac773b9a2d6fc5cb581cd56785525d0a352a4a Mon Sep 17 00:00:00 2001 From: Orgad Shaneh Date: Wed, 18 Aug 2021 14:57:19 +0300 Subject: CppTools: Fix indentation of plain strings Raw strings should not be indented, but old-style strings still should. Amends commit ddf7f5f232d70c8598654fdad08af3064f95903f. Fixes: QTCREATORBUG-25817 Change-Id: I7836388efb2d19b8b898c7463c7fa2d2077e80b2 Reviewed-by: Christian Kandeler --- src/plugins/cpptools/cppcodeformatter.cpp | 9 ++++++--- src/plugins/cpptools/cppcodeformatter.h | 6 +++--- src/plugins/cpptools/cppqtstyleindenter.cpp | 4 ++-- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/plugins/cpptools/cppcodeformatter.cpp b/src/plugins/cpptools/cppcodeformatter.cpp index ddd1079c32..639084a3ca 100644 --- a/src/plugins/cpptools/cppcodeformatter.cpp +++ b/src/plugins/cpptools/cppcodeformatter.cpp @@ -559,6 +559,7 @@ void CodeFormatter::recalculateStateAfter(const QTextBlock &block) break; case string_open: + case raw_string_open: if (!m_currentToken.isStringLiteral()) { leave(); continue; @@ -672,14 +673,14 @@ void CodeFormatter::updateLineStateChange(const QTextBlock &block) saveBlockData(&next, BlockData()); } -bool CodeFormatter::isInStringLiteral(const QTextBlock &block) const +bool CodeFormatter::isInRawStringLiteral(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; + return !blockData.m_endState.isEmpty() && blockData.m_endState.top().type == raw_string_open; } CodeFormatter::State CodeFormatter::state(int belowTop) const @@ -825,7 +826,7 @@ bool CodeFormatter::tryExpression(bool alsoExpression) } if (m_currentToken.isStringLiteral()) - newState = string_open; + newState = m_currentToken.kind() == T_RAW_STRING_LITERAL ? raw_string_open : string_open; if (newState != -1) { if (alsoExpression) @@ -1439,6 +1440,7 @@ void QtStyleCodeFormatter::onEnter(int newState, int *indentDepth, int *savedInd break; case string_open: + case raw_string_open: *paddingDepth = tokenPosition - *indentDepth; break; } @@ -1481,6 +1483,7 @@ void QtStyleCodeFormatter::adjustIndent(const Tokens &tokens, int lexerState, in } break; case string_open: + case raw_string_open: if (!tokenAt(0).isStringLiteral()) { *paddingDepth = topState.savedPaddingDepth; topState = previousState; diff --git a/src/plugins/cpptools/cppcodeformatter.h b/src/plugins/cpptools/cppcodeformatter.h index 1164c12eb1..0da8061ccd 100644 --- a/src/plugins/cpptools/cppcodeformatter.h +++ b/src/plugins/cpptools/cppcodeformatter.h @@ -57,7 +57,7 @@ public: // calculates the state change introduced by changing a single line void updateLineStateChange(const QTextBlock &block); - bool isInStringLiteral(const QTextBlock &block) const; + bool isInRawStringLiteral(const QTextBlock &block) const; void indentFor(const QTextBlock &block, int *indent, int *padding); void indentForNewLineAfter(const QTextBlock &block, int *indent, int *padding); @@ -173,8 +173,8 @@ public: // must be public to make Q_GADGET introspection work lambda_instroducer, // when '=', '&' or ',' occurred within '[]' lambda_declarator, // just after ']' when previous state is lambda_introducer lambda_statement, // just after '{' when previous state is lambda_declarator or lambda_declarator_or_expression - string_open - + string_open, // after opening quote of simple string types, like ", L", u8" etc. + raw_string_open // after raw string open delimiter, like R"EOF( }; Q_ENUM(StateType) diff --git a/src/plugins/cpptools/cppqtstyleindenter.cpp b/src/plugins/cpptools/cppqtstyleindenter.cpp index 3eebaf1321..cc3f272c45 100644 --- a/src/plugins/cpptools/cppqtstyleindenter.cpp +++ b/src/plugins/cpptools/cppqtstyleindenter.cpp @@ -99,7 +99,7 @@ void CppQtStyleIndenter::indentBlock(const QTextBlock &block, QtStyleCodeFormatter codeFormatter(tabSettings, codeStyleSettings()); codeFormatter.updateStateUntil(block); - if (codeFormatter.isInStringLiteral(block)) + if (codeFormatter.isInRawStringLiteral(block)) return; int indent; int padding; @@ -137,7 +137,7 @@ void CppQtStyleIndenter::indent(const QTextCursor &cursor, QTextCursor tc = cursor; tc.beginEditBlock(); do { - if (!codeFormatter.isInStringLiteral(block)) { + if (!codeFormatter.isInRawStringLiteral(block)) { int indent; int padding; codeFormatter.indentFor(block, &indent, &padding); -- cgit v1.2.3