Expand the template parameters.

This commit is contained in:
Roberto Raggi
2009-12-08 12:38:27 +01:00
parent fef2ad6bba
commit 02c7336795
2 changed files with 15 additions and 5 deletions

View File

@@ -447,6 +447,9 @@ void LookupContext::expandClass(Class *klass,
const QList<Scope *> &visibleScopes, const QList<Scope *> &visibleScopes,
QList<Scope *> *expandedScopes) const 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) { for (unsigned i = 0; i < klass->memberCount(); ++i) {
Symbol *symbol = klass->memberAt(i); Symbol *symbol = klass->memberAt(i);
if (Class *nestedClass = symbol->asClass()) { if (Class *nestedClass = symbol->asClass()) {
@@ -510,6 +513,9 @@ void LookupContext::expandFunction(Function *function,
const QList<Scope *> &visibleScopes, const QList<Scope *> &visibleScopes,
QList<Scope *> *expandedScopes) const QList<Scope *> *expandedScopes) const
{ {
for (TemplateParameters *params = function->templateParameters(); params; params = params->previous())
expand(params->scope(), visibleScopes, expandedScopes);
if (! expandedScopes->contains(function->arguments())) if (! expandedScopes->contains(function->arguments()))
expandedScopes->append(function->arguments()); expandedScopes->append(function->arguments());

View File

@@ -637,11 +637,15 @@ ResolveExpression::resolveBaseExpression(const QList<LookupItem> &baseResults, i
if (NamedType *namedTy = ty->asNamedType()) { if (NamedType *namedTy = ty->asNamedType()) {
const QList<Scope *> visibleScopes = _context.visibleScopes(result); const QList<Scope *> visibleScopes = _context.visibleScopes(result);
const QList<Symbol *> typedefCandidates = _context.resolve(namedTy->name(), visibleScopes); const QList<Symbol *> candidates = _context.resolve(namedTy->name(), visibleScopes);
foreach (Symbol *typedefCandidate, typedefCandidates) { foreach (Symbol *candidate, candidates) {
if (typedefCandidate->isTypedef() && typedefCandidate->type()->isNamedType()) { if (candidate->isTypedef() && candidate->type()->isNamedType()) {
ty = typedefCandidate->type(); ty = candidate->type();
lastVisibleSymbol = typedefCandidate; lastVisibleSymbol = candidate;
break;
} else if (TypenameArgument *arg = candidate->asTypenameArgument()) {
ty = arg->type();
lastVisibleSymbol = candidate;
break; break;
} }
} }