From f088ba71d55e96cb406468f4a51d1e545474e549 Mon Sep 17 00:00:00 2001
From: Roberto Raggi <roberto.raggi@nokia.com>
Date: Tue, 3 Aug 2010 13:01:24 +0200
Subject: [PATCH] Handle C++ mem-intitializers

---
 src/plugins/cppeditor/cppchecksymbols.cpp | 29 ++++++++++++++++++++---
 src/plugins/cppeditor/cppchecksymbols.h   |  4 +++-
 src/plugins/cppeditor/cpplocalsymbols.cpp |  6 +++++
 3 files changed, 35 insertions(+), 4 deletions(-)

diff --git a/src/plugins/cppeditor/cppchecksymbols.cpp b/src/plugins/cppeditor/cppchecksymbols.cpp
index 52deded323a..27126be286d 100644
--- a/src/plugins/cppeditor/cppchecksymbols.cpp
+++ b/src/plugins/cppeditor/cppchecksymbols.cpp
@@ -425,17 +425,18 @@ void CheckSymbols::checkNamespace(NameAST *name)
     warning(line, column, QCoreApplication::translate("CheckUndefinedSymbols", "Expected a namespace-name"), length);
 }
 
-void CheckSymbols::checkName(NameAST *ast)
+void CheckSymbols::checkName(NameAST *ast, Scope *scope)
 {
     if (ast && ast->name) {
+        if (! scope)
+            scope = findScope(ast);
+
         if (const Identifier *ident = ast->name->identifier()) {
             const QByteArray id = QByteArray::fromRawData(ident->chars(), ident->size());
             if (_potentialTypes.contains(id)) {
-                Scope *scope = findScope(ast);
                 const QList<LookupItem> candidates = _context.lookup(ast->name, scope);
                 addUsage(candidates, ast);
             } else if (_potentialMembers.contains(id)) {
-                Scope *scope = findScope(ast);
                 const QList<LookupItem> candidates = _context.lookup(ast->name, scope);
                 addMemberUsage(candidates, ast);
             }
@@ -545,6 +546,28 @@ void CheckSymbols::endVisit(TemplateDeclarationAST *)
     _templateDeclarationStack.takeFirst();
 }
 
+bool CheckSymbols::visit(MemInitializerAST *ast)
+{
+    if (_functionDefinitionStack.isEmpty())
+        return false;
+
+    if (ast->name) {
+        FunctionDefinitionAST *enclosingFunction = _functionDefinitionStack.back();
+        if (ClassOrNamespace *binding = _context.lookupType(enclosingFunction->symbol)) {
+            foreach (Symbol *s, binding->symbols()) {
+                if (Class *klass = s->asClass()){
+                    checkName(ast->name, klass->members());
+                    break;
+                }
+            }
+        }
+    }
+
+    accept(ast->expression_list);
+
+    return false;
+}
+
 bool CheckSymbols::visit(FunctionDefinitionAST *ast)
 {
     _functionDefinitionStack.append(ast);
diff --git a/src/plugins/cppeditor/cppchecksymbols.h b/src/plugins/cppeditor/cppchecksymbols.h
index d7ebfad155e..8b3418fc458 100644
--- a/src/plugins/cppeditor/cppchecksymbols.h
+++ b/src/plugins/cppeditor/cppchecksymbols.h
@@ -93,7 +93,7 @@ protected:
     bool warning(unsigned line, unsigned column, const QString &text, unsigned length = 0);
     bool warning(AST *ast, const QString &text);
 
-    void checkName(NameAST *ast);
+    void checkName(NameAST *ast, Scope *scope = 0);
     void checkNamespace(NameAST *name);
     void addUsage(ClassOrNamespace *b, NameAST *ast);
     void addUsage(const QList<LookupItem> &candidates, NameAST *ast);
@@ -123,6 +123,8 @@ protected:
     virtual bool visit(FunctionDefinitionAST *ast);
     virtual bool visit(MemberAccessAST *ast);
 
+    virtual bool visit(MemInitializerAST *ast);
+
     unsigned startOfTemplateDeclaration(TemplateDeclarationAST *ast) const;
     Scope *findScope(AST *ast) const;
 
diff --git a/src/plugins/cppeditor/cpplocalsymbols.cpp b/src/plugins/cppeditor/cpplocalsymbols.cpp
index 1f5e9f4300b..fe233d9e01d 100644
--- a/src/plugins/cppeditor/cpplocalsymbols.cpp
+++ b/src/plugins/cppeditor/cpplocalsymbols.cpp
@@ -155,6 +155,12 @@ protected:
         return false;
     }
 
+    virtual bool visit(MemInitializerAST *ast)
+    {
+        accept(ast->expression_list);
+        return false;
+    }
+
     virtual bool visit(TemplateIdAST *ast)
     {
         for (TemplateArgumentListAST *arg = ast->template_argument_list; arg; arg = arg->next)
-- 
GitLab