SVN commit 792373 by zwabel: Add a mechanism to debug mutual manipulation of kate smart-ranges, and add debug-output when a context-range is bad(end < start) M +25 -1 contextbuilder.cpp M +6 -0 contextbuilder.h --- trunk/KDE/kdevelop/languages/cpp/cppduchain/contextbuilder.cpp #792372:792373 @@ -552,7 +552,8 @@ DUContext* ContextBuilder::openContextInternal(const KDevelop::SimpleRange& range, DUContext::ContextType type, const QualifiedIdentifier& identifier) { DUContext* ret = 0L; - + if(range.start > range.end) + kDebug(9007) << "Bad context-range" << range.textRange(); { DUChainReadLocker readLock(DUChain::lock()); @@ -589,10 +590,19 @@ readLock.unlock(); DUChainWriteLocker writeLock(DUChain::lock()); +#ifdef DEBUG_CONTEXT_RANGES + checkRanges(); +#endif + ret = new CppDUContext(m_editor->currentUrl(), SimpleRange(range), m_contextStack.isEmpty() ? 0 : currentContext()); ret->setSmartRange(m_editor->createRange(range.textRange()), DocumentRangeObject::Own); ret->setType(type); +#ifdef DEBUG_CONTEXT_RANGES + m_contextRanges[ret] = range; + checkRanges(); +#endif + if (!identifier.isEmpty()) { ret->setLocalScopeIdentifier(identifier); @@ -619,6 +629,20 @@ return ret; } +#ifdef DEBUG_CONTEXT_RANGES +void ContextBuilder::checkRanges() +{ + for(QHash::iterator it = m_contextRanges.begin(); it != m_contextRanges.end(); ) { + if(it.key()->range() != *it) { + kDebug(9007) << "Range of" << it.key()->scopeIdentifier(true).toString() << "changed from" << (*it).textRange() << "to" << it.key()->range().textRange() << "at\n" << kBacktrace(); + it = m_contextRanges.erase(it); //Remove it so we see each change only once + }else{ + ++it; + } + } +} +#endif + void ContextBuilder::openContext(DUContext* newContext) { m_contextStack.push(newContext); --- trunk/KDE/kdevelop/languages/cpp/cppduchain/contextbuilder.h #792372:792373 @@ -32,6 +32,8 @@ #include #include "cppduchainexport.h" +//Uncomment this to debug what happens to context ranges when new ones are inserted +//#define DEBUG_CONTEXT_RANGES namespace KDevelop { @@ -220,6 +222,10 @@ inline int& nextContextIndex() { return m_nextContextStack.top(); } +#ifdef DEBUG_CONTEXT_RANGES + void checkRanges(); + QHash m_contextRanges; +#endif QList m_importedParentContexts; };