diff --git a/src/libs/cplusplus/LookupContext.cpp b/src/libs/cplusplus/LookupContext.cpp index 9c13caea159b7d28d8e44aacdfc7ce7b4c9d9c40..192d389fe23e3dccb8ca70dba132d6089f21b298 100644 --- a/src/libs/cplusplus/LookupContext.cpp +++ b/src/libs/cplusplus/LookupContext.cpp @@ -504,10 +504,29 @@ void LookupContext::expand(Scope *scope, Symbol *LookupContext::canonicalSymbol(Symbol *symbol) { Symbol *canonical = symbol; + Class *canonicalClass = 0; for (; symbol; symbol = symbol->next()) { - if (symbol->name() == canonical->name()) + if (symbol->identifier() == canonical->identifier()) { canonical = symbol; + + if (Class *klass = symbol->asClass()) + canonicalClass = klass; + } + } + + if (canonicalClass) { + Q_ASSERT(canonical != 0); + + if (canonical->isForwardClassDeclaration()) + return canonicalClass; // prefer class declarations when available. + } + + if (canonical && canonical->scope()->isClassScope()) { + Class *enclosingClass = canonical->scope()->owner()->asClass(); + + if (enclosingClass->identifier() == canonical->identifier()) + return enclosingClass; } return canonical; diff --git a/src/plugins/cpptools/cppfindreferences.cpp b/src/plugins/cpptools/cppfindreferences.cpp index a5fd9c7eaa6ecb1f00e3658333ebfaeac3536b7e..375f322625e43b9b15478675d6934f31bba5773f 100644 --- a/src/plugins/cpptools/cppfindreferences.cpp +++ b/src/plugins/cpptools/cppfindreferences.cpp @@ -304,14 +304,22 @@ protected: } } - if (ast->unqualified_name) { - SimpleNameAST *simple_name = ast->unqualified_name->asSimpleName(); + if (NameAST *unqualified_name = ast->unqualified_name) { + unsigned identifier_token = 0; + + if (SimpleNameAST *simple_name = unqualified_name->asSimpleName()) + identifier_token = simple_name->identifier_token; + + else if (DestructorNameAST *dtor_name = unqualified_name->asDestructorName()) + identifier_token = dtor_name->identifier_token; TemplateIdAST *template_id = 0; - if (! simple_name) { - template_id = ast->unqualified_name->asTemplateId(); + if (! identifier_token) { + template_id = unqualified_name->asTemplateId(); if (template_id) { + identifier_token = template_id->identifier_token; + for (TemplateArgumentListAST *template_arguments = template_id->template_arguments; template_arguments; template_arguments = template_arguments->next) { accept(template_arguments->template_argument); @@ -319,14 +327,8 @@ protected: } } - if (simple_name || template_id) { - const unsigned identifier_token = simple_name - ? simple_name->identifier_token - : template_id->identifier_token; - - if (identifier(identifier_token) == _id) - checkExpression(ast->firstToken(), identifier_token); - } + if (identifier_token && identifier(identifier_token) == _id) + checkExpression(ast->firstToken(), identifier_token); } return false;