ref #549 "added qmldir scanner"

This commit is contained in:
Andrei Yankovich 2021-03-27 11:14:14 +03:00
parent 150e5c7f0b
commit bb5d66e573
4 changed files with 64 additions and 21 deletions

View File

@ -13,7 +13,27 @@
#include "deploycore.h" #include "deploycore.h"
#include "deployconfig.h" #include "deployconfig.h"
QStringList QML::extractImportsFromFile(const QString &filepath) { QStringList QML::extractImportLine(const QString& line) const {
QStringList result;
QStringList list = line.split(" ", QString::SkipEmptyParts);
if (list.count() == 3 || (list.count() == 5 && list[3] == "as")) {
if (list[2] == "auto") {
// qt6
result << (list[1].replace(".", "/"));
return {};
}
// qt5
result << (list[2][0] + "#" + list[1].replace(".", "/"));
} else if (list.count() == 2 || (list.count() == 4 && list[2] == "as")) {
// qt6
result << (list[1].replace(".", "/"));
}
return result;
}
QStringList QML::extractImportsFromFile(const QString &filepath) const {
QStringList imports; QStringList imports;
QFile F(filepath); QFile F(filepath);
if (!F.open(QIODevice::ReadOnly)) return QStringList(); if (!F.open(QIODevice::ReadOnly)) return QStringList();
@ -29,20 +49,7 @@ QStringList QML::extractImportsFromFile(const QString &filepath) {
if (word.startsWith("//")) continue; if (word.startsWith("//")) continue;
if (!word.startsWith("import")) continue; if (!word.startsWith("import")) continue;
QStringList list = word.split(" ", QString::SkipEmptyParts); imports += extractImportLine(word);
if (list.count() == 3 || (list.count() == 5 && list[3] == "as")) {
if (list[2] == "auto") {
// qt6
imports << (list[1].replace(".", "/"));
continue;
}
// qt5
imports << (list[2][0] + "#" + list[1].replace(".", "/"));
} else if (list.count() == 2 || (list.count() == 4 && list[2] == "as")) {
// qt6
imports << (list[1].replace(".", "/"));
}
} }
return imports; return imports;
@ -56,6 +63,8 @@ bool QML::extractImportsFromDir(const QString &path, bool recursive) {
} }
auto files = dir.entryInfoList(QStringList() << "*.qml" << "*.QML", QDir::Files); auto files = dir.entryInfoList(QStringList() << "*.qml" << "*.QML", QDir::Files);
auto qmlmodule = dir.entryInfoList(QStringList() << "qmldir", QDir::Files);
auto dirs = dir.entryInfoList(QDir::NoDotAndDotDot | QDir::Dirs); auto dirs = dir.entryInfoList(QDir::NoDotAndDotDot | QDir::Dirs);
for (const auto &info: files) { for (const auto &info: files) {
@ -68,6 +77,17 @@ bool QML::extractImportsFromDir(const QString &path, bool recursive) {
} }
} }
for (const auto& module: qAsConst(qmlmodule)) {
QStringList imports = extractImportsFromQmlModule(module.absoluteFilePath());
for (auto import : imports) {
if (!_imports.contains(import)) {
_imports.insert(import);
extractImportsFromDir(getPathFromImport(import), recursive);
}
}
}
if (recursive) { if (recursive) {
for (const auto &info: dirs) { for (const auto &info: dirs) {
extractImportsFromDir(info.absoluteFilePath(), recursive); extractImportsFromDir(info.absoluteFilePath(), recursive);
@ -156,8 +176,23 @@ bool QML::scanQmlTree(const QString &qmlTree) {
return true; return true;
} }
void QML::addImport() { QStringList QML::extractImportsFromQmlModule(const QString &module) const {
QStringList imports;
QFile F(module);
if (!F.open(QIODevice::ReadOnly)) return QStringList();
QString content = F.readAll();
for (QString line : content.split("\n")) {
line = line.simplified();
if (line.startsWith("//") || line.startsWith("#")) continue;
if (!line.startsWith("depends")) continue;
QStringList list = line.split(" ", QString::SkipEmptyParts);
imports += extractImportLine(line);
}
return imports;
} }
QML::QML(const QString &qmlRoot) { QML::QML(const QString &qmlRoot) {

View File

@ -15,7 +15,7 @@
class DEPLOYSHARED_EXPORT QML { class DEPLOYSHARED_EXPORT QML {
private: private:
QStringList extractImportsFromFile(const QString &filepath); QStringList extractImportsFromFile(const QString &filepath) const;
bool extractImportsFromDir(const QString &path, bool recursive = false); bool extractImportsFromDir(const QString &path, bool recursive = false);
@ -23,11 +23,13 @@ private:
bool deployPath( const QString& path, QStringList& res); bool deployPath( const QString& path, QStringList& res);
bool scanQmlTree(const QString& qmlTree); bool scanQmlTree(const QString& qmlTree);
void addImport(); QStringList extractImportsFromQmlModule(const QString& module) const;
QString _qmlRoot = ""; QString _qmlRoot = "";
QSet<QString> _imports; QSet<QString> _imports;
QSet<QString> secondVersions; QSet<QString> secondVersions;
QStringList extractImportLine(const QString &line) const;
public: public:
QML(const QString& qmlRoot); QML(const QString& qmlRoot);

View File

@ -1305,7 +1305,10 @@ QSet<QString> ModulesQt513::qmlVirtualKeyBoadrLibs(const QString &distDir) const
"./" + distDir + "/qml/QtQuick/VirtualKeyboard/Styles/qmldir", "./" + distDir + "/qml/QtQuick/VirtualKeyboard/Styles/qmldir",
"./" + distDir + "/qml/QtQuick/VirtualKeyboard/libqtquickvirtualkeyboardplugin.so", "./" + distDir + "/qml/QtQuick/VirtualKeyboard/libqtquickvirtualkeyboardplugin.so",
"./" + distDir + "/qml/QtQuick/VirtualKeyboard/plugins.qmltypes", "./" + distDir + "/qml/QtQuick/VirtualKeyboard/plugins.qmltypes",
"./" + distDir + "/qml/QtQuick/VirtualKeyboard/qmldir" "./" + distDir + "/qml/QtQuick/VirtualKeyboard/qmldir",
"./" + distDir + "/qml/Qt/labs/folderlistmodel/libqmlfolderlistmodelplugin.so",
"./" + distDir + "/qml/Qt/labs/folderlistmodel/plugins.qmltypes",
"./" + distDir + "/qml/Qt/labs/folderlistmodel/qmldir"
}); });
#else #else
Tree += utils.createTree({ Tree += utils.createTree({
@ -1343,6 +1346,9 @@ QSet<QString> ModulesQt513::qmlVirtualKeyBoadrLibs(const QString &distDir) const
"./" + distDir + "/qml/QtQuick/VirtualKeyboard/plugins.qmltypes", "./" + distDir + "/qml/QtQuick/VirtualKeyboard/plugins.qmltypes",
"./" + distDir + "/qml/QtQuick/VirtualKeyboard/qmldir", "./" + distDir + "/qml/QtQuick/VirtualKeyboard/qmldir",
"./" + distDir + "/qml/QtQuick/VirtualKeyboard/qtquickvirtualkeyboardplugin.dll" "./" + distDir + "/qml/QtQuick/VirtualKeyboard/qtquickvirtualkeyboardplugin.dll"
"./" + distDir + "/qml/Qt/labs/folderlistmodel/qmlfolderlistmodelplugin.dll",
"./" + distDir + "/qml/Qt/labs/folderlistmodel/plugins.qmltypes",
"./" + distDir + "/qml/Qt/labs/folderlistmodel/qmldir"
}); });
#endif #endif
return Tree; return Tree;

View File

@ -692,7 +692,7 @@ void deploytest::testQmlScaner() {
QVERIFY(results.size() == imports.size()); QVERIFY(results.size() == imports.size());
for (auto import: imports) { for (auto import: qAsConst(imports)) {
auto path = scaner->getPathFromImport(import); auto path = scaner->getPathFromImport(import);
QVERIFY(results.contains(path)); QVERIFY(results.contains(path));
} }
@ -730,7 +730,7 @@ void deploytest::testVirtualKeyBoard() {
#endif #endif
auto comapareTree = TestModule.qmlVirtualKeyBoadrLibs(); auto comapareTree = TestModule.qmlVirtualKeyBoadrLibs();
runTestParams({"-bin", bin, "clear" , runTestParams({"-bin", bin, "clear" , "noStrip",
"-qmake", qmake, "-qmake", qmake,
"-qmlDir", TestBinDir + "/../virtualkeyboard"}, &comapareTree); "-qmlDir", TestBinDir + "/../virtualkeyboard"}, &comapareTree);
} }