void QmlJSTextEditorWidget::onDocumentUpdated(QmlJS::Document::Ptr doc) { if (editorDocument()->filePath() != doc->fileName()) return; if (doc->editorRevision() != editorRevision()) { // Maybe a dependency changed and our semantic info is now outdated. // Ignore 0-revision documents though, we get them when a file is initially opened // in an editor. if (doc->editorRevision() != 0) updateSemanticInfo(); return; } //qDebug() << doc->fileName() << "was reparsed"; if (doc->ast()) { // got a correctly parsed (or recovered) file. m_futureSemanticInfoRevision = doc->editorRevision(); m_semanticInfoUpdater->update(doc, m_modelManager->snapshot()); setExtraSelections(CodeWarningsSelection, QList<QTextEdit::ExtraSelection>()); } else if (Document::isFullySupportedLanguage(doc->language())) { // show parsing errors QList<QTextEdit::ExtraSelection> selections; appendExtraSelectionsForMessages(&selections, doc->diagnosticMessages(), document()); setExtraSelections(CodeWarningsSelection, selections); } else { setExtraSelections(CodeWarningsSelection, QList<QTextEdit::ExtraSelection>()); } }
void QmlProfilerDetailsRewriter::rewriteDetailsForLocation(QTextStream &textDoc, QmlJS::Document::Ptr doc, int requestId, const QmlDebug::QmlEventLocation &location) { PropertyVisitor propertyVisitor; QmlJS::AST::Node *node = propertyVisitor(doc->ast(), location.line, location.column); if (!node) return; qint64 startPos = node->firstSourceLocation().begin(); qint64 len = node->lastSourceLocation().end() - startPos; textDoc.seek(startPos); QString details = textDoc.read(len).replace(QLatin1Char('\n'), QLatin1Char(' ')).simplified(); emit rewriteDetailsString(requestId, details); }
static bool checkQmlDocumentForQuickTestCode(QFutureInterface<TestParseResultPtr> futureInterface, const QmlJS::Document::Ptr &qmlJSDoc, const Core::Id &id, const QString &proFile = QString()) { if (qmlJSDoc.isNull()) return false; QmlJS::AST::Node *ast = qmlJSDoc->ast(); QTC_ASSERT(ast, return false); TestQmlVisitor qmlVisitor(qmlJSDoc); QmlJS::AST::Node::accept(ast, &qmlVisitor); const QString testCaseName = qmlVisitor.testCaseName(); const TestCodeLocationAndType tcLocationAndType = qmlVisitor.testCaseLocation(); const QMap<QString, TestCodeLocationAndType> &testFunctions = qmlVisitor.testFunctions(); QuickTestParseResult *parseResult = new QuickTestParseResult(id); parseResult->proFile = proFile; parseResult->itemType = TestTreeItem::TestCase; QMap<QString, TestCodeLocationAndType>::ConstIterator it = testFunctions.begin(); const QMap<QString, TestCodeLocationAndType>::ConstIterator end = testFunctions.end(); for ( ; it != end; ++it) { const TestCodeLocationAndType &loc = it.value(); QuickTestParseResult *funcResult = new QuickTestParseResult(id); funcResult->name = it.key(); funcResult->displayName = it.key(); funcResult->itemType = loc.m_type; funcResult->fileName = loc.m_name; funcResult->line = loc.m_line; funcResult->column = loc.m_column; funcResult->proFile = proFile; parseResult->children.append(funcResult); } if (!testCaseName.isEmpty()) { parseResult->fileName = tcLocationAndType.m_name; parseResult->name = testCaseName; parseResult->line = tcLocationAndType.m_line; parseResult->column = tcLocationAndType.m_column; } futureInterface.reportResult(TestParseResultPtr(parseResult)); return true; }