forked from qt-creator/qt-creator
Removed resolveArrowOperator and resolveArrayOperator.
This commit is contained in:
@@ -592,34 +592,36 @@ bool ResolveExpression::visit(ArrayAccessAST *ast)
|
||||
_results.clear();
|
||||
|
||||
const QList<Result> indexResults = operator()(ast->expression);
|
||||
ResolveClass symbolsForDotAcccess;
|
||||
ResolveClass resolveClass;
|
||||
|
||||
foreach (Result p, baseResults) {
|
||||
FullySpecifiedType ty = p.first;
|
||||
Symbol *contextSymbol = p.second;
|
||||
Name *arrayAccessOp = control()->operatorNameId(OperatorNameId::ArrayAccessOp);
|
||||
|
||||
if (ReferenceType *refTy = ty->asReferenceType())
|
||||
ty = refTy->elementType();
|
||||
foreach (const Result &result, baseResults) {
|
||||
FullySpecifiedType ty = result.first.simplified();
|
||||
Symbol *contextSymbol = result.second;
|
||||
|
||||
if (PointerType *ptrTy = ty->asPointerType()) {
|
||||
addResult(ptrTy->elementType(), contextSymbol);
|
||||
addResult(ptrTy->elementType().simplified(), contextSymbol);
|
||||
|
||||
} else if (ArrayType *arrTy = ty->asArrayType()) {
|
||||
addResult(arrTy->elementType(), contextSymbol);
|
||||
addResult(arrTy->elementType().simplified(), contextSymbol);
|
||||
|
||||
} else if (NamedType *namedTy = ty->asNamedType()) {
|
||||
const QList<Symbol *> classObjectCandidates =
|
||||
symbolsForDotAcccess(namedTy->name(), p, _context);
|
||||
resolveClass(namedTy->name(), result, _context);
|
||||
|
||||
foreach (Symbol *classObject, classObjectCandidates) {
|
||||
const QList<Result> overloads =
|
||||
resolveArrayOperator(p, namedTy, classObject->asClass());
|
||||
foreach (Result r, overloads) {
|
||||
FullySpecifiedType ty = r.first;
|
||||
Function *funTy = ty->asFunctionType();
|
||||
if (! funTy)
|
||||
continue;
|
||||
Q_ASSERT(classObject->isClass());
|
||||
|
||||
ty = funTy->returnType();
|
||||
addResult(ty, funTy);
|
||||
const QList<Result> overloads =
|
||||
resolveMember(arrayAccessOp, classObject->asClass(), namedTy->name());
|
||||
|
||||
foreach (Result r, overloads) {
|
||||
FullySpecifiedType ty = r.first.simplified();
|
||||
if (Function *funTy = ty->asFunctionType()) {
|
||||
ty = funTy->returnType().simplified();
|
||||
addResult(ty, funTy);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -686,11 +688,12 @@ ResolveExpression::resolveBaseExpression(const QList<Result> &baseResults, int a
|
||||
|
||||
if (NamedType *namedTy = ty->asNamedType()) {
|
||||
ResolveClass resolveClass;
|
||||
|
||||
Name *arrowAccessOp = control()->operatorNameId(OperatorNameId::ArrowOp);
|
||||
const QList<Symbol *> candidates = resolveClass(namedTy->name(), result, _context);
|
||||
foreach (Symbol *classObject, candidates) {
|
||||
const QList<Result> overloads = resolveArrowOperator(result, namedTy,
|
||||
classObject->asClass());
|
||||
|
||||
foreach (Symbol *classObject, candidates) {
|
||||
const QList<Result> overloads = resolveMember(arrowAccessOp, classObject->asClass(),
|
||||
namedTy->name());
|
||||
|
||||
foreach (const Result &r, overloads) {
|
||||
FullySpecifiedType typeOfOverloadFunction = r.first.simplified();
|
||||
@@ -817,78 +820,6 @@ ResolveExpression::resolveMember(Name *memberName, Class *klass,
|
||||
return removeDuplicates(results);
|
||||
}
|
||||
|
||||
QList<ResolveExpression::Result>
|
||||
ResolveExpression::resolveArrowOperator(const Result &,
|
||||
NamedType *namedTy,
|
||||
Class *klass) const
|
||||
{
|
||||
QList<Scope *> scopes;
|
||||
_context.expand(klass->members(), _context.visibleScopes(), &scopes);
|
||||
QList<Result> results;
|
||||
|
||||
Name *memberName = control()->operatorNameId(OperatorNameId::ArrowOp);
|
||||
QList<Symbol *> candidates = _context.resolve(memberName, scopes);
|
||||
foreach (Symbol *candidate, candidates) {
|
||||
FullySpecifiedType ty = candidate->type();
|
||||
Name *unqualifiedNameId = namedTy->name();
|
||||
if (QualifiedNameId *q = namedTy->name()->asQualifiedNameId())
|
||||
unqualifiedNameId = q->unqualifiedNameId();
|
||||
if (TemplateNameId *templId = unqualifiedNameId->asTemplateNameId()) {
|
||||
Substitution subst;
|
||||
for (unsigned i = 0; i < templId->templateArgumentCount(); ++i) {
|
||||
FullySpecifiedType templArgTy = templId->templateArgumentAt(i);
|
||||
if (i < klass->templateParameterCount()) {
|
||||
subst.append(qMakePair(klass->templateParameterAt(i)->name(),
|
||||
templArgTy));
|
||||
}
|
||||
}
|
||||
GenerateInstance inst(control(), subst);
|
||||
ty = inst(ty);
|
||||
}
|
||||
|
||||
const Result result(ty, candidate);
|
||||
results.append(result);
|
||||
}
|
||||
|
||||
return removeDuplicates(results);
|
||||
}
|
||||
|
||||
QList<ResolveExpression::Result>
|
||||
ResolveExpression::resolveArrayOperator(const Result &,
|
||||
NamedType *namedTy,
|
||||
Class *klass) const
|
||||
{
|
||||
// ### todo handle index expressions.
|
||||
|
||||
QList<Scope *> scopes;
|
||||
_context.expand(klass->members(), _context.visibleScopes(), &scopes);
|
||||
QList<Result> results;
|
||||
|
||||
Name *memberName = control()->operatorNameId(OperatorNameId::ArrayAccessOp);
|
||||
QList<Symbol *> candidates = _context.resolve(memberName, scopes);
|
||||
foreach (Symbol *candidate, candidates) {
|
||||
FullySpecifiedType ty = candidate->type();
|
||||
Name *unqualifiedNameId = namedTy->name();
|
||||
if (QualifiedNameId *q = namedTy->name()->asQualifiedNameId())
|
||||
unqualifiedNameId = q->unqualifiedNameId();
|
||||
if (TemplateNameId *templId = unqualifiedNameId->asTemplateNameId()) {
|
||||
Substitution subst;
|
||||
for (unsigned i = 0; i < templId->templateArgumentCount(); ++i) {
|
||||
FullySpecifiedType templArgTy = templId->templateArgumentAt(i);
|
||||
if (i < klass->templateParameterCount()) {
|
||||
subst.append(qMakePair(klass->templateParameterAt(i)->name(),
|
||||
templArgTy));
|
||||
}
|
||||
}
|
||||
GenerateInstance inst(control(), subst);
|
||||
ty = inst(ty);
|
||||
}
|
||||
|
||||
results.append(Result(ty, candidate));
|
||||
}
|
||||
|
||||
return removeDuplicates(results);
|
||||
}
|
||||
|
||||
bool ResolveExpression::visit(PostIncrDecrAST *)
|
||||
{
|
||||
|
||||
@@ -54,21 +54,13 @@ public:
|
||||
Name *memberName,
|
||||
bool *replacedDotOperator = 0) const;
|
||||
|
||||
QList<Result> resolveMember(Name *memberName, Class *klass, Name *className = 0) const;
|
||||
|
||||
QList<Result> resolveArrowOperator(const Result &result,
|
||||
NamedType *namedTy,
|
||||
Class *klass) const;
|
||||
|
||||
QList<Result> resolveArrayOperator(const Result &result,
|
||||
NamedType *namedTy,
|
||||
Class *klass) const;
|
||||
|
||||
|
||||
QList<Result> resolveBaseExpression(const QList<Result> &baseResults,
|
||||
int accessOp,
|
||||
bool *replacedDotOperator = 0) const;
|
||||
|
||||
QList<Result> resolveMember(Name *memberName, Class *klass,
|
||||
Name *className = 0) const;
|
||||
|
||||
protected:
|
||||
QList<Result> switchResults(const QList<Result> &symbols);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user