diff --git a/src/libs/cplusplus/LookupContext.cpp b/src/libs/cplusplus/LookupContext.cpp index abde784b36c03f9425e3dafae10bfbfa69dbcbf6..956ec267e74bbc9e1b3f3229ac3ddb9599adbd79 100644 --- a/src/libs/cplusplus/LookupContext.cpp +++ b/src/libs/cplusplus/LookupContext.cpp @@ -41,7 +41,7 @@ #include <QtDebug> -#define CPLUSPLUS_NO_LAZY_LOOKUP +//#define CPLUSPLUS_NO_LAZY_LOOKUP using namespace CPlusPlus; @@ -229,7 +229,7 @@ QList<Symbol *> LookupContext::lookup(const Name *name, Scope *scope) const } ClassOrNamespace::ClassOrNamespace(CreateBindings *factory, ClassOrNamespace *parent) - : _factory(factory), _parent(parent), _flushing(false) + : _factory(factory), _parent(parent) { } @@ -483,13 +483,12 @@ ClassOrNamespace *ClassOrNamespace::nestedClassOrNamespace(const QByteArray &nam void ClassOrNamespace::flush() { #ifndef CPLUSPLUS_NO_LAZY_LOOKUP - if (! _flushing) { - _flushing = true; + if (! _todo.isEmpty()) { + const QList<Symbol *> todo = _todo; + _todo.clear(); - while (! _todo.isEmpty()) { - Symbol *member = _todo.takeFirst(); + foreach (Symbol *member, todo) _factory->process(member, this); - } } #endif } diff --git a/src/libs/cplusplus/LookupContext.h b/src/libs/cplusplus/LookupContext.h index 0937e86a0b7232041aa01bd83b68e2228edd9aa4..242b353cb7dcf261624d8e7841d5a986bed47194 100644 --- a/src/libs/cplusplus/LookupContext.h +++ b/src/libs/cplusplus/LookupContext.h @@ -92,7 +92,6 @@ private: QHash<QByteArray, ClassOrNamespace *> _classOrNamespaces; QList<Enum *> _enums; QList<Symbol *> _todo; - bool _flushing; friend class CreateBindings; }; diff --git a/src/libs/cplusplus/ResolveExpression.cpp b/src/libs/cplusplus/ResolveExpression.cpp index 1825de4381116093faf2fae30dae4d50c2d4a219..3f1a72eced73956e3f04da3e6d8613c1244148c9 100644 --- a/src/libs/cplusplus/ResolveExpression.cpp +++ b/src/libs/cplusplus/ResolveExpression.cpp @@ -590,7 +590,7 @@ ResolveExpression::resolveBaseExpression(const QList<LookupItem> &baseResults, i if (NamedType *namedTy = ty->asNamedType()) { const Name *arrowAccessOp = control()->operatorNameId(OperatorNameId::ArrowOp); - if (ClassOrNamespace *b = _context.classOrNamespace(namedTy->name(), result.lastVisibleSymbol()->scope())) { + if (ClassOrNamespace *b = _context.classOrNamespace(namedTy->name(), result.lastVisibleSymbol())) { foreach (Symbol *overload, b->lookup(arrowAccessOp)) { if (Function *funTy = overload->type()->asFunctionType()) { FullySpecifiedType f = instantiate(namedTy->name(), funTy); @@ -667,7 +667,7 @@ ResolveExpression::resolveMemberExpression(const QList<LookupItem> &baseResults, results += resolveMember(memberName, klass); else if (NamedType *namedTy = ty->asNamedType()) { - if (ClassOrNamespace *b = _context.classOrNamespace(namedTy->name(), r.lastVisibleSymbol()->scope())) { + if (ClassOrNamespace *b = _context.classOrNamespace(namedTy->name(), r.lastVisibleSymbol())) { foreach (Symbol *c, b->lookup(memberName)) results.append(LookupItem(instantiate(namedTy->name(), c), c)); }