summaryrefslogtreecommitdiff
path: root/src/libs/cplusplus/ResolveExpression.cpp
diff options
context:
space:
mode:
authorRoberto Raggi <roberto.raggi@nokia.com>2010-05-12 15:25:16 +0200
committerRoberto Raggi <roberto.raggi@nokia.com>2010-05-14 13:55:22 +0200
commita3e76dd2cfd1a59a9c395e717ead068fbcfd8bc7 (patch)
tree4120f56838d7f811bf77a3abd839b00f28fb5cd0 /src/libs/cplusplus/ResolveExpression.cpp
parentf9a05d9cedf5596e72f65f635fc0fd42dd01c358 (diff)
downloadqt-creator-a3e76dd2cfd1a59a9c395e717ead068fbcfd8bc7.tar.gz
Get rid off resolveMemberExpression().
Diffstat (limited to 'src/libs/cplusplus/ResolveExpression.cpp')
-rw-r--r--src/libs/cplusplus/ResolveExpression.cpp96
1 files changed, 48 insertions, 48 deletions
diff --git a/src/libs/cplusplus/ResolveExpression.cpp b/src/libs/cplusplus/ResolveExpression.cpp
index a9b86e978e..936ea39e36 100644
--- a/src/libs/cplusplus/ResolveExpression.cpp
+++ b/src/libs/cplusplus/ResolveExpression.cpp
@@ -145,9 +145,14 @@ bool ResolveExpression::visit(BinaryExpressionAST *ast)
QtMethodAST *qtMethod = ast->right_expression->asQtMethod();
if (DeclaratorAST *d = qtMethod->declarator) {
if (d->core_declarator) {
- if (DeclaratorIdAST *declaratorId = d->core_declarator->asDeclaratorId())
- if (NameAST *nameAST = declaratorId->name)
- _results = resolveMemberExpression(_results, T_ARROW, nameAST->name);
+ if (DeclaratorIdAST *declaratorId = d->core_declarator->asDeclaratorId()) {
+ if (NameAST *nameAST = declaratorId->name) {
+ if (ClassOrNamespace *binding = baseExpression(_results, T_ARROW)) {
+ _results.clear();
+ addResults(binding->lookup(nameAST->name));
+ }
+ }
+ }
}
}
@@ -246,9 +251,8 @@ bool ResolveExpression::visit(PostfixExpressionAST *ast)
{
accept(ast->base_expression);
- for (PostfixListAST *it = ast->postfix_expression_list; it; it = it->next) {
+ for (PostfixListAST *it = ast->postfix_expression_list; it; it = it->next)
accept(it->value);
- }
return false;
}
@@ -560,35 +564,62 @@ bool ResolveExpression::visit(MemberAccessAST *ast)
// Remember the access operator.
const int accessOp = tokenKind(ast->access_token);
- _results = resolveMemberExpression(baseResults, accessOp, memberName);
+ if (ClassOrNamespace *binding = baseExpression(baseResults, accessOp))
+ addResults(binding->lookup(memberName));
return false;
}
+ClassOrNamespace *ResolveExpression::findClass(const FullySpecifiedType &originalTy, Scope *scope) const
+{
+ ClassOrNamespace *binding = 0;
+
+ FullySpecifiedType ty = originalTy.simplified();
+
+ if (Class *klass = ty->asClassType())
+ binding = _context.classOrNamespace(klass);
+
+ else if (NamedType *namedTy = ty->asNamedType())
+ binding = _context.classOrNamespace(namedTy->name(), scope);
+
+ return binding;
+}
+
ClassOrNamespace *ResolveExpression::baseExpression(const QList<LookupItem> &baseResults,
int accessOp,
bool *replacedDotOperator) const
{
foreach (const LookupItem &r, baseResults) {
FullySpecifiedType ty = r.type().simplified();
+ Scope *scope = r.scope();
- if (accessOp == T_DOT) {
+ if (accessOp == T_ARROW) {
if (PointerType *ptrTy = ty->asPointerType()) {
- ty = ptrTy->elementType();
+ if (ClassOrNamespace *binding = findClass(ptrTy->elementType(), scope))
+ return binding;
+
+ } else if (ClassOrNamespace *binding = findClass(ptrTy->elementType(), scope)) {
+ // lookup for overloads of operator->
+ const OperatorNameId *arrowOp = control()->operatorNameId(OperatorNameId::ArrowOp);
- if (replacedDotOperator)
- *replacedDotOperator = true;
+ foreach (Symbol *overload, binding->find(arrowOp)) {
+ FullySpecifiedType overloadTy = overload->type();
+
+ if (ClassOrNamespace *retBinding = findClass(overloadTy, overload->scope()))
+ return retBinding;
+ }
}
}
- if (Class *klass = ty->asClassType()) {
- if (ClassOrNamespace *binding = _context.classOrNamespace(klass))
- return binding;
-
- } else if (NamedType *namedTy = ty->asNamedType()) {
- if (ClassOrNamespace *binding = _context.classOrNamespace(namedTy->name(), r.scope()))
- return binding;
+ if (replacedDotOperator && accessOp == T_DOT) {
+ if (PointerType *ptrTy = ty->asPointerType()) {
+ ty = ptrTy->elementType();
+ *replacedDotOperator = true;
+ }
}
+
+ if (ClassOrNamespace *binding = findClass(ty, scope))
+ return binding;
}
return 0;
@@ -711,37 +742,6 @@ ResolveExpression::resolveBaseExpression(const QList<LookupItem> &baseResults, i
return removeDuplicates(results);
}
-QList<LookupItem>
-ResolveExpression::resolveMemberExpression(const QList<LookupItem> &baseResults,
- unsigned accessOp,
- const Name *memberName,
- bool *replacedDotOperator) const
-{
- QList<LookupItem> results;
-
- const QList<LookupItem> classObjectResults = resolveBaseExpression(baseResults, accessOp, replacedDotOperator);
-
- foreach (const LookupItem &r, classObjectResults) {
- FullySpecifiedType ty = r.type();
-
- if (Class *klass = ty->asClassType())
- results += resolveMember(memberName, klass);
-
- else if (NamedType *namedTy = ty->asNamedType()) {
- if (ClassOrNamespace *b = _context.classOrNamespace(namedTy->name(), r.scope())) {
- foreach (Symbol *overload, b->find(memberName)) {
- LookupItem item;
- item.setType(instantiate(namedTy->name(), overload));
- item.setDeclaration(overload);
- results.append(item);
- }
- }
- }
- }
-
- return removeDuplicates(results);
-}
-
FullySpecifiedType ResolveExpression::instantiate(const Name *className, Symbol *candidate) const
{
return GenTemplateInstance::instantiate(className, candidate, _context.control());