SVN commit 815016 by zwabel: Performance improvement: Remove unneeded and unused matching code, which also called qualifiedIdentifier() which is slow M +7 -95 ducontext.cpp M +2 -2 ducontext.h --- trunk/KDE/kdevplatform/language/duchain/ducontext.cpp #815015:815016 @@ -422,26 +422,21 @@ return d_func()->m_propagateDeclarations; } -QList DUContext::findLocalDeclarations( const QualifiedIdentifier& identifier, const SimpleCursor & position, const TopDUContext* topContext, const AbstractType::Ptr& dataType, bool allowUnqualifiedMatch, SearchFlags flags ) const +QList DUContext::findLocalDeclarations( const QualifiedIdentifier& identifier, const SimpleCursor & position, const TopDUContext* topContext, const AbstractType::Ptr& dataType, SearchFlags flags ) const { ENSURE_CAN_READ QList ret; - findLocalDeclarationsInternal(identifier, position.isValid() ? position : range().end, dataType, allowUnqualifiedMatch, ret, topContext ? topContext->importTrace(this->topContext()) : ImportTrace(), flags); + findLocalDeclarationsInternal(identifier, position.isValid() ? position : range().end, dataType, ret, topContext ? topContext->importTrace(this->topContext()) : ImportTrace(), flags); return ret; } -void DUContext::findLocalDeclarationsInternal( const QualifiedIdentifier& identifier, const SimpleCursor & position, const AbstractType::Ptr& dataType, bool allowUnqualifiedMatch, QList& ret, const ImportTrace& trace, SearchFlags flags ) const +void DUContext::findLocalDeclarationsInternal( const QualifiedIdentifier& identifier, const SimpleCursor & position, const AbstractType::Ptr& dataType, QList& ret, const ImportTrace& trace, SearchFlags flags ) const { Q_D(const DUContext); if( identifier.explicitlyGlobal() && parentContext() ) return; - ///@todo use flags - QLinkedList tryToResolve; - QLinkedList ensureResolution; - QList resolved; - { QMutexLocker lock(&DUContextPrivate::m_localDeclarationsMutex); Identifier lastIdentifier = identifier.last(); @@ -463,94 +458,11 @@ if((flags & OnlyFunctions) && !dynamic_cast(declaration)) continue; - QualifiedIdentifier::MatchTypes m = identifier.match(declaration->identifier()); - switch (m) { - case QualifiedIdentifier::NoMatch: - continue; - - case QualifiedIdentifier::EndsWith: - // identifier is a more complete specification... - // Try again with a qualified definition identifier - ensureResolution.append(declaration); - continue; - - case QualifiedIdentifier::TargetEndsWith : ///NOTE: This cannot happen, because declaration() identifier is of type Identifier - // definition is a more complete specification... - if (!allowUnqualifiedMatch) - tryToResolve.append(declaration); - else - resolved.append(declaration); - continue; - - case QualifiedIdentifier::ExactMatch: - if (!allowUnqualifiedMatch) - ensureResolution.append(declaration); - else - resolved.append(declaration); - continue; - } + if (!dataType || dataType == declaration->abstractType()) + if (type() == Class || type() == Template || position > declaration->range().start || !position.isValid()) ///@todo This is C++-specific + ret.append(declaration); } } - - foreach (Declaration* declaration, resolved) - if (!dataType || dataType == declaration->abstractType()) - if (type() == Class || type() == Template || position > declaration->range().start || !position.isValid()) ///@todo This is C++-specific - ret.append(declaration); - - if (tryToResolve.isEmpty() && ensureResolution.isEmpty()) - return; - - QMutableLinkedListIterator it = ensureResolution; - while (it.hasNext()) { - QualifiedIdentifier::MatchTypes m = identifier.match(it.next()->qualifiedIdentifier()); - switch (m) { - case QualifiedIdentifier::NoMatch: - case QualifiedIdentifier::EndsWith: - break; - - case QualifiedIdentifier::TargetEndsWith: - case QualifiedIdentifier::ExactMatch: - resolved.append(it.value()); - break; - } - } - - foreach (Declaration* declaration, resolved) - if (!dataType || dataType == declaration->abstractType()) - if (type() == Class || position >= declaration->range().start || !position.isValid()) ///@todo This is C++-specific - ret.append(declaration); - - if (!ret.isEmpty()) - // Match(es) - return; - - it = tryToResolve; - while (it.hasNext()) { - QualifiedIdentifier::MatchTypes m = identifier.match(it.next()->qualifiedIdentifier()); - switch (m) { - case QualifiedIdentifier::NoMatch: - case QualifiedIdentifier::EndsWith: - break; - - case QualifiedIdentifier::TargetEndsWith: - case QualifiedIdentifier::ExactMatch: - resolved.append(it.value()); - break; - } - } - - foreach (Declaration* declaration, resolved) - if (!dataType || dataType == declaration->abstractType()) - if (type() == Class || position >= declaration->range().start || !position.isValid()) ///@todo This is C++-specific - ret.append(declaration); - - //if (!ret.isEmpty()) - // Match(es)... don't need to check, returning anyway - - - // TODO: namespace abbreviations - - return; } bool DUContext::foundEnough( const QList& ret ) const { @@ -565,7 +477,7 @@ Q_D(const DUContext); if( type() != Namespace ) { //If we're in a namespace, delay all the searching into the top-context, because only that has the overview to pick the correct declarations. foreach( const QualifiedIdentifier& identifier, baseIdentifiers ) - findLocalDeclarationsInternal(identifier, position, dataType, flags & InImportedParentContext, ret, trace, flags); + findLocalDeclarationsInternal(identifier, position, dataType, ret, trace, flags); if( foundEnough(ret) ) return true; --- trunk/KDE/kdevplatform/language/duchain/ducontext.h #815015:815016 @@ -295,7 +295,7 @@ * * Does not search imported parent-contexts(like base-classes). */ - QList findLocalDeclarations(const QualifiedIdentifier& identifier, const SimpleCursor& position = SimpleCursor::invalid(), const TopDUContext* topContext = 0, const AbstractType::Ptr& dataType = AbstractType::Ptr(), bool allowUnqualifiedMatch = false, SearchFlags flags = NoSearchFlags) const; + QList findLocalDeclarations(const QualifiedIdentifier& identifier, const SimpleCursor& position = SimpleCursor::invalid(), const TopDUContext* topContext = 0, const AbstractType::Ptr& dataType = AbstractType::Ptr(), SearchFlags flags = NoSearchFlags) const; /** * Clears all local declarations. Does not delete the declaration; the caller @@ -494,7 +494,7 @@ /// Logic for calculating the fully qualified scope name QualifiedIdentifier scopeIdentifierInternal(DUContext* context) const; - virtual void findLocalDeclarationsInternal( const QualifiedIdentifier& identifier, const SimpleCursor & position, const AbstractType::Ptr& dataType, bool allowUnqualifiedMatch, QList& ret, const ImportTrace& trace, SearchFlags flags ) const; + virtual void findLocalDeclarationsInternal( const QualifiedIdentifier& identifier, const SimpleCursor & position, const AbstractType::Ptr& dataType, QList& ret, const ImportTrace& trace, SearchFlags flags ) const; /// Context search implementation virtual void findContextsInternal(ContextType contextType, const QList& identifier, const SimpleCursor& position, QList& ret, SearchFlags flags = NoSearchFlags) const;