From 2dc221d76d98315ef860835f23391be5125d4244 Mon Sep 17 00:00:00 2001
From: Erik Verbruggen <erik.verbruggen@nokia.com>
Date: Sun, 10 Jan 2010 17:54:59 +0100
Subject: [PATCH] Prefer ObjC classes/protocols when searching for a canonical
 symbol.

---
 src/libs/cplusplus/LookupContext.cpp | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)

diff --git a/src/libs/cplusplus/LookupContext.cpp b/src/libs/cplusplus/LookupContext.cpp
index 9e81af2ac1c..1d8811173b1 100644
--- a/src/libs/cplusplus/LookupContext.cpp
+++ b/src/libs/cplusplus/LookupContext.cpp
@@ -727,6 +727,8 @@ Symbol *LookupContext::canonicalSymbol(Symbol *symbol)
 {
     Symbol *canonical = symbol;
     Class *canonicalClass = 0;
+    ObjCClass *canonicalObjCClass = 0;
+    ObjCProtocol *canonicalObjCProto = 0;
 
     for (; symbol; symbol = symbol->next()) {
         if (symbol->identifier() == canonical->identifier()) {
@@ -734,6 +736,10 @@ Symbol *LookupContext::canonicalSymbol(Symbol *symbol)
 
             if (Class *klass = symbol->asClass())
                 canonicalClass = klass;
+            else if (ObjCClass *clazz = symbol->asObjCClass())
+                canonicalObjCClass = clazz;
+            else if (ObjCProtocol *proto = symbol->asObjCProtocol())
+                canonicalObjCProto = proto;
         }
     }
 
@@ -742,6 +748,16 @@ Symbol *LookupContext::canonicalSymbol(Symbol *symbol)
 
         if (canonical->isForwardClassDeclaration())
             return canonicalClass; // prefer class declarations when available.
+    } else if (canonicalObjCClass) {
+        Q_ASSERT(canonical != 0);
+
+        if (canonical->isObjCForwardClassDeclaration())
+            return canonicalObjCClass;
+    } else if (canonicalObjCProto) {
+        Q_ASSERT(canonical != 0);
+
+        if (canonical->isObjCForwardProtocolDeclaration())
+            return canonicalObjCProto;
     }
 
     if (canonical && canonical->scope()->isClassScope()) {
-- 
GitLab