diff --git a/src/libs/cplusplus/LookupContext.cpp b/src/libs/cplusplus/LookupContext.cpp index ecf54a5f1a3..87ed0b3f26b 100644 --- a/src/libs/cplusplus/LookupContext.cpp +++ b/src/libs/cplusplus/LookupContext.cpp @@ -160,16 +160,19 @@ LookupContext::LookupContext(Document::Ptr thisDocument, : _expressionDocument(Document::create(QLatin1String(""))) , _thisDocument(thisDocument) , _snapshot(snapshot) + , _bindings(new CreateBindings(thisDocument, snapshot)) , m_expandTemplates(false) { } LookupContext::LookupContext(Document::Ptr expressionDocument, Document::Ptr thisDocument, - const Snapshot &snapshot) + const Snapshot &snapshot, + QSharedPointer bindings) : _expressionDocument(expressionDocument) , _thisDocument(thisDocument) , _snapshot(snapshot) + , _bindings(bindings) , m_expandTemplates(false) { } @@ -277,21 +280,6 @@ QList LookupContext::lookupByUsing(const Name *name, Scope *scope) c } -QSharedPointer LookupContext::bindings() const -{ - if (! _bindings) { - _bindings = QSharedPointer(new CreateBindings(_thisDocument, _snapshot)); - _bindings->setExpandTemplates(m_expandTemplates); - } - - return _bindings; -} - -void LookupContext::setBindings(QSharedPointer bindings) -{ - _bindings = bindings; -} - Document::Ptr LookupContext::expressionDocument() const { return _expressionDocument; } @@ -533,6 +521,7 @@ ClassOrNamespace::ClassOrNamespace(CreateBindings *factory, ClassOrNamespace *pa , _name(0) #endif // DEBUG_LOOKUP { + Q_ASSERT(factory); } ClassOrNamespace::~ClassOrNamespace() diff --git a/src/libs/cplusplus/LookupContext.h b/src/libs/cplusplus/LookupContext.h index 84c9d470069..4b11ad4caf8 100644 --- a/src/libs/cplusplus/LookupContext.h +++ b/src/libs/cplusplus/LookupContext.h @@ -63,8 +63,11 @@ class CreateBindings; class CPLUSPLUS_EXPORT ClassOrNamespace { -public: + Q_DISABLE_COPY(ClassOrNamespace) + ClassOrNamespace(CreateBindings *factory, ClassOrNamespace *parent); + +public: ~ClassOrNamespace(); const TemplateNameId *templateId() const; @@ -286,7 +289,8 @@ public: LookupContext(Document::Ptr expressionDocument, Document::Ptr thisDocument, - const Snapshot &snapshot); + const Snapshot &snapshot, + QSharedPointer bindings = QSharedPointer()); LookupContext(const LookupContext &other); LookupContext &operator = (const LookupContext &other); @@ -308,10 +312,8 @@ public: ClassOrNamespace *lookupParent(Symbol *symbol) const; /// \internal - QSharedPointer bindings() const; - - /// \internal - void setBindings(QSharedPointer bindings); + QSharedPointer bindings() const + { return _bindings; } static QList fullyQualifiedName(Symbol *symbol); static QList path(Symbol *symbol); @@ -338,7 +340,7 @@ private: Snapshot _snapshot; // Bindings - mutable QSharedPointer _bindings; + QSharedPointer _bindings; bool m_expandTemplates; }; diff --git a/src/libs/cplusplus/ResolveExpression.cpp b/src/libs/cplusplus/ResolveExpression.cpp index 9470efc2b4c..99bdc7b0cd7 100644 --- a/src/libs/cplusplus/ResolveExpression.cpp +++ b/src/libs/cplusplus/ResolveExpression.cpp @@ -1150,7 +1150,7 @@ ClassOrNamespace *ResolveExpression::findClassForTemplateParameterInExpressionSc ClassOrNamespace *resultBinding, const FullySpecifiedType &ty) const { - if (resultBinding && resultBinding->instantiationOrigin()) { + if (resultBinding) { if (ClassOrNamespace *origin = resultBinding->instantiationOrigin()) { foreach (Symbol *originSymbol, origin->symbols()) { if (Scope *originScope = originSymbol->asScope()) { diff --git a/src/libs/cplusplus/TypeOfExpression.cpp b/src/libs/cplusplus/TypeOfExpression.cpp index d31567798dd..b7bab3b033d 100644 --- a/src/libs/cplusplus/TypeOfExpression.cpp +++ b/src/libs/cplusplus/TypeOfExpression.cpp @@ -48,17 +48,6 @@ TypeOfExpression::TypeOfExpression(): { } -void TypeOfExpression::reset() -{ - m_thisDocument.clear(); - m_snapshot = Snapshot(); - m_ast = 0; - m_scope = 0; - m_lookupContext = LookupContext(); - m_bindings.clear(); - m_environment.clear(); -} - void TypeOfExpression::init(Document::Ptr thisDocument, const Snapshot &snapshot, QSharedPointer bindings, const QSet &autoDeclarationsBeingResolved) @@ -68,7 +57,12 @@ void TypeOfExpression::init(Document::Ptr thisDocument, const Snapshot &snapshot m_ast = 0; m_scope = 0; m_lookupContext = LookupContext(); + + Q_ASSERT(m_bindings.isNull()); m_bindings = bindings; + if (m_bindings.isNull()) + m_bindings.reset(new CreateBindings(thisDocument, snapshot)); + m_environment.clear(); m_autoDeclarationsBeingResolved = autoDeclarationsBeingResolved; } @@ -111,17 +105,12 @@ QList TypeOfExpression::operator()(ExpressionAST *expression, m_scope = scope; m_documents.append(document); - m_lookupContext = LookupContext(document, m_thisDocument, m_snapshot); - m_lookupContext.setBindings(m_bindings); + m_lookupContext = LookupContext(document, m_thisDocument, m_snapshot, m_bindings); + Q_ASSERT(!m_bindings.isNull()); m_lookupContext.setExpandTemplates(m_expandTemplates); ResolveExpression resolve(m_lookupContext, m_autoDeclarationsBeingResolved); - const QList items = resolve(m_ast, scope); - - if (! m_bindings) - m_lookupContext = resolve.context(); - - return items; + return resolve(m_ast, scope); } QList TypeOfExpression::reference(ExpressionAST *expression, @@ -133,17 +122,12 @@ QList TypeOfExpression::reference(ExpressionAST *expression, m_scope = scope; m_documents.append(document); - m_lookupContext = LookupContext(document, m_thisDocument, m_snapshot); - m_lookupContext.setBindings(m_bindings); + m_lookupContext = LookupContext(document, m_thisDocument, m_snapshot, m_bindings); + Q_ASSERT(!m_bindings.isNull()); m_lookupContext.setExpandTemplates(m_expandTemplates); ResolveExpression resolve(m_lookupContext, m_autoDeclarationsBeingResolved); - const QList items = resolve.reference(m_ast, scope); - - if (! m_bindings) - m_lookupContext = resolve.context(); - - return items; + return resolve.reference(m_ast, scope); } QByteArray TypeOfExpression::preprocess(const QByteArray &utf8code) const diff --git a/src/libs/cplusplus/TypeOfExpression.h b/src/libs/cplusplus/TypeOfExpression.h index 19aa81c1949..c02ad2d9133 100644 --- a/src/libs/cplusplus/TypeOfExpression.h +++ b/src/libs/cplusplus/TypeOfExpression.h @@ -65,8 +65,6 @@ public: const QSet &autoDeclarationsBeingResolved = QSet()); - void reset(); - enum PreprocessMode { NoPreprocess, Preprocess