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