From d292eca5f671c3f6ddac905165359696b357549f Mon Sep 17 00:00:00 2001 From: Christian Kamm Date: Fri, 16 Jul 2010 10:27:15 +0200 Subject: C++ indenter: Indent member initializer lists correctly. Without requiring ',' to be an electric character. Task-number: QTCREATORBUG-1866 Reviewed-by: Roberto Raggi --- src/plugins/cpptools/cppcodeformatter.cpp | 38 +++++++++++++++++++++++-------- 1 file changed, 29 insertions(+), 9 deletions(-) (limited to 'src/plugins/cpptools/cppcodeformatter.cpp') 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 &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; -- cgit v1.2.1