From 7c3d1a0158a845005f509fb58f5daf3cffdf3563 Mon Sep 17 00:00:00 2001 From: Roberto Raggi <qtc-committer@nokia.com> Date: Tue, 30 Dec 2008 11:54:42 +0100 Subject: [PATCH] Improved typedef support. --- src/libs/cplusplus/ResolveExpression.cpp | 27 ++++++++++++++---------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/src/libs/cplusplus/ResolveExpression.cpp b/src/libs/cplusplus/ResolveExpression.cpp index a4d1de3afad..8653d7820f6 100644 --- a/src/libs/cplusplus/ResolveExpression.cpp +++ b/src/libs/cplusplus/ResolveExpression.cpp @@ -427,6 +427,7 @@ bool ResolveExpression::visit(UnaryExpressionAST *ast) bool ResolveExpression::visit(QualifiedNameAST *ast) { + SymbolsForDotAccess symbolsForDotAcces; Scope dummy; Name *name = sem.check(ast, &dummy); @@ -435,7 +436,8 @@ bool ResolveExpression::visit(QualifiedNameAST *ast) if (symbol->isTypedef()) { if (NamedType *namedTy = symbol->type()->asNamedType()) { LookupContext symbolContext(symbol, _context); - QList<Symbol *> resolvedClasses = symbolContext.resolveClass(namedTy->name()); + const Result r(namedTy, symbol); + const QList<Symbol *> resolvedClasses = symbolsForDotAcces(r, _context); if (resolvedClasses.count()) { foreach (Symbol *s, resolvedClasses) { addResult(s->type(), s); @@ -535,6 +537,7 @@ bool ResolveExpression::visit(ArrayAccessAST *ast) _results.clear(); const QList<Result> indexResults = operator()(ast->expression); + SymbolsForDotAccess symbolsForDotAcccess; foreach (Result p, baseResults) { FullySpecifiedType ty = p.first; @@ -548,9 +551,8 @@ bool ResolveExpression::visit(ArrayAccessAST *ast) } else if (ArrayType *arrTy = ty->asArrayType()) { addResult(arrTy->elementType(), contextSymbol); } else if (NamedType *namedTy = ty->asNamedType()) { - Name *className = namedTy->name(); - const QList<Scope *> scopes = visibleScopes(p); - const QList<Symbol *> classObjectCandidates = _context.resolveClass(className, scopes); + const QList<Symbol *> classObjectCandidates = + symbolsForDotAcccess(p, _context); foreach (Symbol *classObject, classObjectCandidates) { const QList<Result> overloads = resolveArrayOperator(p, namedTy, @@ -593,6 +595,7 @@ ResolveExpression::resolveMemberExpression(const QList<Result> &baseResults, unsigned accessOp, Name *memberName) const { + SymbolsForDotAccess symbolsForDotAccess; QList<Result> results; if (accessOp == T_ARROW) { @@ -603,9 +606,8 @@ ResolveExpression::resolveMemberExpression(const QList<Result> &baseResults, ty = refTy->elementType(); if (NamedType *namedTy = ty->asNamedType()) { - Name *className = namedTy->name(); - const QList<Scope *> scopes = visibleScopes(p); - const QList<Symbol *> classObjectCandidates = _context.resolveClass(className, scopes); + const QList<Symbol *> classObjectCandidates = + symbolsForDotAccess(namedTy, p, _context); foreach (Symbol *classObject, classObjectCandidates) { const QList<Result> overloads = resolveArrowOperator(p, namedTy, @@ -665,12 +667,15 @@ ResolveExpression::resolveMember(const Result &p, Name *memberName, NamedType *namedTy) const { + SymbolsForDotAccess symbolsForDotAccess; + + const QList<Symbol *> classObjectCandidates = + symbolsForDotAccess(namedTy, p, _context); + QList<Result> results; - Name *className = namedTy->name(); - const QList<Scope *> scopes = visibleScopes(p); - const QList<Symbol *> classObjectCandidates = _context.resolveClass(className, scopes); foreach (Symbol *classObject, classObjectCandidates) { - results += resolveMember(p, memberName, namedTy, classObject->asClass()); + results += resolveMember(p, memberName, namedTy, + classObject->asClass()); } return results; } -- GitLab