diff options
| author | Roberto Raggi <[email protected]> | 2008-12-29 11:53:40 +0100 |
|---|---|---|
| committer | Roberto Raggi <[email protected]> | 2008-12-29 11:53:40 +0100 |
| commit | a985b59d402b189b90f5c15d291bc4fecd727d56 (patch) | |
| tree | a5e783d3b2989a311e4fe335372d0dae1397db67 /src/libs/cplusplus | |
| parent | 98cc3ec6c9ef0c1b47631c6d3a3ff8035e080249 (diff) | |
Initial support for typedefs.
Diffstat (limited to 'src/libs/cplusplus')
| -rw-r--r-- | src/libs/cplusplus/ResolveExpression.cpp | 66 | ||||
| -rw-r--r-- | src/libs/cplusplus/ResolveExpression.h | 14 |
2 files changed, 80 insertions, 0 deletions
diff --git a/src/libs/cplusplus/ResolveExpression.cpp b/src/libs/cplusplus/ResolveExpression.cpp index 7ce0e42c69d..1f4dc9c51af 100644 --- a/src/libs/cplusplus/ResolveExpression.cpp +++ b/src/libs/cplusplus/ResolveExpression.cpp @@ -792,3 +792,69 @@ bool ResolveExpression::visit(PostIncrDecrAST *) { return false; } + +//////////////////////////////////////////////////////////////////////////////// +QList<Symbol *> SymbolsForDotAccess::operator()(NamedType *namedTy, + ResolveExpression::Result p, + const LookupContext &context) +{ + QList<Symbol *> resolvedSymbols; + + if (_blackList.contains(p)) + return resolvedSymbols; + + _blackList.append(p); + + const QList<Symbol *> candidates = + context.resolve(namedTy->name(), context.visibleScopes(p)); + + foreach (Symbol *candidate, candidates) { + if (Class *klass = candidate->asClass()) { + if (resolvedSymbols.contains(klass)) + continue; // we already know about `klass' + resolvedSymbols.append(klass); + } else if (candidate->isTypedef()) { + if (Declaration *decl = candidate->asDeclaration()) { + if (Class *asClass = decl->type()->asClass()) { + // typedef struct { } Point; + // Point pt; + // pt. + resolvedSymbols.append(asClass); + } else { + // typedef Point Boh; + // Boh b; + // b. + const ResolveExpression::Result r(decl->type(), decl); + resolvedSymbols += operator()(r, context); + } + } + } else if (Declaration *decl = candidate->asDeclaration()) { + if (Function *funTy = decl->type()->asFunction()) { + // QString foo("ciao"); + // foo. + if (funTy->scope()->isBlockScope() || funTy->scope()->isNamespaceScope()) { + const ResolveExpression::Result r(funTy->returnType(), decl); + resolvedSymbols += operator()(r, context); + } + } + } + } + + return resolvedSymbols; +} + +QList<Symbol *> SymbolsForDotAccess::operator()(ResolveExpression::Result p, + const LookupContext &context) +{ + FullySpecifiedType ty = p.first; + + if (NamedType *namedTy = ty->asNamedType()) { + return operator()(namedTy, p, context); + } else if (ReferenceType *refTy = ty->asReferenceType()) { + const ResolveExpression::Result e(refTy->elementType(), p.second); + return operator()(e, context); + } + + return QList<Symbol *>(); +} + diff --git a/src/libs/cplusplus/ResolveExpression.h b/src/libs/cplusplus/ResolveExpression.h index ac4a675b459..35a32c84655 100644 --- a/src/libs/cplusplus/ResolveExpression.h +++ b/src/libs/cplusplus/ResolveExpression.h @@ -128,6 +128,20 @@ private: QList<Result> _results; }; +class CPLUSPLUS_EXPORT SymbolsForDotAccess +{ + QList<ResolveExpression::Result> _blackList; + +public: + QList<Symbol *> operator()(NamedType *namedTy, + ResolveExpression::Result p, + const LookupContext &context); + + QList<Symbol *> operator()(ResolveExpression::Result p, + const LookupContext &context); +}; + + } // end of namespace CPlusPlus #endif // CPLUSPLUS_RESOLVEEXPRESSION_H |
