diff options
author | Christian Kamm <christian.d.kamm@nokia.com> | 2010-07-16 10:27:15 +0200 |
---|---|---|
committer | Christian Kamm <christian.d.kamm@nokia.com> | 2010-07-16 10:30:14 +0200 |
commit | d292eca5f671c3f6ddac905165359696b357549f (patch) | |
tree | f8f677d108bb4f1b92258617d2ffdbbc5e9ee2ed /src/plugins/cpptools/cppcodeformatter.cpp | |
parent | a457d2eec3117b08d5dd27ec6605a9beab2b49cd (diff) | |
download | qt-creator-d292eca5f671c3f6ddac905165359696b357549f.tar.gz |
C++ indenter: Indent member initializer lists correctly.
Without requiring ',' to be an electric character.
Task-number: QTCREATORBUG-1866
Reviewed-by: Roberto Raggi
Diffstat (limited to 'src/plugins/cpptools/cppcodeformatter.cpp')
-rw-r--r-- | src/plugins/cpptools/cppcodeformatter.cpp | 38 |
1 files changed, 29 insertions, 9 deletions
diff --git a/src/plugins/cpptools/cppcodeformatter.cpp b/src/plugins/cpptools/cppcodeformatter.cpp index a17488ac1d..d24f3d9563 100644 --- a/src/plugins/cpptools/cppcodeformatter.cpp +++ b/src/plugins/cpptools/cppcodeformatter.cpp @@ -161,7 +161,7 @@ void CodeFormatter::recalculateStateAfter(const QTextBlock &block) case T_SEMICOLON: leave(true); break; case T_EQUAL: enter(initializer); break; case T_LBRACE: enter(defun_open); break; - case T_COLON: enter(member_init_open); break; + case T_COLON: enter(member_init_open); enter(member_init); break; case T_OPERATOR: enter(operator_declaration); break; } break; @@ -221,7 +221,24 @@ void CodeFormatter::recalculateStateAfter(const QTextBlock &block) case member_init_open: switch (kind) { case T_LBRACE: turnInto(defun_open); break; - case T_SEMICOLON: leave(); continue; // so we don't break completely if it's a bitfield or ternary + case T_COMMA: enter(member_init); break; + case T_SEMICOLON: leave(); continue; // try to recover + } break; + + case member_init: + switch (kind) { + case T_LPAREN: enter(member_init_paren_open); break; + case T_RPAREN: leave(); break; + case T_LBRACE: + case T_SEMICOLON: leave(); continue; // try to recover + } break; + + case member_init_paren_open: + if (tryExpression()) + break; + switch (kind) { + case T_RPAREN: leave(); continue; + case T_SEMICOLON: leave(); continue; // try to recover } break; case defun_open: @@ -1036,9 +1053,17 @@ void QtStyleCodeFormatter::onEnter(int newState, int *indentDepth, int *savedInd *savedIndentDepth = parentState.savedIndentDepth; if (firstToken) - *indentDepth = tokenPosition + tk.length() + 1; + *indentDepth = tokenPosition; else - *indentDepth = *savedIndentDepth + m_indentSize; + *indentDepth = *savedIndentDepth + m_indentSize - 2; // they'll get another 2 from member_init + break; + + case member_init: + *indentDepth = *savedIndentDepth + 2; // savedIndentDepth is the position of ':' + break; + + case member_init_paren_open: + *indentDepth = *savedIndentDepth + m_indentSize; break; case case_cont: @@ -1184,11 +1209,6 @@ void QtStyleCodeFormatter::adjustIndent(const QList<CPlusPlus::Token> &tokens, i *indentDepth -= 2; } break; - case T_COMMA: - if (topState.type == member_init_open) { - *indentDepth -= 2; - } - break; case T_LBRACE: { if (topState.type == case_cont) { *indentDepth = topState.savedIndentDepth; |