diff options
author | Roberto Raggi <qtc-committer@nokia.com> | 2008-12-31 10:57:27 +0100 |
---|---|---|
committer | Roberto Raggi <qtc-committer@nokia.com> | 2008-12-31 10:57:27 +0100 |
commit | f0ac751f4a167f2b2da5a21f8c62394c4486d268 (patch) | |
tree | 20a54d46fdeeab639f07c62d30bb0f3f5476dea7 /src/plugins/cpptools/cppcodecompletion.cpp | |
parent | c7ac64e7de90a95b0249ce1b3c26c7a324812df8 (diff) | |
download | qt-creator-f0ac751f4a167f2b2da5a21f8c62394c4486d268.tar.gz |
Completion for typedef of pointer to struct.
Diffstat (limited to 'src/plugins/cpptools/cppcodecompletion.cpp')
-rw-r--r-- | src/plugins/cpptools/cppcodecompletion.cpp | 38 |
1 files changed, 28 insertions, 10 deletions
diff --git a/src/plugins/cpptools/cppcodecompletion.cpp b/src/plugins/cpptools/cppcodecompletion.cpp index 5ceecf9148..50e5432f2f 100644 --- a/src/plugins/cpptools/cppcodecompletion.cpp +++ b/src/plugins/cpptools/cppcodecompletion.cpp @@ -581,24 +581,36 @@ bool CppCodeCompletion::completeMember(const QList<TypeOfExpression::Result> &re if (results.isEmpty()) return false; - const TypeOfExpression::Result p = results.first(); + TypeOfExpression::Result result = results.first(); QList<Symbol *> classObjectCandidates; if (m_completionOperator == T_ARROW) { - FullySpecifiedType ty = p.first; + FullySpecifiedType ty = result.first; if (ReferenceType *refTy = ty->asReferenceType()) ty = refTy->elementType(); if (NamedType *namedTy = ty->asNamedType()) { + // ### This code is pretty slow. + const QList<Symbol *> candidates = context.resolve(namedTy->name()); + foreach (Symbol *candidate, candidates) { + if (candidate->isTypedef()) { + ty = candidate->type(); + const ResolveExpression::Result r(ty, candidate); + result = r; + break; + } + } + } + + if (NamedType *namedTy = ty->asNamedType()) { ResolveExpression resolveExpression(context); ResolveClass resolveClass; - const QList<Symbol *> candidates = resolveClass(namedTy, p, context); - + const QList<Symbol *> candidates = resolveClass(result, context); foreach (Symbol *classObject, candidates) { const QList<TypeOfExpression::Result> overloads = - resolveExpression.resolveArrowOperator(p, namedTy, + resolveExpression.resolveArrowOperator(result, namedTy, classObject->asClass()); foreach (TypeOfExpression::Result r, overloads) { @@ -615,7 +627,7 @@ bool CppCodeCompletion::completeMember(const QList<TypeOfExpression::Result> &re if (PointerType *ptrTy = ty->asPointerType()) { if (NamedType *namedTy = ptrTy->elementType()->asNamedType()) { const QList<Symbol *> classes = - resolveClass(namedTy, p, context); + resolveClass(namedTy, result, context); foreach (Symbol *c, classes) { if (! classObjectCandidates.contains(c)) @@ -629,17 +641,22 @@ bool CppCodeCompletion::completeMember(const QList<TypeOfExpression::Result> &re if (NamedType *namedTy = ptrTy->elementType()->asNamedType()) { ResolveClass resolveClass; - const QList<Symbol *> classes = resolveClass(namedTy, p, - context); + const QList<Symbol *> classes = resolveClass(namedTy, result, + context); foreach (Symbol *c, classes) { if (! classObjectCandidates.contains(c)) classObjectCandidates.append(c); } + } else if (Class *classTy = ptrTy->elementType()->asClass()) { + // typedef struct { int x } *Ptr; + // Ptr p; + // p-> + classObjectCandidates.append(classTy); } } } else if (m_completionOperator == T_DOT) { - FullySpecifiedType ty = p.first; + FullySpecifiedType ty = result.first; if (ReferenceType *refTy = ty->asReferenceType()) ty = refTy->elementType(); @@ -663,7 +680,8 @@ bool CppCodeCompletion::completeMember(const QList<TypeOfExpression::Result> &re if (namedTy) { ResolveClass resolveClass; - const QList<Symbol *> symbols = resolveClass(namedTy, p, context); + const QList<Symbol *> symbols = resolveClass(namedTy, result, + context); foreach (Symbol *symbol, symbols) { if (classObjectCandidates.contains(symbol)) continue; |