Simplified member completion.

Share code with ResolveExpression.
This commit is contained in:
Roberto Raggi
2009-10-16 11:08:06 +02:00
parent 99172852e1
commit 8dc369bc2d
3 changed files with 47 additions and 126 deletions

View File

@@ -647,7 +647,8 @@ bool ResolveExpression::visit(MemberAccessAST *ast)
}
QList<ResolveExpression::Result>
ResolveExpression::resolveBaseExpression(const QList<Result> &baseResults, int accessOp) const
ResolveExpression::resolveBaseExpression(const QList<Result> &baseResults, int accessOp,
bool *replacedDotOperator) const
{
QList<Result> results;
@@ -715,6 +716,16 @@ ResolveExpression::resolveBaseExpression(const QList<Result> &baseResults, int a
results.append(Result(elementTy, lastVisibleSymbol));
}
} else if (accessOp == T_DOT) {
if (replacedDotOperator) {
if (PointerType *ptrTy = ty->asPointerType()) {
*replacedDotOperator = true;
ty = ptrTy->elementType().simplified();
} else if (ArrayType *arrTy = ty->asArrayType()) {
*replacedDotOperator = true;
ty = arrTy->elementType().simplified();
}
}
if (ty->isClassType() || ty->isNamedType())
results.append(Result(ty, lastVisibleSymbol));
@@ -734,12 +745,13 @@ ResolveExpression::resolveBaseExpression(const QList<Result> &baseResults, int a
QList<ResolveExpression::Result>
ResolveExpression::resolveMemberExpression(const QList<Result> &baseResults,
unsigned accessOp,
Name *memberName) const
Name *memberName,
bool *replacedDotOperator) const
{
ResolveClass resolveClass;
QList<Result> results;
const QList<Result> classObjectResults = resolveBaseExpression(baseResults, accessOp);
const QList<Result> classObjectResults = resolveBaseExpression(baseResults, accessOp, replacedDotOperator);
foreach (const Result &r, classObjectResults) {
FullySpecifiedType ty = r.first;

View File

@@ -51,7 +51,8 @@ public:
QList<Result> resolveMemberExpression(const QList<Result> &baseResults,
unsigned accessOp,
Name *memberName) const;
Name *memberName,
bool *replacedDotOperator = 0) const;
QList<Result> resolveMember(Name *memberName, Class *klass, Name *className = 0) const;
@@ -65,7 +66,8 @@ public:
QList<Result> resolveBaseExpression(const QList<Result> &baseResults,
int accessOp) const;
int accessOp,
bool *replacedDotOperator = 0) const;
protected:
QList<Result> switchResults(const QList<Result> &symbols);