From 7a616d58966c22bbb4af87abf5c19c7267c1570c Mon Sep 17 00:00:00 2001 From: Christian Kamm <christian.d.kamm@nokia.com> Date: Fri, 19 Nov 2010 18:02:14 +0100 Subject: [PATCH] C++ indenter: Align to next token instead of end of current. Task-number: QTCREATORBUG-3136 Reviewed-by: Erik Verbruggen --- src/plugins/cpptools/cppcodeformatter.cpp | 31 ++++++++++--------- .../codeformatter/tst_codeformatter.cpp | 18 +++++++++++ 2 files changed, 34 insertions(+), 15 deletions(-) diff --git a/src/plugins/cpptools/cppcodeformatter.cpp b/src/plugins/cpptools/cppcodeformatter.cpp index 497a2cfae66..f46f469e53f 100644 --- a/src/plugins/cpptools/cppcodeformatter.cpp +++ b/src/plugins/cpptools/cppcodeformatter.cpp @@ -1038,12 +1038,13 @@ void QtStyleCodeFormatter::onEnter(int newState, int *indentDepth, int *savedInd { const State &parentState = state(); const Token &tk = currentToken(); - const int tokenPosition = column(tk.begin()); const bool firstToken = (tokenIndex() == 0); const bool lastToken = (tokenIndex() == tokenCount() - 1); - int nextTokenStart = 0; - if (!lastToken) - nextTokenStart = column(tokenAt(tokenIndex() + 1).begin()); + const int tokenPosition = column(tk.begin()); + const int nextTokenPosition = lastToken ? tokenPosition + tk.length() + : column(tokenAt(tokenIndex() + 1).begin()); + const int spaceOrNextTokenPosition = lastToken ? tokenPosition + tk.length() + 1 + : nextTokenPosition; if (shouldClearPaddingOnEnter(newState)) *paddingDepth = 0; @@ -1067,7 +1068,7 @@ void QtStyleCodeFormatter::onEnter(int newState, int *indentDepth, int *savedInd case template_param: if (!lastToken) - *paddingDepth = tokenPosition-*indentDepth + tk.length(); + *paddingDepth = nextTokenPosition-*indentDepth; else { if (*paddingDepth == 0) *paddingDepth = 2*m_indentSize; @@ -1104,24 +1105,24 @@ void QtStyleCodeFormatter::onEnter(int newState, int *indentDepth, int *savedInd case arglist_open: case condition_paren_open: if (!lastToken) - *paddingDepth = tokenPosition-*indentDepth + 1; + *paddingDepth = nextTokenPosition-*indentDepth; else *paddingDepth += m_indentSize; break; case ternary_op: if (!lastToken) - *paddingDepth = tokenPosition-*indentDepth + tk.length() + 1; + *paddingDepth = spaceOrNextTokenPosition-*indentDepth; else *paddingDepth += m_indentSize; break; case stream_op: - *paddingDepth = tokenPosition-*indentDepth + tk.length() + 1; + *paddingDepth = spaceOrNextTokenPosition-*indentDepth; break; case stream_op_cont: if (firstToken) - *savedPaddingDepth = *paddingDepth = tokenPosition-*indentDepth + tk.length() + 1; + *savedPaddingDepth = *paddingDepth = spaceOrNextTokenPosition-*indentDepth; break; case member_init_open: @@ -1159,7 +1160,7 @@ void QtStyleCodeFormatter::onEnter(int newState, int *indentDepth, int *savedInd *indentDepth += m_indentSize; if (followedByData) { - *paddingDepth = column(tokenAt(tokenIndex() + 1).begin()) - *indentDepth; + *paddingDepth = nextTokenPosition-*indentDepth; } break; } @@ -1188,7 +1189,7 @@ void QtStyleCodeFormatter::onEnter(int newState, int *indentDepth, int *savedInd if (!lastToken) { if (parentState.type == initializer) *savedPaddingDepth = tokenPosition-*indentDepth; - *paddingDepth = nextTokenStart-*indentDepth; + *paddingDepth = nextTokenPosition-*indentDepth; } else { // avoid existing continuation indents if (parentState.type == initializer) @@ -1212,10 +1213,10 @@ void QtStyleCodeFormatter::onEnter(int newState, int *indentDepth, int *savedInd *savedPaddingDepth = *paddingDepth; // fixed extra indent when continuing 'if (', but not for 'else if (' - if (tokenPosition <= *indentDepth + m_indentSize) + if (nextTokenPosition-*indentDepth <= m_indentSize) *paddingDepth = 2*m_indentSize; else - *paddingDepth = tokenPosition-*indentDepth + 1; + *paddingDepth = nextTokenPosition-*indentDepth; break; case substatement: @@ -1235,11 +1236,11 @@ void QtStyleCodeFormatter::onEnter(int newState, int *indentDepth, int *savedInd } break; case for_statement_paren_open: - *paddingDepth = tokenPosition + 1 - *indentDepth; + *paddingDepth = nextTokenPosition - *indentDepth; break; case multiline_comment_start: - *indentDepth = tokenPosition + 2; + *indentDepth = tokenPosition + 2; // nextTokenPosition won't work break; case multiline_comment_cont: diff --git a/tests/auto/cplusplus/codeformatter/tst_codeformatter.cpp b/tests/auto/cplusplus/codeformatter/tst_codeformatter.cpp index 3eb1f2a7480..6c0dd5eff32 100644 --- a/tests/auto/cplusplus/codeformatter/tst_codeformatter.cpp +++ b/tests/auto/cplusplus/codeformatter/tst_codeformatter.cpp @@ -56,6 +56,7 @@ private Q_SLOTS: void cpp0xFor(); void gnuStyleSwitch(); void whitesmithsStyleSwitch(); + void indentToNextToken(); }; struct Line { @@ -1098,6 +1099,23 @@ void tst_CodeFormatter::whitesmithsStyleSwitch() checkIndent(data, 2); } +void tst_CodeFormatter::indentToNextToken() +{ + QList<Line> data; + data << Line("void foo( int i,") + << Line("~ int j) {") + << Line(" a << foo + ") + << Line(" ~ bar;") + << Line(" if (a &&") + << Line(" ~ b) {") + << Line(" foo; }") + << Line(" if ( a &&") + << Line(" ~ b) {") + << Line(" foo; }") + ; + checkIndent(data); +} + QTEST_APPLESS_MAIN(tst_CodeFormatter) #include "tst_codeformatter.moc" -- GitLab