diff options
author | Przemyslaw Gorszkowski <pgorszkowski@gmail.com> | 2013-05-22 08:46:09 +0200 |
---|---|---|
committer | Erik Verbruggen <erik.verbruggen@digia.com> | 2013-05-24 11:46:48 +0200 |
commit | a439d12b4877f1e53c6d30f8d700f90d4ed73df0 (patch) | |
tree | 567b87a4ebda642f9d85ecf63390611b2d6ef94c /src/libs/cplusplus/ResolveExpression.cpp | |
parent | 783ec18424289301bdf598e9a19dfb55f0847be9 (diff) | |
download | qt-creator-a439d12b4877f1e53c6d30f8d700f90d4ed73df0.tar.gz |
C++: fix typedefed struct
Fixed:
* replacing dot with arrow
* code completion
Task-number: QTCREATORBUG-7373
Change-Id: I6bd3781e91876567ce6f0d4160373438c756c417
Reviewed-by: Erik Verbruggen <erik.verbruggen@digia.com>
Diffstat (limited to 'src/libs/cplusplus/ResolveExpression.cpp')
-rw-r--r-- | src/libs/cplusplus/ResolveExpression.cpp | 35 |
1 files changed, 18 insertions, 17 deletions
diff --git a/src/libs/cplusplus/ResolveExpression.cpp b/src/libs/cplusplus/ResolveExpression.cpp index 81df5e2351..55e1d69492 100644 --- a/src/libs/cplusplus/ResolveExpression.cpp +++ b/src/libs/cplusplus/ResolveExpression.cpp @@ -946,6 +946,18 @@ private: ClassOrNamespace *_binding; }; +static bool isTypeTypedefed(const FullySpecifiedType &originalTy, + const FullySpecifiedType &typedefedTy) +{ + return ! originalTy.isEqualTo(typedefedTy); +} + +static bool areOriginalAndTypedefedTypePointer(const FullySpecifiedType &originalTy, + const FullySpecifiedType &typedefedTy) +{ + return originalTy->isPointerType() && typedefedTy->isPointerType(); +} + ClassOrNamespace *ResolveExpression::baseExpression(const QList<LookupItem> &baseResults, int accessOp, bool *replacedDotOperator) const @@ -1035,23 +1047,12 @@ ClassOrNamespace *ResolveExpression::baseExpression(const QList<LookupItem> &bas } } else if (accessOp == T_DOT) { if (replacedDotOperator) { - *replacedDotOperator = originalType->isPointerType() || ty->isPointerType(); - // replace . with -> - if (PointerType *ptrTy = originalType->asPointerType()) { - // case when original type is a pointer and - // typedef is for type - // e.g.: - // typedef S SType; - // SType *p; - ty = ptrTy->elementType(); - } - else if (PointerType *ptrTy = ty->asPointerType()) { - // case when original type is a type and - // typedef is for pointer of type - // e.g.: - // typedef S* SPTR; - // SPTR p; - ty = ptrTy->elementType(); + if (! isTypeTypedefed(originalType, ty) + || ! areOriginalAndTypedefedTypePointer(originalType, ty)) { + *replacedDotOperator = originalType->isPointerType() || ty->isPointerType(); + if (PointerType *ptrTy = ty->asPointerType()) { + ty = ptrTy->elementType(); + } } } |