diff --git a/src/libs/cplusplus/LookupContext.cpp b/src/libs/cplusplus/LookupContext.cpp index 4bfc5c0922d..4b41fee73cf 100644 --- a/src/libs/cplusplus/LookupContext.cpp +++ b/src/libs/cplusplus/LookupContext.cpp @@ -263,6 +263,11 @@ ClassOrNamespace::ClassOrNamespace(CreateBindings *factory, ClassOrNamespace *pa { } +const TemplateNameId *ClassOrNamespace::templateId() const +{ + return _templateId; +} + ClassOrNamespace *ClassOrNamespace::parent() const { return _parent; @@ -316,36 +321,36 @@ QList ClassOrNamespace::lookup(const Name *name) QList ClassOrNamespace::lookup_helper(const Name *name, bool searchInEnclosingScope) { QList result; - if (! name) - return result; - if (const QualifiedNameId *q = name->asQualifiedNameId()) { + if (name) { + if (const QualifiedNameId *q = name->asQualifiedNameId()) { + ClassOrNamespace *binding = this; + + if (q->isGlobal()) + binding = globalNamespace(); + + if (q->nameCount() == 1) + return binding->find(q->unqualifiedNameId()); + + binding = binding->lookupClassOrNamespace(q->nameAt(0)); + + for (unsigned index = 1; binding && index < q->nameCount() - 1; ++index) + binding = binding->findClassOrNamespace(q->nameAt(index)); + + if (binding) + result = binding->find(q->unqualifiedNameId()); + + return result; + } + + QSet processed; ClassOrNamespace *binding = this; - - if (q->isGlobal()) - binding = globalNamespace(); - - if (q->nameCount() == 1) - return binding->find(q->unqualifiedNameId()); - - binding = binding->lookupClassOrNamespace(q->nameAt(0)); - - for (unsigned index = 1; binding && index < q->nameCount() - 1; ++index) - binding = binding->findClassOrNamespace(q->nameAt(index)); - - if (binding) - result = binding->find(q->unqualifiedNameId()); - - return result; + do { + lookup_helper(name, binding, &result, &processed, /*templateId = */ 0); + binding = binding->_parent; + } while (searchInEnclosingScope && binding); } - QSet processed; - ClassOrNamespace *binding = this; - do { - lookup_helper(name, binding, &result, &processed, /*templateId = */ 0); - binding = binding->_parent; - } while (searchInEnclosingScope && binding); - return result; } @@ -404,7 +409,7 @@ void CreateBindings::lookupInScope(const Name *name, Scope *scope, else if (s->name()->isQualifiedNameId()) continue; // skip qualified ids. -#if 0 +#if 1 if (templateId && (s->isDeclaration() || s->isFunction())) { FullySpecifiedType ty = GenTemplateInstance::instantiate(templateId, s, _control); @@ -416,6 +421,7 @@ void CreateBindings::lookupInScope(const Name *name, Scope *scope, qDebug() << "TODO: instantiate:" << oo(s->type(), s->name()) << "using:" << oo(templateId) << oo(ty); +#if 0 if (Declaration *decl = s->asDeclaration()) { qDebug() << "instantiate declaration"; Declaration *d = _control->newDeclaration(0, 0); @@ -430,6 +436,8 @@ void CreateBindings::lookupInScope(const Name *name, Scope *scope, result->append(d); continue; } +#endif + } #endif diff --git a/src/libs/cplusplus/LookupContext.h b/src/libs/cplusplus/LookupContext.h index 489eb691b98..b1f8fc75d08 100644 --- a/src/libs/cplusplus/LookupContext.h +++ b/src/libs/cplusplus/LookupContext.h @@ -48,6 +48,7 @@ class CPLUSPLUS_EXPORT ClassOrNamespace public: ClassOrNamespace(CreateBindings *factory, ClassOrNamespace *parent); + const TemplateNameId *templateId() const; ClassOrNamespace *parent() const; QList usings() const; QList enums() const; diff --git a/src/libs/cplusplus/ResolveExpression.cpp b/src/libs/cplusplus/ResolveExpression.cpp index 7a2fca86ad5..b3012b2096d 100644 --- a/src/libs/cplusplus/ResolveExpression.cpp +++ b/src/libs/cplusplus/ResolveExpression.cpp @@ -603,10 +603,23 @@ ClassOrNamespace *ResolveExpression::baseExpression(const QList &bas const OperatorNameId *arrowOp = control()->operatorNameId(OperatorNameId::ArrowOp); foreach (Symbol *overload, binding->find(arrowOp)) { - FullySpecifiedType overloadTy = overload->type(); + if (Function *funTy = overload->type()->asFunctionType()) { + FullySpecifiedType overloadTy = GenTemplateInstance::instantiate(binding->templateId(), overload, control()); + Function *instantiatedFunction = overloadTy->asFunctionType(); + Q_ASSERT(instantiatedFunction != 0); - if (ClassOrNamespace *retBinding = findClass(overloadTy, overload->scope())) - return retBinding; + FullySpecifiedType retTy = instantiatedFunction->returnType().simplified(); + + if (PointerType *ptrTy = retTy->asPointerType()) { + if (ClassOrNamespace *retBinding = findClass(ptrTy->elementType(), overload->scope())) + return retBinding; + + else if (debug) { + Overview oo; + qDebug() << "no class for:" << oo(ptrTy->elementType()); + } + } + } } } } else if (accessOp == T_DOT) { diff --git a/src/plugins/cpptools/cppcodecompletion.cpp b/src/plugins/cpptools/cppcodecompletion.cpp index 84492fec2b5..e31bbdc8799 100644 --- a/src/plugins/cpptools/cppcodecompletion.cpp +++ b/src/plugins/cpptools/cppcodecompletion.cpp @@ -1095,6 +1095,11 @@ bool CppCodeCompletion::completeMember(const QList &baseResults, return ! m_completions.isEmpty(); } + if (debug) { + Overview oo; + qDebug() << "hmm, got:" << oo(baseResults.first().type()) << typeid(*baseResults.first().type().type()).name(); + } + return false; }