diff --git a/src/plugins/cpptools/cppcodeformatter.cpp b/src/plugins/cpptools/cppcodeformatter.cpp index 4a355f6ffbb98673a1cf4e47607878af193b8eda..7bb38600ace7a8de566db0fd8f2eb714c71ff543 100644 --- a/src/plugins/cpptools/cppcodeformatter.cpp +++ b/src/plugins/cpptools/cppcodeformatter.cpp @@ -1058,6 +1058,14 @@ int QtStyleCodeFormatter::loadLexerState(const QTextBlock &block) const return BaseTextDocumentLayout::lexerState(block); } +void QtStyleCodeFormatter::addContinuationIndent(int *paddingDepth) const +{ + if (*paddingDepth == 0) + *paddingDepth = 2*m_tabSettings.m_indentSize; + else + *paddingDepth += m_tabSettings.m_indentSize; +} + void QtStyleCodeFormatter::onEnter(int newState, int *indentDepth, int *savedIndentDepth, int *paddingDepth, int *savedPaddingDepth) const { const State &parentState = state(); @@ -1094,12 +1102,8 @@ void QtStyleCodeFormatter::onEnter(int newState, int *indentDepth, int *savedInd case template_param: if (!lastToken) *paddingDepth = nextTokenPosition-*indentDepth; - else { - if (*paddingDepth == 0) - *paddingDepth = 2*m_tabSettings.m_indentSize; - else - *paddingDepth += m_tabSettings.m_indentSize; - } + else + addContinuationIndent(paddingDepth); break; case statement_with_condition: @@ -1143,14 +1147,14 @@ void QtStyleCodeFormatter::onEnter(int newState, int *indentDepth, int *savedInd if (!lastToken) *paddingDepth = nextTokenPosition-*indentDepth; else - *paddingDepth += m_tabSettings.m_indentSize; + addContinuationIndent(paddingDepth); break; case ternary_op: if (!lastToken) *paddingDepth = spaceOrNextTokenPosition-*indentDepth; else - *paddingDepth += m_tabSettings.m_indentSize; + addContinuationIndent(paddingDepth); break; case stream_op: @@ -1176,7 +1180,7 @@ void QtStyleCodeFormatter::onEnter(int newState, int *indentDepth, int *savedInd break; case member_init_paren_open: - *paddingDepth += m_tabSettings.m_indentSize; + addContinuationIndent(paddingDepth); break; case case_cont: diff --git a/src/plugins/cpptools/cppcodeformatter.h b/src/plugins/cpptools/cppcodeformatter.h index 21f06135a8b8d0a42100e5ee5aeb455112aa054e..dae19a2e249efc3ebf65a68bd88806a53f98ad05 100644 --- a/src/plugins/cpptools/cppcodeformatter.h +++ b/src/plugins/cpptools/cppcodeformatter.h @@ -278,6 +278,8 @@ protected: static bool shouldClearPaddingOnEnter(int state); private: + void addContinuationIndent(int *paddingDepth) const; + TextEditor::TabSettings m_tabSettings; CppCodeStyleSettings m_styleSettings; }; diff --git a/tests/auto/cplusplus/codeformatter/tst_codeformatter.cpp b/tests/auto/cplusplus/codeformatter/tst_codeformatter.cpp index 3df75d4f37b4bdcaa71988a064c179a440e3a4f3..9dbe5506a714ea9ee00e88a09dac3919d8eaaac0 100644 --- a/tests/auto/cplusplus/codeformatter/tst_codeformatter.cpp +++ b/tests/auto/cplusplus/codeformatter/tst_codeformatter.cpp @@ -61,9 +61,11 @@ private Q_SLOTS: void preprocessorContinuation(); void cStyleComments(); void cppStyleComments(); - void expressionContinuation(); + void expressionContinuation1(); + void expressionContinuation2(); void assignContinuation1(); void assignContinuation2(); + void declarationContinuation(); void classAccess(); void ternary(); void objcAtDeclarations(); @@ -601,7 +603,7 @@ void tst_CodeFormatter::cppStyleComments() checkIndent(data); } -void tst_CodeFormatter::expressionContinuation() +void tst_CodeFormatter::expressionContinuation1() { QList<Line> data; data << Line("void foo() {") @@ -628,9 +630,27 @@ void tst_CodeFormatter::expressionContinuation() << Line(" ~ foo - blah(1)") << Line(" ~ << '?'") << Line(" ~ << \"\\n\";") - << Line(" i += foo(") + << Line("}") + ; + checkIndent(data); +} + +void tst_CodeFormatter::expressionContinuation2() +{ + QList<Line> data; + data << Line("void foo() {") + << Line(" i += abc +") + << Line(" ~ foo(,") << Line(" ~ bar,") - << Line(" ~ 2);") + << Line(" ~ 2") + << Line(" ~ );") + << Line(" i += abc +") + << Line(" ~ foo(,") + << Line(" ~ bar(") + << Line(" ~ bar,") + << Line(" ~ 2") + << Line(" ~ ),") + << Line(" ~ abc);") << Line("}") ; checkIndent(data); @@ -676,6 +696,18 @@ void tst_CodeFormatter::assignContinuation2() checkIndent(data, style); } +void tst_CodeFormatter::declarationContinuation() +{ + QList<Line> data; + data << Line("void foo(") + << Line("~ int a,") + << Line("~ int b);") + << Line("void foo(int a,") + << Line("~ int b);") + ; + checkIndent(data); +} + void tst_CodeFormatter::classAccess() { QList<Line> data;