QList<QmlJSEditor::FindReferences::Usage> FindImplementation::run(const QString &fileName, const QString &typeName, const QString &itemName) { QList<QmlJSEditor::FindReferences::Usage> usages; QmlJS::ModelManagerInterface *modelManager = ModelManagerInterface::instance(); //Parse always the latest version of document QmlJS::Dialect dialect = QmlJS::ModelManagerInterface::guessLanguageOfFile(fileName); QmlJS::Document::MutablePtr documentUpdate = QmlJS::Document::create(fileName, dialect); documentUpdate->setSource(modelManager->workingCopy().source(fileName)); if (documentUpdate->parseQml()) modelManager->updateDocument(documentUpdate); Document::Ptr document = modelManager->snapshot().document(fileName); if (!document) return usages; QmlJS::Link link(modelManager->snapshot(), modelManager->defaultVContext(document->language(), document), modelManager->builtins(document)); ContextPtr context = link(); ScopeChain scopeChain(document, context); const ObjectValue *targetValue = scopeChain.context()->lookupType(document.data(), QStringList(typeName)); FindImplementationVisitor visitor(document, context); FindImplementationVisitor::Results results = visitor(typeName, itemName, targetValue); foreach (const AST::SourceLocation &location, results) { usages.append(QmlJSEditor::FindReferences::Usage(fileName, matchingLine(location.offset, document->source()), location.startLine, location.startColumn - 1, location.length)); }
QT_END_NAMESPACE static inline bool checkIfDerivedFromItem(const QString &fileName) { return true; QmlJS::Snapshot snapshot; QmlJS::ModelManagerInterface *modelManager = QmlJS::ModelManagerInterface::instance(); if (modelManager) snapshot = modelManager->snapshot(); QFile file(fileName); if (!file.open(QIODevice::ReadOnly)) return false; QByteArray source = file.readAll(); file.close(); QmlJS::Document::MutablePtr document = QmlJS::Document::create(fileName.isEmpty() ? QStringLiteral("<internal>") : fileName, QmlJS::Dialect::Qml); document->setSource(source); document->parseQml(); if (!document->isParsedCorrectly()) return false; snapshot.insert(document); QmlJS::Link link(snapshot, modelManager->defaultVContext(document->language(), document), QmlJS::ModelManagerInterface::instance()->builtins(document)); QList<QmlJS::DiagnosticMessage> diagnosticLinkMessages; QmlJS::ContextPtr context = link(document, &diagnosticLinkMessages); QmlJS::AST::UiObjectMember *astRootNode = 0; if (QmlJS::AST::UiProgram *program = document->qmlProgram()) if (program->members) astRootNode = program->members->member; QmlJS::AST::UiObjectDefinition *definition = QmlJS::AST::cast<QmlJS::AST::UiObjectDefinition *>(astRootNode); if (!definition) return false; const QmlJS::ObjectValue *objectValue = context->lookupType(document.data(), definition->qualifiedTypeNameId); QList<const QmlJS::ObjectValue *> prototypes = QmlJS::PrototypeIterator(objectValue, context).all(); foreach (const QmlJS::ObjectValue *prototype, prototypes) { if (prototype->className() == "Item") return true; } return false; }