From ecf40d24260c7a407e365a2265d8caaf0bfbabff Mon Sep 17 00:00:00 2001 From: Roberto Raggi <roberto.raggi@nokia.com> Date: Tue, 17 Nov 2009 14:21:46 +0100 Subject: [PATCH] Get rid off QPair<FullySpecifiedType, Symbol *>. Use LookupItem intead. --- src/libs/cplusplus/FindUsages.cpp | 11 +- src/libs/cplusplus/LookupContext.cpp | 18 ++- src/libs/cplusplus/LookupContext.h | 41 +++++- src/libs/cplusplus/ResolveExpression.cpp | 154 +++++++++++---------- src/libs/cplusplus/ResolveExpression.h | 31 ++--- src/libs/cplusplus/TypeOfExpression.cpp | 8 +- src/libs/cplusplus/TypeOfExpression.h | 5 +- src/plugins/cppeditor/cppeditor.cpp | 34 ++--- src/plugins/cppeditor/cpphoverhandler.cpp | 11 +- src/plugins/cpptools/cppcodecompletion.cpp | 50 +++---- src/plugins/cpptools/cppcodecompletion.h | 12 +- 11 files changed, 205 insertions(+), 170 deletions(-) diff --git a/src/libs/cplusplus/FindUsages.cpp b/src/libs/cplusplus/FindUsages.cpp index 7374e034fb6..396e9c8a5e7 100644 --- a/src/libs/cplusplus/FindUsages.cpp +++ b/src/libs/cplusplus/FindUsages.cpp @@ -269,16 +269,13 @@ void FindUsages::checkExpression(unsigned startToken, unsigned endToken) getTokenStartPosition(startToken, &line, &column); Symbol *lastVisibleSymbol = _doc->findSymbolAt(line, column); - const QList<TypeOfExpression::Result> results = - typeofExpression(expression, _doc, lastVisibleSymbol, - TypeOfExpression::Preprocess); + const QList<LookupItem> results = typeofExpression(expression, _doc, lastVisibleSymbol, + TypeOfExpression::Preprocess); QList<Symbol *> candidates; - foreach (TypeOfExpression::Result r, results) { - FullySpecifiedType ty = r.first; - Symbol *lastVisibleSymbol = r.second; - + foreach (const LookupItem &r, results) { + Symbol *lastVisibleSymbol = r.lastVisibleSymbol(); candidates.append(lastVisibleSymbol); } diff --git a/src/libs/cplusplus/LookupContext.cpp b/src/libs/cplusplus/LookupContext.cpp index 653d86b0d00..3c60dda6410 100644 --- a/src/libs/cplusplus/LookupContext.cpp +++ b/src/libs/cplusplus/LookupContext.cpp @@ -43,6 +43,13 @@ using namespace CPlusPlus; +uint qHash(const CPlusPlus::LookupItem &key) +{ + const uint h1 = qHash(key.type().type()); + const uint h2 = qHash(key.lastVisibleSymbol()); + return ((h1 << 16) | (h1 >> 16)) ^ h2; +} + ///////////////////////////////////////////////////////////////////// // LookupContext ///////////////////////////////////////////////////////////////////// @@ -348,8 +355,8 @@ QList<Scope *> LookupContext::buildVisibleScopes() return scopes; } -QList<Scope *> LookupContext::visibleScopes(const QPair<FullySpecifiedType, Symbol *> &result) const -{ return visibleScopes(result.second); } +QList<Scope *> LookupContext::visibleScopes(const LookupItem &result) const +{ return visibleScopes(result.lastVisibleSymbol()); } QList<Scope *> LookupContext::visibleScopes(Symbol *symbol) const { @@ -696,14 +703,13 @@ Symbol *LookupContext::canonicalSymbol(const QList<Symbol *> &candidates, return canonicalSymbol(candidates.first(), globalNamespaceBinding); } -Symbol *LookupContext::canonicalSymbol(const QList<QPair<FullySpecifiedType, Symbol *> > &results, +Symbol *LookupContext::canonicalSymbol(const QList<LookupItem> &results, NamespaceBinding *globalNamespaceBinding) { QList<Symbol *> candidates; - QPair<FullySpecifiedType, Symbol *> result; - foreach (result, results) - candidates.append(result.second); // ### not exacly. + foreach (const LookupItem &result, results) + candidates.append(result.lastVisibleSymbol()); // ### not exacly. return canonicalSymbol(candidates, globalNamespaceBinding); } diff --git a/src/libs/cplusplus/LookupContext.h b/src/libs/cplusplus/LookupContext.h index 6a69b3330bb..a5aeb69b174 100644 --- a/src/libs/cplusplus/LookupContext.h +++ b/src/libs/cplusplus/LookupContext.h @@ -31,10 +31,41 @@ #define CPLUSPLUS_LOOKUPCONTEXT_H #include "CppDocument.h" -#include <QPair> +#include <FullySpecifiedType.h> namespace CPlusPlus { +class CPLUSPLUS_EXPORT LookupItem +{ +public: + LookupItem() + : _lastVisibleSymbol(0) {} + + LookupItem(const FullySpecifiedType &type, Symbol *lastVisibleSymbol) + : _type(type), _lastVisibleSymbol(lastVisibleSymbol) {} + + FullySpecifiedType type() const { return _type; } + void setType(const FullySpecifiedType &type) { _type = type; } + + Symbol *lastVisibleSymbol() const { return _lastVisibleSymbol; } + void setLastVisibleSymbol(Symbol *symbol) { _lastVisibleSymbol = symbol; } + + bool operator == (const LookupItem &other) const + { + if (_type == other._type) + return _lastVisibleSymbol == other._lastVisibleSymbol; + + return false; + } + + bool operator != (const LookupItem &result) const + { return ! operator == (result); } + +private: + FullySpecifiedType _type; + Symbol *_lastVisibleSymbol; +}; + class CPLUSPLUS_EXPORT LookupContext { public: @@ -60,7 +91,7 @@ public: static Symbol *canonicalSymbol(Symbol *symbol, NamespaceBinding *globalNamespaceBinding); - static Symbol *canonicalSymbol(const QList<QPair<FullySpecifiedType, Symbol *> > &candidates, + static Symbol *canonicalSymbol(const QList<LookupItem> &candidates, NamespaceBinding *globalNamespaceBinding); QList<Symbol *> resolve(Name *name) const @@ -113,7 +144,7 @@ public: { return _visibleScopes; } QList<Scope *> visibleScopes(Symbol *symbol) const; - QList<Scope *> visibleScopes(const QPair<FullySpecifiedType, Symbol *> &result) const; + QList<Scope *> visibleScopes(const LookupItem &result) const; QList<Scope *> expand(const QList<Scope *> &scopes) const; @@ -199,4 +230,8 @@ private: } // end of namespace CPlusPlus + +uint qHash(const CPlusPlus::LookupItem &result); + + #endif // CPLUSPLUS_LOOKUPCONTEXT_H diff --git a/src/libs/cplusplus/ResolveExpression.cpp b/src/libs/cplusplus/ResolveExpression.cpp index de26ea9c5d3..2d2b3defa1a 100644 --- a/src/libs/cplusplus/ResolveExpression.cpp +++ b/src/libs/cplusplus/ResolveExpression.cpp @@ -80,42 +80,42 @@ ResolveExpression::ResolveExpression(const LookupContext &context) ResolveExpression::~ResolveExpression() { } -QList<ResolveExpression::Result> ResolveExpression::operator()(ExpressionAST *ast) +QList<LookupItem> ResolveExpression::operator()(ExpressionAST *ast) { - const QList<Result> previousResults = switchResults(QList<Result>()); + const QList<LookupItem> previousResults = switchResults(QList<LookupItem>()); accept(ast); return removeDuplicates(switchResults(previousResults)); } -QList<ResolveExpression::Result> -ResolveExpression::switchResults(const QList<ResolveExpression::Result> &results) +QList<LookupItem> +ResolveExpression::switchResults(const QList<LookupItem> &results) { - const QList<Result> previousResults = _results; + const QList<LookupItem> previousResults = _results; _results = results; return previousResults; } -void ResolveExpression::addResults(const QList<Result> &results) +void ResolveExpression::addResults(const QList<LookupItem> &results) { - foreach (const Result r, results) + foreach (const LookupItem r, results) addResult(r); } void ResolveExpression::addResult(const FullySpecifiedType &ty, Symbol *symbol) -{ return addResult(Result(ty, symbol)); } +{ return addResult(LookupItem(ty, symbol)); } -void ResolveExpression::addResult(const Result &r) +void ResolveExpression::addResult(const LookupItem &r) { - Result p = r; + LookupItem p = r; - if (! p.second) - p.second = _context.symbol(); + if (! p.lastVisibleSymbol()) + p.setLastVisibleSymbol(_context.symbol()); if (! _results.contains(p)) _results.append(p); } -QList<Scope *> ResolveExpression::visibleScopes(const Result &result) const +QList<Scope *> ResolveExpression::visibleScopes(const LookupItem &result) const { return _context.visibleScopes(result); } bool ResolveExpression::visit(BinaryExpressionAST *ast) @@ -323,18 +323,20 @@ bool ResolveExpression::visit(UnaryExpressionAST *ast) accept(ast->expression); unsigned unaryOp = tokenKind(ast->unary_op_token); if (unaryOp == T_AMPER) { - QMutableListIterator<Result > it(_results); + QMutableListIterator<LookupItem > it(_results); while (it.hasNext()) { - Result p = it.next(); - p.first.setType(control()->pointerType(p.first)); + LookupItem p = it.next(); + FullySpecifiedType ty = p.type(); + ty.setType(control()->pointerType(ty)); + p.setType(ty); it.setValue(p); } } else if (unaryOp == T_STAR) { - QMutableListIterator<Result > it(_results); + QMutableListIterator<LookupItem > it(_results); while (it.hasNext()) { - Result p = it.next(); - if (PointerType *ptrTy = p.first->asPointerType()) { - p.first = ptrTy->elementType(); + LookupItem p = it.next(); + if (PointerType *ptrTy = p.type()->asPointerType()) { + p.setType(ptrTy->elementType()); it.setValue(p); } else { it.remove(); @@ -359,7 +361,7 @@ bool ResolveExpression::visit(QualifiedNameAST *ast) foreach (Symbol *symbol, symbols) { if (symbol->isTypedef()) { if (NamedType *namedTy = symbol->type()->asNamedType()) { - const Result r(namedTy, symbol); + const LookupItem r(namedTy, symbol); const QList<Symbol *> resolvedClasses = resolveClass(namedTy->name(), r, _context); if (resolvedClasses.count()) { @@ -437,7 +439,7 @@ bool ResolveExpression::visit(CallAST *ast) { ResolveClass resolveClass; - const QList<Result> baseResults = _results; + const QList<LookupItem> baseResults = _results; _results.clear(); // Compute the types of the actual arguments. @@ -451,18 +453,18 @@ bool ResolveExpression::visit(CallAST *ast) Name *functionCallOp = control()->operatorNameId(OperatorNameId::FunctionCallOp); - foreach (const Result &result, baseResults) { - FullySpecifiedType ty = result.first.simplified(); - Symbol *lastVisibleSymbol = result.second; + foreach (const LookupItem &result, baseResults) { + FullySpecifiedType ty = result.type().simplified(); + Symbol *lastVisibleSymbol = result.lastVisibleSymbol(); if (NamedType *namedTy = ty->asNamedType()) { const QList<Symbol *> classObjectCandidates = resolveClass(namedTy->name(), result, _context); foreach (Symbol *classObject, classObjectCandidates) { - const QList<Result> overloads = resolveMember(functionCallOp, classObject->asClass(), namedTy->name()); + const QList<LookupItem> overloads = resolveMember(functionCallOp, classObject->asClass(), namedTy->name()); - foreach (const Result &o, overloads) { - FullySpecifiedType overloadTy = o.first.simplified(); + foreach (const LookupItem &o, overloads) { + FullySpecifiedType overloadTy = o.type().simplified(); if (Function *funTy = overloadTy->asFunctionType()) { if (maybeValidPrototype(funTy, actualArgumentCount)) @@ -487,17 +489,17 @@ bool ResolveExpression::visit(CallAST *ast) bool ResolveExpression::visit(ArrayAccessAST *ast) { - const QList<Result> baseResults = _results; + const QList<LookupItem> baseResults = _results; _results.clear(); - const QList<Result> indexResults = operator()(ast->expression); + const QList<LookupItem> indexResults = operator()(ast->expression); ResolveClass resolveClass; Name *arrayAccessOp = control()->operatorNameId(OperatorNameId::ArrayAccessOp); - foreach (const Result &result, baseResults) { - FullySpecifiedType ty = result.first.simplified(); - Symbol *contextSymbol = result.second; + foreach (const LookupItem &result, baseResults) { + FullySpecifiedType ty = result.type().simplified(); + Symbol *contextSymbol = result.lastVisibleSymbol(); if (PointerType *ptrTy = ty->asPointerType()) { addResult(ptrTy->elementType().simplified(), contextSymbol); @@ -512,11 +514,11 @@ bool ResolveExpression::visit(ArrayAccessAST *ast) foreach (Symbol *classObject, classObjectCandidates) { Q_ASSERT(classObject->isClass()); - const QList<Result> overloads = + const QList<LookupItem> overloads = resolveMember(arrayAccessOp, classObject->asClass(), namedTy->name()); - foreach (Result r, overloads) { - FullySpecifiedType ty = r.first.simplified(); + foreach (LookupItem r, overloads) { + FullySpecifiedType ty = r.type().simplified(); if (Function *funTy = ty->asFunctionType()) { ty = funTy->returnType().simplified(); addResult(ty, funTy); @@ -532,7 +534,7 @@ bool ResolveExpression::visit(MemberAccessAST *ast) { // The candidate types for the base expression are stored in // _results. - QList<Result> baseResults = _results; + QList<LookupItem> baseResults = _results; // Evaluate the expression-id that follows the access operator. Name *memberName = 0; @@ -547,18 +549,18 @@ bool ResolveExpression::visit(MemberAccessAST *ast) return false; } -QList<ResolveExpression::Result> -ResolveExpression::resolveBaseExpression(const QList<Result> &baseResults, int accessOp, +QList<LookupItem> +ResolveExpression::resolveBaseExpression(const QList<LookupItem> &baseResults, int accessOp, bool *replacedDotOperator) const { - QList<Result> results; + QList<LookupItem> results; if (baseResults.isEmpty()) return results; - Result result = baseResults.first(); - FullySpecifiedType ty = result.first.simplified(); - Symbol *lastVisibleSymbol = result.second; + LookupItem result = baseResults.first(); + FullySpecifiedType ty = result.type().simplified(); + Symbol *lastVisibleSymbol = result.lastVisibleSymbol(); if (Function *funTy = ty->asFunctionType()) { if (funTy->isAmbiguous()) @@ -568,7 +570,7 @@ ResolveExpression::resolveBaseExpression(const QList<Result> &baseResults, int a if (accessOp == T_ARROW) { if (lastVisibleSymbol && ty->isClassType() && ! lastVisibleSymbol->isClass()) { // ### remove ! lastVisibleSymbol->isClass() from the condition. - results.append(Result(ty, lastVisibleSymbol)); + results.append(LookupItem(ty, lastVisibleSymbol)); } else if (NamedType *namedTy = ty->asNamedType()) { // ### This code is pretty slow. @@ -577,14 +579,14 @@ ResolveExpression::resolveBaseExpression(const QList<Result> &baseResults, int a foreach (Symbol *candidate, candidates) { if (candidate->isTypedef()) { FullySpecifiedType declTy = candidate->type().simplified(); - const ResolveExpression::Result r(declTy, candidate); + const LookupItem r(declTy, candidate); // update the result result = r; // refresh the cached ty and lastVisibileSymbol. - ty = result.first.simplified(); - lastVisibleSymbol = result.second; + ty = result.type().simplified(); + lastVisibleSymbol = result.lastVisibleSymbol(); break; } } @@ -596,12 +598,12 @@ ResolveExpression::resolveBaseExpression(const QList<Result> &baseResults, int a const QList<Symbol *> candidates = resolveClass(namedTy->name(), result, _context); foreach (Symbol *classObject, candidates) { - const QList<Result> overloads = resolveMember(arrowAccessOp, classObject->asClass(), + const QList<LookupItem> overloads = resolveMember(arrowAccessOp, classObject->asClass(), namedTy->name()); - foreach (const Result &r, overloads) { - FullySpecifiedType typeOfOverloadFunction = r.first.simplified(); - Symbol *lastVisibleSymbol = r.second; + foreach (const LookupItem &r, overloads) { + FullySpecifiedType typeOfOverloadFunction = r.type().simplified(); + Symbol *lastVisibleSymbol = r.lastVisibleSymbol(); Function *funTy = typeOfOverloadFunction->asFunctionType(); if (! funTy) continue; @@ -612,7 +614,7 @@ ResolveExpression::resolveBaseExpression(const QList<Result> &baseResults, int a FullySpecifiedType elementTy = ptrTy->elementType().simplified(); if (elementTy->isNamedType()) - results.append(Result(elementTy, lastVisibleSymbol)); + results.append(LookupItem(elementTy, lastVisibleSymbol)); } } } @@ -620,7 +622,7 @@ ResolveExpression::resolveBaseExpression(const QList<Result> &baseResults, int a FullySpecifiedType elementTy = ptrTy->elementType().simplified(); if (elementTy->isNamedType() || elementTy->isClassType()) - results.append(Result(elementTy, lastVisibleSymbol)); + results.append(LookupItem(elementTy, lastVisibleSymbol)); } } else if (accessOp == T_DOT) { if (replacedDotOperator) { @@ -643,14 +645,14 @@ ResolveExpression::resolveBaseExpression(const QList<Result> &baseResults, int a } } - results.append(Result(ty, lastVisibleSymbol)); + results.append(LookupItem(ty, lastVisibleSymbol)); } else if (Function *fun = ty->asFunctionType()) { Scope *funScope = fun->scope(); if (funScope && (funScope->isBlockScope() || funScope->isNamespaceScope())) { FullySpecifiedType retTy = fun->returnType().simplified(); - results.append(Result(retTy, lastVisibleSymbol)); + results.append(LookupItem(retTy, lastVisibleSymbol)); } } } @@ -658,18 +660,18 @@ ResolveExpression::resolveBaseExpression(const QList<Result> &baseResults, int a return removeDuplicates(results); } -QList<ResolveExpression::Result> -ResolveExpression::resolveMemberExpression(const QList<Result> &baseResults, +QList<LookupItem> +ResolveExpression::resolveMemberExpression(const QList<LookupItem> &baseResults, unsigned accessOp, Name *memberName, bool *replacedDotOperator) const { ResolveClass resolveClass; - QList<Result> results; + QList<LookupItem> results; - const QList<Result> classObjectResults = resolveBaseExpression(baseResults, accessOp, replacedDotOperator); - foreach (const Result &r, classObjectResults) { - FullySpecifiedType ty = r.first; + 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); @@ -688,11 +690,11 @@ ResolveExpression::resolveMemberExpression(const QList<Result> &baseResults, return removeDuplicates(results); } -QList<ResolveExpression::Result> +QList<LookupItem> ResolveExpression::resolveMember(Name *memberName, Class *klass, Name *className) const { - QList<Result> results; + QList<LookupItem> results; if (! className) className = klass->name(); @@ -731,17 +733,17 @@ ResolveExpression::resolveMember(Name *memberName, Class *klass, ty = inst(candidate); } - results.append(Result(ty, candidate)); + results.append(LookupItem(ty, candidate)); } return removeDuplicates(results); } -QList<ResolveExpression::Result> +QList<LookupItem> ResolveExpression::resolveMember(Name *memberName, ObjCClass *klass) const { - QList<Result> results; + QList<LookupItem> results; if (!memberName || !klass) return results; @@ -754,7 +756,7 @@ ResolveExpression::resolveMember(Name *memberName, ObjCClass *klass) const foreach (Symbol *candidate, candidates) { FullySpecifiedType ty = candidate->type(); - results.append(Result(ty, candidate)); + results.append(LookupItem(ty, candidate)); } return removeDuplicates(results); @@ -767,11 +769,11 @@ bool ResolveExpression::visit(PostIncrDecrAST *) bool ResolveExpression::visit(ObjCMessageExpressionAST *ast) { - QList<Result> receiverResults = operator()(ast->receiver_expression); + QList<LookupItem> receiverResults = operator()(ast->receiver_expression); if (!receiverResults.isEmpty()) { - Result result = receiverResults.first(); - FullySpecifiedType ty = result.first.simplified(); + LookupItem result = receiverResults.first(); + FullySpecifiedType ty = result.type().simplified(); Name *klassName = 0; if (const ObjCClass *classTy = ty->asObjCClassType()) { @@ -804,17 +806,17 @@ ResolveClass::ResolveClass() { } QList<Symbol *> ResolveClass::operator()(Name *name, - const ResolveExpression::Result &p, + const LookupItem &p, const LookupContext &context) { - const QList<ResolveExpression::Result> previousBlackList = _blackList; + const QList<LookupItem> previousBlackList = _blackList; const QList<Symbol *> symbols = resolveClass(name, p, context); _blackList = previousBlackList; return symbols; } QList<Symbol *> ResolveClass::resolveClass(Name *name, - const ResolveExpression::Result &p, + const LookupItem &p, const LookupContext &context) { QList<Symbol *> resolvedSymbols; @@ -845,7 +847,7 @@ QList<Symbol *> ResolveClass::resolveClass(Name *name, // b. FullySpecifiedType declType = decl->type().simplified(); if (NamedType *namedTy = declType->asNamedType()) { - const ResolveExpression::Result r(declType, decl); + const LookupItem r(declType, decl); resolvedSymbols += resolveClass(namedTy->name(), r, context); } } @@ -857,7 +859,7 @@ QList<Symbol *> ResolveClass::resolveClass(Name *name, if (funTy->scope() && (funTy->scope()->isBlockScope() || funTy->scope()->isNamespaceScope())) { FullySpecifiedType retTy = funTy->returnType().simplified(); if (NamedType *namedTy = retTy->asNamedType()) { - const ResolveExpression::Result r(retTy, decl); + const LookupItem r(retTy, decl); resolvedSymbols += resolveClass(namedTy->name(), r, context); } } @@ -872,7 +874,7 @@ ResolveObjCClass::ResolveObjCClass() {} QList<Symbol *> ResolveObjCClass::operator ()(Name *name, - const ResolveExpression::Result &p, + const LookupItem &p, const LookupContext &context) { QList<Symbol *> resolvedSymbols; diff --git a/src/libs/cplusplus/ResolveExpression.h b/src/libs/cplusplus/ResolveExpression.h index adda2716c36..f4c00352daa 100644 --- a/src/libs/cplusplus/ResolveExpression.h +++ b/src/libs/cplusplus/ResolveExpression.h @@ -40,35 +40,32 @@ namespace CPlusPlus { class CPLUSPLUS_EXPORT ResolveExpression: protected ASTVisitor { -public: - typedef QPair<FullySpecifiedType, Symbol *> Result; - public: ResolveExpression(const LookupContext &context); virtual ~ResolveExpression(); - QList<Result> operator()(ExpressionAST *ast); + QList<LookupItem> operator()(ExpressionAST *ast); - QList<Result> resolveMemberExpression(const QList<Result> &baseResults, + QList<LookupItem> resolveMemberExpression(const QList<LookupItem> &baseResults, unsigned accessOp, Name *memberName, bool *replacedDotOperator = 0) const; - QList<Result> resolveBaseExpression(const QList<Result> &baseResults, + QList<LookupItem> resolveBaseExpression(const QList<LookupItem> &baseResults, int accessOp, bool *replacedDotOperator = 0) const; - QList<Result> resolveMember(Name *memberName, Class *klass, + QList<LookupItem> resolveMember(Name *memberName, Class *klass, Name *className = 0) const; - QList<Result> resolveMember(Name *memberName, ObjCClass *klass) const; + QList<LookupItem> resolveMember(Name *memberName, ObjCClass *klass) const; protected: - QList<Result> switchResults(const QList<Result> &symbols); + QList<LookupItem> switchResults(const QList<LookupItem> &symbols); void addResult(const FullySpecifiedType &ty, Symbol *symbol = 0); - void addResult(const Result &result); - void addResults(const QList<Result> &results); + void addResult(const LookupItem &result); + void addResults(const QList<LookupItem> &results); bool maybeValidPrototype(Function *funTy, unsigned actualArgumentCount) const; @@ -114,12 +111,12 @@ protected: // Objective-C expressions virtual bool visit(ObjCMessageExpressionAST *ast); - QList<Scope *> visibleScopes(const Result &result) const; + QList<Scope *> visibleScopes(const LookupItem &result) const; private: LookupContext _context; Semantic sem; - QList<Result> _results; + QList<LookupItem> _results; Symbol *_declSymbol; }; @@ -129,16 +126,16 @@ public: ResolveClass(); QList<Symbol *> operator()(Name *name, - const ResolveExpression::Result &p, + const LookupItem &p, const LookupContext &context); private: QList<Symbol *> resolveClass(Name *name, - const ResolveExpression::Result &p, + const LookupItem &p, const LookupContext &context); private: - QList<ResolveExpression::Result> _blackList; + QList<LookupItem> _blackList; }; class CPLUSPLUS_EXPORT ResolveObjCClass @@ -147,7 +144,7 @@ public: ResolveObjCClass(); QList<Symbol *> operator()(Name *name, - const ResolveExpression::Result &p, + const LookupItem &p, const LookupContext &context); }; diff --git a/src/libs/cplusplus/TypeOfExpression.cpp b/src/libs/cplusplus/TypeOfExpression.cpp index c76e6b5f240..8450bac236c 100644 --- a/src/libs/cplusplus/TypeOfExpression.cpp +++ b/src/libs/cplusplus/TypeOfExpression.cpp @@ -54,10 +54,10 @@ void TypeOfExpression::setSnapshot(const Snapshot &documents) m_lookupContext = LookupContext(); } -QList<TypeOfExpression::Result> TypeOfExpression::operator()(const QString &expression, - Document::Ptr document, - Symbol *lastVisibleSymbol, - PreprocessMode mode) +QList<LookupItem> TypeOfExpression::operator()(const QString &expression, + Document::Ptr document, + Symbol *lastVisibleSymbol, + PreprocessMode mode) { QString code = expression; if (mode == Preprocess) diff --git a/src/libs/cplusplus/TypeOfExpression.h b/src/libs/cplusplus/TypeOfExpression.h index b3572cf5761..6e7ad456cc3 100644 --- a/src/libs/cplusplus/TypeOfExpression.h +++ b/src/libs/cplusplus/TypeOfExpression.h @@ -44,9 +44,6 @@ class Macro; class CPLUSPLUS_EXPORT TypeOfExpression { -public: - typedef QPair<FullySpecifiedType, Symbol *> Result; - public: TypeOfExpression(); @@ -78,7 +75,7 @@ public: * @param document The document the expression is part of. * @param lastVisibleSymbol The last visible symbol in the document. */ - QList<Result> operator()(const QString &expression, Document::Ptr document, + QList<LookupItem> operator()(const QString &expression, Document::Ptr document, Symbol *lastVisibleSymbol, PreprocessMode mode = NoPreprocess); diff --git a/src/plugins/cppeditor/cppeditor.cpp b/src/plugins/cppeditor/cppeditor.cpp index 59d06a90392..4bba1e21a5b 100644 --- a/src/plugins/cppeditor/cppeditor.cpp +++ b/src/plugins/cppeditor/cppeditor.cpp @@ -745,12 +745,13 @@ CPlusPlus::Symbol *CPPEditor::findCanonicalSymbol(const QTextCursor &cursor, Symbol *lastVisibleSymbol = doc->findSymbolAt(line, col); - const QList<TypeOfExpression::Result> results = typeOfExpression(code, doc, - lastVisibleSymbol, - TypeOfExpression::Preprocess); + const QList<LookupItem> results = typeOfExpression(code, doc, + lastVisibleSymbol, + TypeOfExpression::Preprocess); NamespaceBindingPtr glo = bind(doc, snapshot); Symbol *canonicalSymbol = LookupContext::canonicalSymbol(results, glo.data()); + return canonicalSymbol; } @@ -1079,7 +1080,7 @@ void CPPEditor::switchDeclarationDefinition() if (f) { TypeOfExpression typeOfExpression; typeOfExpression.setSnapshot(m_modelManager->snapshot()); - QList<TypeOfExpression::Result> resolvedSymbols = typeOfExpression(QString(), doc, lastSymbol); + QList<LookupItem> resolvedSymbols = typeOfExpression(QString(), doc, lastSymbol); const LookupContext &context = typeOfExpression.lookupContext(); QualifiedNameId *q = qualifiedNameIdForSymbol(f, context); @@ -1164,46 +1165,47 @@ CPPEditor::Link CPPEditor::findLinkAt(const QTextCursor &cursor, const QString expression = expressionUnderCursor(tc); TypeOfExpression typeOfExpression; typeOfExpression.setSnapshot(snapshot); - QList<TypeOfExpression::Result> resolvedSymbols = + QList<LookupItem> resolvedSymbols = typeOfExpression(expression, doc, lastSymbol); if (!resolvedSymbols.isEmpty()) { - TypeOfExpression::Result result = resolvedSymbols.first(); + LookupItem result = resolvedSymbols.first(); + const FullySpecifiedType ty = result.type().simplified(); - if (result.first->isForwardClassDeclarationType()) { + if (ty->isForwardClassDeclarationType()) { while (! resolvedSymbols.isEmpty()) { - TypeOfExpression::Result r = resolvedSymbols.takeFirst(); + LookupItem r = resolvedSymbols.takeFirst(); - if (! r.first->isForwardClassDeclarationType()) { + if (! r.type()->isForwardClassDeclarationType()) { result = r; break; } } } - if (result.first->isObjCForwardClassDeclarationType()) { + if (ty->isObjCForwardClassDeclarationType()) { while (! resolvedSymbols.isEmpty()) { - TypeOfExpression::Result r = resolvedSymbols.takeFirst(); + LookupItem r = resolvedSymbols.takeFirst(); - if (! r.first->isObjCForwardClassDeclarationType()) { + if (! r.type()->isObjCForwardClassDeclarationType()) { result = r; break; } } } - if (result.first->isObjCForwardProtocolDeclarationType()) { + if (ty->isObjCForwardProtocolDeclarationType()) { while (! resolvedSymbols.isEmpty()) { - TypeOfExpression::Result r = resolvedSymbols.takeFirst(); + LookupItem r = resolvedSymbols.takeFirst(); - if (! r.first->isObjCForwardProtocolDeclarationType()) { + if (! r.type()->isObjCForwardProtocolDeclarationType()) { result = r; break; } } } - if (Symbol *symbol = result.second) { + if (Symbol *symbol = result.lastVisibleSymbol()) { Symbol *def = 0; if (resolveTarget && !lastSymbol->isFunction()) def = findDefinition(symbol); diff --git a/src/plugins/cppeditor/cpphoverhandler.cpp b/src/plugins/cppeditor/cpphoverhandler.cpp index ff671da25af..6c93ca8ffa5 100644 --- a/src/plugins/cppeditor/cpphoverhandler.cpp +++ b/src/plugins/cppeditor/cpphoverhandler.cpp @@ -323,14 +323,13 @@ void CppHoverHandler::updateHelpIdAndTooltip(TextEditor::ITextEditor *editor, in ExpressionUnderCursor expressionUnderCursor; const QString expression = expressionUnderCursor(tc); - const QList<TypeOfExpression::Result> types = - typeOfExpression(expression, doc, lastSymbol); + const QList<LookupItem> types = typeOfExpression(expression, doc, lastSymbol); if (!types.isEmpty()) { - const TypeOfExpression::Result result = types.first(); + const LookupItem result = types.first(); - FullySpecifiedType firstType = result.first; // result of `type of expression'. - Symbol *lookupSymbol = result.second; // lookup symbol + FullySpecifiedType firstType = result.type(); // result of `type of expression'. + Symbol *lookupSymbol = result.lastVisibleSymbol(); // lookup symbol Symbol *resolvedSymbol = lookupSymbol; Name *resolvedName = lookupSymbol ? lookupSymbol->name() : 0; @@ -349,7 +348,7 @@ void CppHoverHandler::updateHelpIdAndTooltip(TextEditor::ITextEditor *editor, in m_helpId = buildHelpId(resolvedSymbol, resolvedName); if (m_toolTip.isEmpty()) { - Symbol *symbol = result.second; + Symbol *symbol = result.lastVisibleSymbol(); if (resolvedSymbol) symbol = resolvedSymbol; diff --git a/src/plugins/cpptools/cppcodecompletion.cpp b/src/plugins/cpptools/cppcodecompletion.cpp index 5502e285440..0fb216a475e 100644 --- a/src/plugins/cpptools/cppcodecompletion.cpp +++ b/src/plugins/cpptools/cppcodecompletion.cpp @@ -789,8 +789,8 @@ int CppCodeCompletion::startCompletion(TextEditor::ITextEditable *editor) Symbol *lastVisibleSymbol = thisDocument->findSymbolAt(line, column); typeOfExpression.setSnapshot(m_manager->snapshot()); - QList<TypeOfExpression::Result> resolvedTypes = typeOfExpression(expression, thisDocument, lastVisibleSymbol, - TypeOfExpression::Preprocess); + QList<LookupItem> resolvedTypes = typeOfExpression(expression, thisDocument, lastVisibleSymbol, + TypeOfExpression::Preprocess); LookupContext context = typeOfExpression.lookupContext(); if (!typeOfExpression.expressionAST() && (! m_completionOperator || @@ -852,14 +852,14 @@ int CppCodeCompletion::startCompletion(TextEditor::ITextEditable *editor) const QString baseExpression = expressionUnderCursor(tc); // Resolve the type of this expression - const QList<TypeOfExpression::Result> results = + const QList<LookupItem> results = typeOfExpression(baseExpression, thisDocument, lastVisibleSymbol, TypeOfExpression::Preprocess); // If it's a class, add completions for the constructors - foreach (const TypeOfExpression::Result &result, results) { - if (result.first->isClassType()) { + foreach (const LookupItem &result, results) { + if (result.type()->isClassType()) { if (completeConstructorOrFunction(results, context, endOfExpression, true)) return m_startPosition; break; @@ -872,14 +872,14 @@ int CppCodeCompletion::startCompletion(TextEditor::ITextEditable *editor) return -1; } -bool CppCodeCompletion::completeConstructorOrFunction(const QList<TypeOfExpression::Result> &results, +bool CppCodeCompletion::completeConstructorOrFunction(const QList<LookupItem> &results, const LookupContext &context, int endOfExpression, bool toolTipOnly) { QList<Function *> functions; - foreach (const TypeOfExpression::Result &result, results) { - FullySpecifiedType exprTy = result.first.simplified(); + foreach (const LookupItem &result, results) { + FullySpecifiedType exprTy = result.type().simplified(); if (Class *klass = exprTy->asClassType()) { Name *className = klass->name(); @@ -909,8 +909,8 @@ bool CppCodeCompletion::completeConstructorOrFunction(const QList<TypeOfExpressi } if (functions.isEmpty()) { - foreach (const TypeOfExpression::Result &result, results) { - FullySpecifiedType ty = result.first.simplified(); + foreach (const LookupItem &result, results) { + FullySpecifiedType ty = result.type().simplified(); if (Function *fun = ty->asFunctionType()) { @@ -939,20 +939,20 @@ bool CppCodeCompletion::completeConstructorOrFunction(const QList<TypeOfExpressi ResolveClass resolveClass; Name *functionCallOp = context.control()->operatorNameId(OperatorNameId::FunctionCallOp); - foreach (const TypeOfExpression::Result &result, results) { - FullySpecifiedType ty = result.first.simplified(); + foreach (const LookupItem &result, results) { + FullySpecifiedType ty = result.type().simplified(); if (NamedType *namedTy = ty->asNamedType()) { const QList<Symbol *> classObjectCandidates = resolveClass(namedTy->name(), result, context); foreach (Symbol *classObjectCandidate, classObjectCandidates) { if (Class *klass = classObjectCandidate->asClass()) { - const QList<TypeOfExpression::Result> overloads = + const QList<LookupItem> overloads = resolveExpression.resolveMember(functionCallOp, klass, namedTy->name()); - foreach (const TypeOfExpression::Result &overloadResult, overloads) { - FullySpecifiedType overloadTy = overloadResult.first.simplified(); + foreach (const LookupItem &overloadResult, overloads) { + FullySpecifiedType overloadTy = overloadResult.type().simplified(); if (Function *funTy = overloadTy->asFunctionType()) functions.append(funTy); @@ -1060,7 +1060,7 @@ bool CppCodeCompletion::completeConstructorOrFunction(const QList<TypeOfExpressi return false; } -bool CppCodeCompletion::completeMember(const QList<TypeOfExpression::Result> &baseResults, +bool CppCodeCompletion::completeMember(const QList<LookupItem> &baseResults, const LookupContext &context) { if (baseResults.isEmpty()) @@ -1070,14 +1070,14 @@ bool CppCodeCompletion::completeMember(const QList<TypeOfExpression::Result> &ba ResolveClass resolveClass; bool replacedDotOperator = false; - const QList<TypeOfExpression::Result> classObjectResults = + const QList<LookupItem> classObjectResults = resolveExpression.resolveBaseExpression(baseResults, m_completionOperator, &replacedDotOperator); QList<Symbol *> classObjectCandidates; - foreach (const TypeOfExpression::Result &r, classObjectResults) { - FullySpecifiedType ty = r.first.simplified(); + foreach (const LookupItem &r, classObjectResults) { + FullySpecifiedType ty = r.type().simplified(); if (Class *klass = ty->asClassType()) classObjectCandidates.append(klass); @@ -1108,13 +1108,13 @@ bool CppCodeCompletion::completeMember(const QList<TypeOfExpression::Result> &ba return false; } -bool CppCodeCompletion::completeScope(const QList<TypeOfExpression::Result> &results, +bool CppCodeCompletion::completeScope(const QList<LookupItem> &results, const LookupContext &context) { QList<Symbol *> classes, namespaces; - foreach (TypeOfExpression::Result result, results) { - FullySpecifiedType ty = result.first; + foreach (LookupItem result, results) { + FullySpecifiedType ty = result.type(); if (Class *classTy = ty->asClassType()) classes.append(classTy); @@ -1305,7 +1305,7 @@ void CppCodeCompletion::completeClass(const QList<Symbol *> &candidates, } } -bool CppCodeCompletion::completeQtMethod(const QList<TypeOfExpression::Result> &results, +bool CppCodeCompletion::completeQtMethod(const QList<LookupItem> &results, const LookupContext &context, bool wantSignals) { @@ -1321,8 +1321,8 @@ bool CppCodeCompletion::completeQtMethod(const QList<TypeOfExpression::Result> & o.setShowFunctionSignatures(true); QSet<QString> signatures; - foreach (const TypeOfExpression::Result &p, results) { - FullySpecifiedType ty = p.first.simplified(); + foreach (const LookupItem &p, results) { + FullySpecifiedType ty = p.type().simplified(); if (PointerType *ptrTy = ty->asPointerType()) ty = ptrTy->elementType().simplified(); diff --git a/src/plugins/cpptools/cppcodecompletion.h b/src/plugins/cpptools/cppcodecompletion.h index 8e93c6adc29..8d908e0b3e8 100644 --- a/src/plugins/cpptools/cppcodecompletion.h +++ b/src/plugins/cpptools/cppcodecompletion.h @@ -95,14 +95,14 @@ private: bool completeInclude(const QTextCursor &cursor); - bool completeConstructorOrFunction(const QList<CPlusPlus::TypeOfExpression::Result> &, + bool completeConstructorOrFunction(const QList<CPlusPlus::LookupItem> &, const CPlusPlus::LookupContext &, int endOfExpression, bool toolTipOnly); - bool completeMember(const QList<CPlusPlus::TypeOfExpression::Result> &, + bool completeMember(const QList<CPlusPlus::LookupItem> &, const CPlusPlus::LookupContext &context); - bool completeScope(const QList<CPlusPlus::TypeOfExpression::Result> &, + bool completeScope(const QList<CPlusPlus::LookupItem> &, const CPlusPlus::LookupContext &context); void completeNamespace(const QList<CPlusPlus::Symbol *> &candidates, @@ -114,15 +114,15 @@ private: bool completeConstructors(CPlusPlus::Class *klass); - bool completeQtMethod(const QList<CPlusPlus::TypeOfExpression::Result> &, + bool completeQtMethod(const QList<CPlusPlus::LookupItem> &, const CPlusPlus::LookupContext &context, bool wantSignals); - bool completeSignal(const QList<CPlusPlus::TypeOfExpression::Result> &results, + bool completeSignal(const QList<CPlusPlus::LookupItem> &results, const CPlusPlus::LookupContext &context) { return completeQtMethod(results, context, true); } - bool completeSlot(const QList<CPlusPlus::TypeOfExpression::Result> &results, + bool completeSlot(const QList<CPlusPlus::LookupItem> &results, const CPlusPlus::LookupContext &context) { return completeQtMethod(results, context, false); } -- GitLab