summaryrefslogtreecommitdiff
path: root/src/plugins/cpptools/cppcodecompletion.cpp
diff options
context:
space:
mode:
authorRoberto Raggi <roberto.raggi@nokia.com>2010-11-08 11:29:44 +0100
committerRoberto Raggi <roberto.raggi@nokia.com>2010-11-08 11:29:44 +0100
commit8959778083570f4284e745ddbb36a121338b6d57 (patch)
tree7448f14573d12b161e655652e4e2e1d24ced69d3 /src/plugins/cpptools/cppcodecompletion.cpp
parentbb27ed24bf474b6a6855c68683ade77917f6639a (diff)
downloadqt-creator-8959778083570f4284e745ddbb36a121338b6d57.tar.gz
Fixed regression when completing function templates.
Reviewed-by: Erik Verbruggen
Diffstat (limited to 'src/plugins/cpptools/cppcodecompletion.cpp')
-rw-r--r--src/plugins/cpptools/cppcodecompletion.cpp42
1 files changed, 38 insertions, 4 deletions
diff --git a/src/plugins/cpptools/cppcodecompletion.cpp b/src/plugins/cpptools/cppcodecompletion.cpp
index f9620f5ca1..3f1266ec87 100644
--- a/src/plugins/cpptools/cppcodecompletion.cpp
+++ b/src/plugins/cpptools/cppcodecompletion.cpp
@@ -1133,6 +1133,40 @@ void CppCodeCompletion::globalCompletion(Scope *currentScope)
addMacros(context.thisDocument()->fileName(), context.snapshot());
}
+static Scope *enclosingNonTemplateScope(Symbol *symbol)
+{
+ if (symbol) {
+ if (Scope *scope = symbol->enclosingScope()) {
+ if (Template *templ = scope->asTemplate())
+ return templ->enclosingScope();
+ return scope;
+ }
+ }
+ return 0;
+}
+
+static Function *asFunctionOrTemplateFunctionType(FullySpecifiedType ty)
+{
+ if (Function *funTy = ty->asFunctionType())
+ return funTy;
+ else if (Template *templ = ty->asTemplateType()) {
+ if (Symbol *decl = templ->declaration())
+ return decl->asFunction();
+ }
+ return 0;
+}
+
+static Class *asClassOrTemplateClassType(FullySpecifiedType ty)
+{
+ if (Class *classTy = ty->asClassType())
+ return classTy;
+ else if (Template *templ = ty->asTemplateType()) {
+ if (Symbol *decl = templ->declaration())
+ return decl->asClass();
+ }
+ return 0;
+}
+
bool CppCodeCompletion::completeConstructorOrFunction(const QList<LookupItem> &results,
int endOfExpression, bool toolTipOnly)
{
@@ -1142,10 +1176,10 @@ bool CppCodeCompletion::completeConstructorOrFunction(const QList<LookupItem> &r
foreach (const LookupItem &result, results) {
FullySpecifiedType exprTy = result.type().simplified();
- if (Class *klass = exprTy->asClassType()) {
+ if (Class *klass = asClassOrTemplateClassType(exprTy)) {
const Name *className = klass->name();
if (! className)
- continue; // nothing to do for anonymoous classes.
+ continue; // nothing to do for anonymous classes.
for (unsigned i = 0; i < klass->memberCount(); ++i) {
Symbol *member = klass->memberAt(i);
@@ -1173,11 +1207,11 @@ bool CppCodeCompletion::completeConstructorOrFunction(const QList<LookupItem> &r
foreach (const LookupItem &result, results) {
FullySpecifiedType ty = result.type().simplified();
- if (Function *fun = ty->asFunctionType()) {
+ if (Function *fun = asFunctionOrTemplateFunctionType(ty)) {
if (! fun->name())
continue;
- else if (! functions.isEmpty() && functions.first()->enclosingScope() != fun->enclosingScope())
+ else if (! functions.isEmpty() && enclosingNonTemplateScope(functions.first()) != enclosingNonTemplateScope(fun))
continue; // skip fun, it's an hidden declaration.
bool newOverload = true;