void tst_Misc::findBreakpoints3() { const QByteArray src("\n" // line 0 "int foo() {\n" " try {\n" // line 2 " bar();\n" // line 3 " } catch (Mooze &m) {\n" // line 4 " wooze();\n" // line 5 " }\n" " return 0;\n" // line 7 "}\n" ); Document::Ptr doc = Document::create("findCatchBreakpoint"); QVERIFY(!doc.isNull()); doc->setUtf8Source(src); bool success = doc->parse(); QVERIFY(success); QCOMPARE(doc->diagnosticMessages().size(), 0); FindCdbBreakpoint findBreakpoint(doc->translationUnit()); QCOMPARE(findBreakpoint(2), 3U); QCOMPARE(findBreakpoint(3), 3U); QCOMPARE(findBreakpoint(4), 5U); QCOMPARE(findBreakpoint(5), 5U); QCOMPARE(findBreakpoint(7), 7U); }
void tst_Misc::findBreakpoints2() { const QByteArray src("\n" // line 0 "void foo() {\n" " int a = 2;\n" // line 2 " switch (x) {\n" // line 3 " case 1: {\n" // line 4 " int y = 2;\n" // line 5 " y++;\n" " break;\n" // line 7 " }\n" " }\n" "}\n" ); Document::Ptr doc = Document::create("findSwitchBreakpoint"); QVERIFY(!doc.isNull()); doc->setUtf8Source(src); bool success = doc->parse(); QVERIFY(success); QCOMPARE(doc->diagnosticMessages().size(), 0); FindCdbBreakpoint findBreakpoint(doc->translationUnit()); QCOMPARE(findBreakpoint(0), 2U); QCOMPARE(findBreakpoint(1), 2U); QCOMPARE(findBreakpoint(2), 2U); QCOMPARE(findBreakpoint(3), 3U); QCOMPARE(findBreakpoint(4), 5U); QCOMPARE(findBreakpoint(5), 5U); QCOMPARE(findBreakpoint(6), 6U); QCOMPARE(findBreakpoint(7), 7U); }
std::string Database::getLastError(Connection& connection) const { Document::Ptr errorDoc = getLastErrorDoc(connection); if ( !errorDoc.isNull() && errorDoc->isType<std::string>("err") ) { return errorDoc->get<std::string>("err"); } return ""; }
void tst_Misc::findBreakpoints() { const QByteArray src("\n" // line 0 "class C {\n" " int a;\n" " C():\n" " a(0)\n" // line 4 " {\n" // line 5 " }\n" " void empty()\n" // line 7 " {\n" // line 8 " }\n" " void misc() \n" " { \n" // line 11 " if ( \n" // line 12 " a \n" // line 13 " && \n" // line 14 " b \n" // line 15 " ) \n" // line 16 " { \n" // line 17 " } \n" // line 18 " while ( \n" // line 19 " a \n" // line 20 " && \n" // line 21 " b \n" // line 22 " ) \n" // line 23 " { \n" // line 24 " } \n" // line 25 " do { \n" // line 26 " } \n" // line 27 " while ( \n" // line 28 " a \n" // line 39 " && \n" // line 30 " b \n" // line 31 " ); \n" // line 32 " } \n" "}; \n" ); Document::Ptr doc = Document::create("findContstructorBreakpoint"); QVERIFY(!doc.isNull()); doc->setUtf8Source(src); bool success = doc->parse(); QVERIFY(success); QCOMPARE(doc->diagnosticMessages().size(), 0); FindCdbBreakpoint findBreakpoint(doc->translationUnit()); QCOMPARE(findBreakpoint(0), 5U); QCOMPARE(findBreakpoint(7), 8U); QCOMPARE(findBreakpoint(11), 16U); QCOMPARE(findBreakpoint(17), 23U); QCOMPARE(findBreakpoint(18), 23U); }
/*! * \brief createSourceProcessor Create a new source processor, which will signal the * model manager when a document has been processed. * * Indexed file is truncated version of fully parsed document: copy of source * code and full AST will be dropped when indexing is done. * * \return a new source processor object, which the caller needs to delete when finished. */ CppSourceProcessor *CppModelManager::createSourceProcessor() { CppModelManager *that = instance(); return new CppSourceProcessor(that->snapshot(), [that](const Document::Ptr &doc) { const Document::Ptr previousDocument = that->document(doc->fileName()); const unsigned newRevision = previousDocument.isNull() ? 1U : previousDocument->revision() + 1; doc->setRevision(newRevision); that->emitDocumentUpdated(doc); doc->releaseSourceAndAST(); }); }
void Snapshot::remove(const QString &fileName) { Document::Ptr doc = _documents.value(fileName); if (!doc.isNull()) { const QString &path = doc->path(); QList<Document::Ptr> docs = _documentsByPath.value(path); docs.removeAll(doc); _documentsByPath[path] = docs; _documents.remove(fileName); } }
void CppEditorSupport::onDocumentUpdated(Document::Ptr doc) { if (doc.isNull()) return; if (doc->fileName() != fileName()) return; // some other document got updated if (doc->editorRevision() != editorRevision()) return; // outdated content, wait for a new document to be parsed // Update the ifdeffed-out blocks: QList<Document::Block> skippedBlocks = doc->skippedBlocks(); m_editorUpdates.ifdefedOutBlocks.clear(); m_editorUpdates.ifdefedOutBlocks.reserve(skippedBlocks.size()); foreach (const Document::Block &block, skippedBlocks) { m_editorUpdates.ifdefedOutBlocks.append(BlockRange(block.begin(), block.end())); }
void tst_Misc::diagnosticClient_warning() { const QByteArray src("\n" "using namespace ;\n" ); Document::Ptr doc = Document::create("diagnosticClient_warning"); QVERIFY(!doc.isNull()); doc->setSource(src); bool success = doc->parse(Document::ParseTranlationUnit); QVERIFY(success); QList<Document::DiagnosticMessage> diagnostics = doc->diagnosticMessages(); QVERIFY(diagnostics.size() == 1); const Document::DiagnosticMessage &msg = diagnostics.at(0); QCOMPARE(msg.level(), (int) Document::DiagnosticMessage::Warning); QCOMPARE(msg.line(), 1U); QCOMPARE(msg.column(), 17U); }
/// Currently, we return the end of fileName.cpp /// \todo take the definitions of the surrounding declarations into account QList<InsertionLocation> InsertionPointLocator::methodDefinition( Declaration *declaration) const { QList<InsertionLocation> result; if (!declaration) return result; const QString declFileName = QString::fromUtf8(declaration->fileName(), declaration->fileNameLength()); QString target = declFileName; if (!isSourceFile(declFileName)) { Internal::CppToolsPlugin *cpptools = Internal::CppToolsPlugin::instance(); QString candidate = cpptools->correspondingHeaderOrSource(declFileName); if (!candidate.isEmpty()) target = candidate; } Document::Ptr doc = m_refactoringChanges->file(target).cppDocument(); if (doc.isNull()) return result; Snapshot simplified = m_refactoringChanges->snapshot().simplified(doc); if (Symbol *s = simplified.findMatchingDefinition(declaration)) { if (Function *f = s->asFunction()) { if (f->isConst() == declaration->type().isConst() && f->isVolatile() == declaration->type().isVolatile()) return result; } } TranslationUnit *xUnit = doc->translationUnit(); unsigned tokenCount = xUnit->tokenCount(); if (tokenCount < 2) // no tokens available return result; unsigned line = 0, column = 0; xUnit->getTokenEndPosition(xUnit->tokenCount() - 2, &line, &column); const QLatin1String prefix("\n\n"); result.append(InsertionLocation(target, prefix, QString(), line, column)); return result; }
void tst_Misc::diagnosticClient_error() { const QByteArray src("\n" "class Foo {}\n" ); Document::Ptr doc = Document::create("diagnosticClient_error"); QVERIFY(!doc.isNull()); doc->setUtf8Source(src); bool success = doc->parse(Document::ParseTranlationUnit); QVERIFY(success); QList<Document::DiagnosticMessage> diagnostics = doc->diagnosticMessages(); QVERIFY(diagnostics.size() == 1); const Document::DiagnosticMessage &msg = diagnostics.at(0); QCOMPARE(msg.level(), (int) Document::DiagnosticMessage::Error); QCOMPARE(msg.line(), 2U); QCOMPARE(msg.column(), 1U); }
void CppEditorSupport::onDocumentUpdated(Document::Ptr doc) { if (doc.isNull()) return; if (doc->fileName() != fileName()) return; // some other document got updated if (doc->editorRevision() != editorRevision()) return; // outdated content, wait for a new document to be parsed // Update the ifdeffed-out blocks: if (m_highlightingSupport && !m_highlightingSupport->hightlighterHandlesIfdefedOutBlocks()) { QList<Document::Block> skippedBlocks = doc->skippedBlocks(); QList<BlockRange> ifdefedOutBlocks; ifdefedOutBlocks.reserve(skippedBlocks.size()); foreach (const Document::Block &block, skippedBlocks) ifdefedOutBlocks.append(BlockRange(block.begin(), block.end())); setIfdefedOutBlocks(ifdefedOutBlocks); }
void QuickToolBar::apply(TextEditor::BaseTextEditorWidget *editorWidget, Document::Ptr document, const ScopeChain *scopeChain, AST::Node *node, bool update, bool force) { if (!QuickToolBarSettings::get().enableContextPane && !force && !update) { contextWidget()->hide(); return; } if (document.isNull()) return; if (update && editorWidget != m_editorWidget) return; //do not update for different editor m_blockWriting = true; const ObjectValue *scopeObject = document->bind()->findQmlObject(node); bool isPropertyChanges = false; if (scopeChain && scopeObject) { m_prototypes.clear(); foreach (const ObjectValue *object, PrototypeIterator(scopeObject, scopeChain->context()).all()) { m_prototypes.append(object->className()); } if (m_prototypes.contains(QLatin1String("PropertyChanges"))) { isPropertyChanges = true; const ObjectValue *targetObject = getPropertyChangesTarget(node, *scopeChain); m_prototypes.clear(); if (targetObject) { foreach (const ObjectValue *object, PrototypeIterator(targetObject, scopeChain->context()).all()) { m_prototypes.append(object->className()); } } }
void BuiltinEditorDocumentParser::updateHelper(const WorkingCopy &theWorkingCopy) { if (filePath().isEmpty()) return; const Configuration baseConfig = configuration(); const bool releaseSourceAndAST_ = releaseSourceAndAST(); State baseState = state(); ExtraState state = extraState(); WorkingCopy workingCopy = theWorkingCopy; bool invalidateSnapshot = false, invalidateConfig = false, editorDefinesChanged_ = false; CppModelManager *modelManager = CppModelManager::instance(); QByteArray configFile = modelManager->codeModelConfiguration(); ProjectPartHeaderPaths headerPaths; QStringList precompiledHeaders; QString projectConfigFile; LanguageFeatures features = LanguageFeatures::defaultFeatures(); baseState.projectPart = determineProjectPart(filePath(), baseConfig, baseState); if (state.forceSnapshotInvalidation) { invalidateSnapshot = true; state.forceSnapshotInvalidation = false; } if (const ProjectPart::Ptr part = baseState.projectPart) { configFile += part->toolchainDefines; configFile += overwrittenToolchainDefines(*part.data()); configFile += part->projectDefines; headerPaths = part->headerPaths; projectConfigFile = part->projectConfigFile; if (baseConfig.usePrecompiledHeaders) precompiledHeaders = part->precompiledHeaders; features = part->languageFeatures; } if (configFile != state.configFile) { state.configFile = configFile; invalidateSnapshot = true; invalidateConfig = true; } if (baseConfig.editorDefines != baseState.editorDefines) { baseState.editorDefines = baseConfig.editorDefines; invalidateSnapshot = true; editorDefinesChanged_ = true; } if (headerPaths != state.headerPaths) { state.headerPaths = headerPaths; invalidateSnapshot = true; } if (projectConfigFile != state.projectConfigFile) { state.projectConfigFile = projectConfigFile; invalidateSnapshot = true; } if (precompiledHeaders != state.precompiledHeaders) { state.precompiledHeaders = precompiledHeaders; invalidateSnapshot = true; } unsigned rev = 0; if (Document::Ptr doc = state.snapshot.document(filePath())) rev = doc->revision(); else invalidateSnapshot = true; Snapshot globalSnapshot = modelManager->snapshot(); if (invalidateSnapshot) { state.snapshot = Snapshot(); } else { // Remove changed files from the snapshot QSet<Utils::FileName> toRemove; foreach (const Document::Ptr &doc, state.snapshot) { const Utils::FileName fileName = Utils::FileName::fromString(doc->fileName()); if (workingCopy.contains(fileName)) { if (workingCopy.get(fileName).second != doc->editorRevision()) addFileAndDependencies(&state.snapshot, &toRemove, fileName); continue; } Document::Ptr otherDoc = globalSnapshot.document(fileName); if (!otherDoc.isNull() && otherDoc->revision() != doc->revision()) addFileAndDependencies(&state.snapshot, &toRemove, fileName); } if (!toRemove.isEmpty()) { invalidateSnapshot = true; foreach (const Utils::FileName &fileName, toRemove) state.snapshot.remove(fileName); } }
void SnapshotUpdater::update(CppModelManager::WorkingCopy workingCopy) { QMutexLocker locker(&m_mutex); if (m_fileInEditor.isEmpty()) return; bool invalidateSnapshot = false, invalidateConfig = false, editorDefinesChanged = false; CppModelManager *modelManager = dynamic_cast<CppModelManager *>(CppModelManagerInterface::instance()); QByteArray configFile = modelManager->codeModelConfiguration(); QStringList includePaths; QStringList frameworkPaths; QStringList precompiledHeaders; updateProjectPart(); if (m_forceSnapshotInvalidation) { invalidateSnapshot = true; m_forceSnapshotInvalidation = false; } if (m_projectPart) { configFile += m_projectPart->toolchainDefines; configFile += m_projectPart->projectDefines; includePaths = m_projectPart->includePaths; frameworkPaths = m_projectPart->frameworkPaths; if (m_usePrecompiledHeaders) precompiledHeaders = m_projectPart->precompiledHeaders; } if (configFile != m_configFile) { m_configFile = configFile; invalidateSnapshot = true; invalidateConfig = true; } if (m_editorDefinesChangedSinceLastUpdate) { invalidateSnapshot = true; editorDefinesChanged = true; m_editorDefinesChangedSinceLastUpdate = false; } if (includePaths != m_includePaths) { m_includePaths = includePaths; invalidateSnapshot = true; } if (frameworkPaths != m_frameworkPaths) { m_frameworkPaths = frameworkPaths; invalidateSnapshot = true; } if (precompiledHeaders != m_precompiledHeaders) { m_precompiledHeaders = precompiledHeaders; invalidateSnapshot = true; } unsigned rev = 0; if (Document::Ptr doc = document()) rev = doc->revision(); else invalidateSnapshot = true; Snapshot globalSnapshot = modelManager->snapshot(); if (invalidateSnapshot) { m_snapshot = Snapshot(); } else { // Remove changed files from the snapshot QSet<QString> toRemove; foreach (const Document::Ptr &doc, m_snapshot) { QString fileName = doc->fileName(); if (workingCopy.contains(fileName)) { if (workingCopy.get(fileName).second != doc->editorRevision()) addFileAndDependencies(&toRemove, fileName); continue; } Document::Ptr otherDoc = globalSnapshot.document(fileName); if (!otherDoc.isNull() && otherDoc->revision() != doc->revision()) addFileAndDependencies(&toRemove, fileName); } if (!toRemove.isEmpty()) { invalidateSnapshot = true; foreach (const QString &fileName, toRemove) m_snapshot.remove(fileName); }