diff --git a/src/plugins/cpptools/cppcodecompletion.cpp b/src/plugins/cpptools/cppcodecompletion.cpp index bc1d1d4ad724dda56c979ba264e018c19044c4ec..ada7f48ab77396daabe653ec96ed41eaa4cad3f1 100644 --- a/src/plugins/cpptools/cppcodecompletion.cpp +++ b/src/plugins/cpptools/cppcodecompletion.cpp @@ -988,10 +988,7 @@ bool CppCodeCompletion::completeMember(const QList<TypeOfExpression::Result> &re QList<Symbol *> classObjectCandidates; if (m_completionOperator == T_ARROW) { - FullySpecifiedType ty = result.first; - - if (ReferenceType *refTy = ty->asReferenceType()) - ty = refTy->elementType(); + FullySpecifiedType ty = result.first.simplified(); if (Class *classTy = ty->asClassType()) { Symbol *symbol = result.second; @@ -1026,10 +1023,7 @@ bool CppCodeCompletion::completeMember(const QList<TypeOfExpression::Result> &re if (! funTy) continue; - ty = funTy->returnType(); - - if (ReferenceType *refTy = ty->asReferenceType()) - ty = refTy->elementType(); + ty = funTy->returnType().simplified(); if (PointerType *ptrTy = ty->asPointerType()) { if (NamedType *namedTy = ptrTy->elementType()->asNamedType()) { @@ -1063,19 +1057,13 @@ bool CppCodeCompletion::completeMember(const QList<TypeOfExpression::Result> &re } } } else if (m_completionOperator == T_DOT) { - FullySpecifiedType ty = result.first; - - if (ReferenceType *refTy = ty->asReferenceType()) - ty = refTy->elementType(); + FullySpecifiedType ty = result.first.simplified(); NamedType *namedTy = 0; if (ArrayType *arrayTy = ty->asArrayType()) { // Replace . with [0]. when `ty' is an array type. - FullySpecifiedType elementTy = arrayTy->elementType(); - - if (ReferenceType *refTy = elementTy->asReferenceType()) - elementTy = refTy->elementType(); + FullySpecifiedType elementTy = arrayTy->elementType().simplified(); if (elementTy->isNamedType() || elementTy->isPointerType()) { ty = elementTy; @@ -1322,9 +1310,8 @@ bool CppCodeCompletion::completeQtMethod(const QList<TypeOfExpression::Result> & QSet<QString> signatures; foreach (const TypeOfExpression::Result &p, results) { - FullySpecifiedType ty = p.first; - if (ReferenceType *refTy = ty->asReferenceType()) - ty = refTy->elementType(); + FullySpecifiedType ty = p.first.simplified(); + if (PointerType *ptrTy = ty->asPointerType()) ty = ptrTy->elementType(); else diff --git a/src/shared/cplusplus/FullySpecifiedType.cpp b/src/shared/cplusplus/FullySpecifiedType.cpp index 410541ac0cfef67b2e9f846fe3764c9ef95cc8e7..58711ac8a96b3b4ab8b10c8f9f652132bf085e1f 100644 --- a/src/shared/cplusplus/FullySpecifiedType.cpp +++ b/src/shared/cplusplus/FullySpecifiedType.cpp @@ -201,4 +201,12 @@ bool FullySpecifiedType::operator < (const FullySpecifiedType &other) const return _type < other._type; } +FullySpecifiedType FullySpecifiedType::simplified() const +{ + if (const ReferenceType *refTy = type()->asReferenceType()) + return refTy->elementType().simplified(); + + return *this; +} + CPLUSPLUS_END_NAMESPACE diff --git a/src/shared/cplusplus/FullySpecifiedType.h b/src/shared/cplusplus/FullySpecifiedType.h index 4cd4db797124bccd650469ce1482fbee3d6667e1..b9a1c3fa3976dd99cea744ffa831f3fb0e96ac4b 100644 --- a/src/shared/cplusplus/FullySpecifiedType.h +++ b/src/shared/cplusplus/FullySpecifiedType.h @@ -119,6 +119,8 @@ public: bool operator != (const FullySpecifiedType &other) const; bool operator < (const FullySpecifiedType &other) const; + FullySpecifiedType simplified() const; + private: Type *_type; struct Flags {