diff --git a/src/plugins/cpptools/cppcodecompletion.cpp b/src/plugins/cpptools/cppcodecompletion.cpp index 8345d5620918bb3931c99a7bb43761d012ce9449..0d580ff0f9d87e005cda0cdbf87eeb7000dade4d 100644 --- a/src/plugins/cpptools/cppcodecompletion.cpp +++ b/src/plugins/cpptools/cppcodecompletion.cpp @@ -696,27 +696,31 @@ int CppCodeCompletion::startCompletion(TextEditor::ITextEditable *editor) bool CppCodeCompletion::completeConstructorOrFunction(const QList<TypeOfExpression::Result> &results) { - ConvertToCompletionItem toCompletionItem(this); - Overview o; - o.setShowReturnTypes(true); - o.setShowArgumentNames(true); - QList<Function *> functions; foreach (const TypeOfExpression::Result &result, results) { FullySpecifiedType exprTy = result.first; if (Class *klass = exprTy->asClassType()) { + Name *className = klass->name(); + if (! className) + continue; // nothing to do for anonymoous classes. + for (unsigned i = 0; i < klass->memberCount(); ++i) { Symbol *member = klass->memberAt(i); - if (! member->type()->isFunctionType()) - continue; - else if (! member->identity()) - continue; - else if (! member->identity()->isEqualTo(klass->identity())) - continue; - if (TextEditor::CompletionItem item = toCompletionItem(member)) { - functions.append(member->type()->asFunctionType()); + Name *memberName = member->name(); + + if (! memberName) + continue; // skip anonymous member. + + else if (memberName->isQualifiedNameId()) + continue; // skip + + if (Function *funTy = member->type()->asFunctionType()) { + if (memberName->isEqualTo(className)) { + // it's a ctor. + functions.append(funTy); + } } } @@ -725,27 +729,38 @@ bool CppCodeCompletion::completeConstructorOrFunction(const QList<TypeOfExpressi } if (functions.isEmpty()) { - QSet<QString> signatures; - foreach (const TypeOfExpression::Result &p, results) { FullySpecifiedType ty = p.first; if (Function *fun = ty->asFunctionType()) { - if (TextEditor::CompletionItem item = toCompletionItem(fun)) { - QString signature; - signature += overview.prettyName(fun->name()); - signature += overview.prettyType(fun->type()); - if (signatures.contains(signature)) - continue; - signatures.insert(signature); - functions.append(fun); + if (! fun->name()) + continue; + else if (! functions.isEmpty() && functions.first()->scope() != fun->scope()) + continue; // skip fun, it's an hidden declaration. + + Name *name = fun->name(); + if (QualifiedNameId *q = fun->name()->asQualifiedNameId()) + name = q->unqualifiedNameId(); + + bool newOverload = true; + + foreach (Function *f, functions) { + if (fun->isEqualTo(f)) { + newOverload = false; + break; + } } + + if (newOverload) + functions.append(fun); } } + } if (! functions.isEmpty()) { + // Recreate if necessary if (!m_functionArgumentWidget) m_functionArgumentWidget = new FunctionArgumentWidget; diff --git a/src/shared/cplusplus/Symbols.cpp b/src/shared/cplusplus/Symbols.cpp index 10b82664c345aeb94648a55049d010e2246fcd72..6bbf31e5b5e6f59ca1d397633e197002b4841907 100644 --- a/src/shared/cplusplus/Symbols.cpp +++ b/src/shared/cplusplus/Symbols.cpp @@ -187,6 +187,11 @@ bool Function::isEqualTo(const Type *other) const const Function *o = other->asFunctionType(); if (! o) return false; + else if (isConst() != o->isConst()) + return false; + else if (isVolatile() != o->isVolatile()) + return false; + Name *l = identity(); Name *r = o->identity(); if (l == r || (l && l->isEqualTo(r))) {