From 02c733679518375caf87d3c05457ade3bc27c5c6 Mon Sep 17 00:00:00 2001 From: Roberto Raggi <roberto.raggi@nokia.com> Date: Tue, 8 Dec 2009 12:38:27 +0100 Subject: [PATCH] Expand the template parameters. --- src/libs/cplusplus/LookupContext.cpp | 6 ++++++ src/libs/cplusplus/ResolveExpression.cpp | 14 +++++++++----- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/libs/cplusplus/LookupContext.cpp b/src/libs/cplusplus/LookupContext.cpp index e28aaa17790..4e4e360fd77 100644 --- a/src/libs/cplusplus/LookupContext.cpp +++ b/src/libs/cplusplus/LookupContext.cpp @@ -447,6 +447,9 @@ void LookupContext::expandClass(Class *klass, const QList<Scope *> &visibleScopes, QList<Scope *> *expandedScopes) const { + for (TemplateParameters *params = klass->templateParameters(); params; params = params->previous()) + expand(params->scope(), visibleScopes, expandedScopes); + for (unsigned i = 0; i < klass->memberCount(); ++i) { Symbol *symbol = klass->memberAt(i); if (Class *nestedClass = symbol->asClass()) { @@ -510,6 +513,9 @@ void LookupContext::expandFunction(Function *function, const QList<Scope *> &visibleScopes, QList<Scope *> *expandedScopes) const { + for (TemplateParameters *params = function->templateParameters(); params; params = params->previous()) + expand(params->scope(), visibleScopes, expandedScopes); + if (! expandedScopes->contains(function->arguments())) expandedScopes->append(function->arguments()); diff --git a/src/libs/cplusplus/ResolveExpression.cpp b/src/libs/cplusplus/ResolveExpression.cpp index ca497beab0f..5d934707ea9 100644 --- a/src/libs/cplusplus/ResolveExpression.cpp +++ b/src/libs/cplusplus/ResolveExpression.cpp @@ -637,11 +637,15 @@ ResolveExpression::resolveBaseExpression(const QList<LookupItem> &baseResults, i if (NamedType *namedTy = ty->asNamedType()) { const QList<Scope *> visibleScopes = _context.visibleScopes(result); - const QList<Symbol *> typedefCandidates = _context.resolve(namedTy->name(), visibleScopes); - foreach (Symbol *typedefCandidate, typedefCandidates) { - if (typedefCandidate->isTypedef() && typedefCandidate->type()->isNamedType()) { - ty = typedefCandidate->type(); - lastVisibleSymbol = typedefCandidate; + const QList<Symbol *> candidates = _context.resolve(namedTy->name(), visibleScopes); + foreach (Symbol *candidate, candidates) { + if (candidate->isTypedef() && candidate->type()->isNamedType()) { + ty = candidate->type(); + lastVisibleSymbol = candidate; + break; + } else if (TypenameArgument *arg = candidate->asTypenameArgument()) { + ty = arg->type(); + lastVisibleSymbol = candidate; break; } } -- GitLab