From 034798c0efce5844843f64c158b921020701da3f Mon Sep 17 00:00:00 2001 From: Roberto Raggi <roberto.raggi@nokia.com> Date: Tue, 3 Aug 2010 12:22:16 +0200 Subject: [PATCH] Recognize the members. --- src/plugins/cppeditor/cppchecksymbols.cpp | 26 +++++++++++++++++++---- src/plugins/cppeditor/cppchecksymbols.h | 3 +++ 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/src/plugins/cppeditor/cppchecksymbols.cpp b/src/plugins/cppeditor/cppchecksymbols.cpp index 4ebd7b35d1e..52deded323a 100644 --- a/src/plugins/cppeditor/cppchecksymbols.cpp +++ b/src/plugins/cppeditor/cppchecksymbols.cpp @@ -301,6 +301,8 @@ CheckSymbols::CheckSymbols(Document::Ptr doc, const LookupContext &context) _scopes = collectTypes.scopes(); _flushRequested = false; _flushLine = 0; + + typeOfExpression.init(_doc, _context.snapshot(), _context.bindings()); } CheckSymbols::~CheckSymbols() @@ -381,6 +383,25 @@ bool CheckSymbols::visit(NamedTypeSpecifierAST *) bool CheckSymbols::visit(MemberAccessAST *ast) { accept(ast->base_expression); + if (! ast->member_name) + return false; + + if (const Name *name = ast->member_name->name) { + if (const Identifier *ident = name->identifier()) { + const QByteArray id = QByteArray::fromRawData(ident->chars(), ident->size()); + if (_potentialMembers.contains(id)) { + Scope *scope = findScope(ast); + + const Token start = tokenAt(ast->firstToken()); + const Token end = tokenAt(ast->lastToken() - 1); + const QByteArray expression = _doc->source().mid(start.begin(), end.end() - start.begin()); + + const QList<LookupItem> candidates = typeOfExpression(expression, scope, TypeOfExpression::Preprocess); + addMemberUsage(candidates, ast->member_name); + } + } + } + return false; } @@ -431,10 +452,6 @@ void CheckSymbols::checkMemberName(NameAST *ast) Scope *scope = findScope(ast); const QList<LookupItem> candidates = _context.lookup(ast->name, scope); addMemberUsage(candidates, ast); - } else if (_potentialMembers.contains(id)) { - Scope *scope = findScope(ast); - const QList<LookupItem> candidates = _context.lookup(ast->name, scope); - addMemberUsage(candidates, ast); } } } @@ -647,6 +664,7 @@ void CheckSymbols::addMemberUsage(const QList<LookupItem> &candidates, NameAST * const Use use(line, column, length, Use::Field); addUsage(use); + //Overview oo; //qDebug() << "added use" << oo(ast->name) << line << column << length; } } diff --git a/src/plugins/cppeditor/cppchecksymbols.h b/src/plugins/cppeditor/cppchecksymbols.h index c63e205c5f8..d7ebfad155e 100644 --- a/src/plugins/cppeditor/cppchecksymbols.h +++ b/src/plugins/cppeditor/cppchecksymbols.h @@ -34,6 +34,8 @@ #include <cplusplus/CppDocument.h> #include <cplusplus/LookupContext.h> +#include <cplusplus/TypeOfExpression.h> + #include <ASTVisitor.h> #include <QtCore/QSet> #include <QtCore/QFuture> @@ -129,6 +131,7 @@ protected: private: Document::Ptr _doc; LookupContext _context; + TypeOfExpression typeOfExpression; QString _fileName; QList<Document::DiagnosticMessage> _diagnosticMessages; QSet<QByteArray> _potentialTypes; -- GitLab