void dumpAST(InsertIntoDUChain& code) { DUChainReadLocker lock; Q_ASSERT(!code->parsingEnvironmentFile()->isProxyContext()); ParseSession::Ptr session(dynamic_cast<ParseSession*>(code->ast().data())); Q_ASSERT(session); Cpp::DumpChain dump; dump.dump(session->topAstNode(), session.data()); }
ReferencedTopDUContext ContextBuilder::buildContexts(Cpp::EnvironmentFilePointer file, AST *node, IncludeFileList* includes, const ReferencedTopDUContext& updateContext, bool removeOldImports) { Q_ASSERT(file); setCompilingContexts(true); { DUChainWriteLocker lock(DUChain::lock()); if(updateContext && (updateContext->parsingEnvironmentFile() && updateContext->parsingEnvironmentFile()->isProxyContext())) { kDebug(9007) << "updating a context " << file->url().str() << " from a proxy-context to a content-context"; updateContext->parsingEnvironmentFile()->setIsProxyContext(false); } } if(editor()->currentUrl() != file->url()) editor()->setCurrentUrl(file->url(), true); ReferencedTopDUContext topLevelContext; { DUChainWriteLocker lock(DUChain::lock()); topLevelContext = updateContext; if( topLevelContext && topLevelContext->smartRange() && !(topLevelContext->parsingEnvironmentFile() && topLevelContext->parsingEnvironmentFile()->isProxyContext())) if (topLevelContext->smartRange()->parentRange()) { //Top-range must have no parent, else something is wrong with the structure kWarning() << *topLevelContext->smartRange() << "erroneously has a parent range" << *topLevelContext->smartRange()->parentRange(); Q_ASSERT(false); } if (topLevelContext) { kDebug(9007) << "ContextBuilder::buildContexts: recompiling"; setRecompiling(true); if (compilingContexts()) { // To here... LockedSmartInterface iface = editor()->smart(); if (iface && topLevelContext->range().textRange() != iface.currentDocument()->documentRange()) { topLevelContext->setRange(SimpleRange(iface.currentDocument()->documentRange())); //This happens the whole file is deleted, and then a space inserted. kDebug(9007) << "WARNING: Top-level context has wrong size: " << topLevelContext->range().textRange() << " should be: " << iface.currentDocument()->documentRange(); } } DUChain::self()->updateContextEnvironment( topLevelContext, const_cast<Cpp::EnvironmentFile*>(file.data() ) ); } else { kDebug(9007) << "ContextBuilder::buildContexts: compiling"; setRecompiling(false); Q_ASSERT(compilingContexts()); LockedSmartInterface iface = editor()->smart(); topLevelContext = new CppDUContext<TopDUContext>(editor()->currentUrl(), iface.currentDocument() ? SimpleRange(iface.currentDocument()->documentRange()) : SimpleRange(SimpleCursor(0,0), SimpleCursor(INT_MAX, INT_MAX)), const_cast<Cpp::EnvironmentFile*>(file.data())); topLevelContext->setSmartRange(editor()->topRange(iface, CppEditorIntegrator::DefinitionUseChain), DocumentRangeObject::Own); topLevelContext->setType(DUContext::Global); topLevelContext->setFlags((TopDUContext::Flags)(TopDUContext::UpdatingContext | topLevelContext->flags())); DUChain::self()->addDocumentChain(topLevelContext); topLevelContext->updateImportsCache(); //Mark that we will use a cached import-structure } setEncountered(topLevelContext); if (includes) { if(removeOldImports) { foreach (const DUContext::Import &parent, topLevelContext->importedParentContexts()) if (!containsContext(*includes, dynamic_cast<TopDUContext*>(parent.context(0)))) topLevelContext->removeImportedParentContext(parent.context(0)); } QList< QPair<TopDUContext*, SimpleCursor> > realIncluded; QList< QPair<TopDUContext*, SimpleCursor> > realTemporaryIncluded; foreach (const LineContextPair &included, *includes) if(!included.temporary) realIncluded << qMakePair(included.context.data(), SimpleCursor(included.sourceLine, 0)); else realTemporaryIncluded << qMakePair(included.context.data(), SimpleCursor(included.sourceLine, 0)); topLevelContext->addImportedParentContexts(realIncluded); topLevelContext->addImportedParentContexts(realTemporaryIncluded, true); topLevelContext->updateImportsCache(); } } { DUChainReadLocker lock(DUChain::lock()); //If we're debugging the current file, dump its preprocessed contents and the AST ifDebugFile( HashedString(file->identity().url().str()), { kDebug() << stringFromContents(editor()->parseSession()->contentsVector()); Cpp::DumpChain dump; dump.dump(node, editor()->parseSession()); } );