diff --git a/src/plugins/cppeditor/cppchecksymbols.cpp b/src/plugins/cppeditor/cppchecksymbols.cpp index 4ebd7b35d1e202ea032606a72703d41d44f47bed..52deded323ae5fa240f176823b47383cb88e176a 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 c63e205c5f8505d98f4bc122a3d2bb5c0917d92b..d7ebfad155e806ed0cca12dac058bc3003cb286a 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;