aboutsummaryrefslogtreecommitdiffstats
path: root/src/libs/cplusplus
diff options
context:
space:
mode:
authorRoberto Raggi <[email protected]>2008-12-29 11:53:40 +0100
committerRoberto Raggi <[email protected]>2008-12-29 11:53:40 +0100
commita985b59d402b189b90f5c15d291bc4fecd727d56 (patch)
treea5e783d3b2989a311e4fe335372d0dae1397db67 /src/libs/cplusplus
parent98cc3ec6c9ef0c1b47631c6d3a3ff8035e080249 (diff)
Initial support for typedefs.
Diffstat (limited to 'src/libs/cplusplus')
-rw-r--r--src/libs/cplusplus/ResolveExpression.cpp66
-rw-r--r--src/libs/cplusplus/ResolveExpression.h14
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