Reimplemented resolve base expression.

This commit is contained in:
Roberto Raggi
2010-05-12 14:52:24 +02:00
parent c739119c2a
commit f9a05d9ced
3 changed files with 73 additions and 43 deletions

View File

@@ -49,6 +49,8 @@ using namespace CPlusPlus;
namespace {
const bool debug = ! qgetenv("CPLUSPLUS_DEBUG").isEmpty();
template <typename _Tp>
static QList<_Tp> removeDuplicates(const QList<_Tp> &results)
{
@@ -563,6 +565,36 @@ bool ResolveExpression::visit(MemberAccessAST *ast)
return false;
}
ClassOrNamespace *ResolveExpression::baseExpression(const QList<LookupItem> &baseResults,
int accessOp,
bool *replacedDotOperator) const
{
foreach (const LookupItem &r, baseResults) {
FullySpecifiedType ty = r.type().simplified();
if (accessOp == T_DOT) {
if (PointerType *ptrTy = ty->asPointerType()) {
ty = ptrTy->elementType();
if (replacedDotOperator)
*replacedDotOperator = true;
}
}
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;
}
}
return 0;
}
QList<LookupItem>
ResolveExpression::resolveBaseExpression(const QList<LookupItem> &baseResults, int accessOp,
bool *replacedDotOperator) const

View File

@@ -47,14 +47,18 @@ public:
QList<LookupItem> operator()(ExpressionAST *ast, Scope *scope);
QList<LookupItem> resolve(ExpressionAST *ast, Scope *scope);
QList<LookupItem> resolveMemberExpression(const QList<LookupItem> &baseResults,
unsigned accessOp,
const Name *memberName,
bool *replacedDotOperator = 0) const;
ClassOrNamespace *baseExpression(const QList<LookupItem> &baseResults,
int accessOp,
bool *replacedDotOperator = 0) const;
QList<LookupItem> resolveBaseExpression(const QList<LookupItem> &baseResults,
int accessOp,
bool *replacedDotOperator = 0) const;
Q_DECL_DEPRECATED QList<LookupItem> resolveMemberExpression(const QList<LookupItem> &baseResults,
unsigned accessOp,
const Name *memberName,
bool *replacedDotOperator = 0) const;
Q_DECL_DEPRECATED QList<LookupItem> resolveBaseExpression(const QList<LookupItem> &baseResults,
int accessOp,
bool *replacedDotOperator = 0) const;
protected:
QList<LookupItem> resolve(ExpressionAST *ast);