From 7e3294a8ce580961120e73895844ae9e71a76602 Mon Sep 17 00:00:00 2001
From: Christian Kamm <christian.d.kamm@nokia.com>
Date: Wed, 6 Oct 2010 13:50:04 +0200
Subject: [PATCH] C++ indenter: Don't get confused on 'for (a in b)'.

Reviewed-by: Roberto Raggi
Reviewed-by: Erik Verbruggen
(cherry picked from commit c2d890f65e3d1975022aec4a70a93c53e43f38bc)
---
 src/plugins/cpptools/cppcodeformatter.cpp     |  2 ++
 .../codeformatter/tst_codeformatter.cpp       | 19 +++++++++++++++++++
 2 files changed, 21 insertions(+)

diff --git a/src/plugins/cpptools/cppcodeformatter.cpp b/src/plugins/cpptools/cppcodeformatter.cpp
index 3a7462be9b6..3c13d10f589 100644
--- a/src/plugins/cpptools/cppcodeformatter.cpp
+++ b/src/plugins/cpptools/cppcodeformatter.cpp
@@ -317,12 +317,14 @@ void CodeFormatter::recalculateStateAfter(const QTextBlock &block)
             switch (kind) {
             case T_SEMICOLON:   turnInto(for_statement_condition); break;
             case T_LPAREN:      enter(condition_paren_open); break;
+            case T_RPAREN:      turnInto(for_statement_expression); continue;
             } break;
 
         case for_statement_condition:
             switch (kind) {
             case T_SEMICOLON:   turnInto(for_statement_expression); break;
             case T_LPAREN:      enter(condition_paren_open); break;
+            case T_RPAREN:      turnInto(for_statement_expression); continue;
             } break;
 
         case for_statement_expression:
diff --git a/tests/auto/cplusplus/codeformatter/tst_codeformatter.cpp b/tests/auto/cplusplus/codeformatter/tst_codeformatter.cpp
index 155a28810a4..0b240fa107c 100644
--- a/tests/auto/cplusplus/codeformatter/tst_codeformatter.cpp
+++ b/tests/auto/cplusplus/codeformatter/tst_codeformatter.cpp
@@ -33,6 +33,7 @@ private Q_SLOTS:
     void classAccess();
     void ternary();
     void objcAtDeclarations();
+    void objcCallAndFor();
     void braceList();
     void bug1();
     void bug2();
@@ -666,6 +667,24 @@ void tst_CodeFormatter::objcAtDeclarations()
     checkIndent(data);
 }
 
+void tst_CodeFormatter::objcCallAndFor()
+{
+    QList<Line> data;
+    data << Line("void foo() {")
+         << Line("    NSArray *windows = [NSApp windows];")
+         << Line("    for (NSWindow *window in windows) {")
+         << Line("        NSArray *drawers = [window drawers];")
+         << Line("        for (NSDrawer *drawer in drawers) {")
+         << Line("            NSArray *views = [[drawer contentView] subviews];")
+         << Line("            int x;")
+         << Line("        }")
+         << Line("    }")
+         << Line("}")
+         << Line("int y;")
+         ;
+    checkIndent(data);
+}
+
 void tst_CodeFormatter::switch1()
 {
     QList<Line> data;
-- 
GitLab