Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
Loading...
Searching...
No Matches
qmlutils.cpp
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
3
4#include "qmlutils.h"
5#include "utils.h"
6
7#include <QtCore/QDir>
8#include <QtCore/QFileInfo>
9#include <QtCore/QCoreApplication>
10#include <QtCore/QJsonDocument>
11#include <QtCore/QJsonObject>
12#include <QtCore/QJsonArray>
13#include <QtCore/QJsonParseError>
14
16
17using namespace Qt::StringLiterals;
18
20{
21 return m1.className.isEmpty() ? m1.name == m2.name : m1.className == m2.className;
22}
23
24// Return install path (cp -r semantics)
26{
27 QString result = root;
28 const qsizetype lastSlashPos = relativePath.lastIndexOf(u'/');
29 if (lastSlashPos != -1) {
30 result += u'/';
31 result += QStringView{relativePath}.left(lastSlashPos);
32 }
33 return result;
34}
35
37{
38 QDir dir(path);
39 if (!dir.entryList(QStringList(QStringLiteral("*.qml")), QDir::Files, QDir::NoSort).isEmpty())
40 return dir.path();
41 const QFileInfoList &subDirs = dir.entryInfoList(QStringList(), QDir::Dirs | QDir::NoDotAndDotDot, QDir::NoSort);
42 for (const QFileInfo &subDirFi : subDirs) {
43 if (!isBuildDirectory(platform, subDirFi.fileName())) {
44 const QString subPath = qmlDirectoryRecursion(platform, subDirFi.absoluteFilePath());
45 if (!subPath.isEmpty())
46 return subPath;
47 }
48 }
49 return QString();
50}
51
52// Find a directory containing QML files in the project
54{
55 QDir startDirectory(startDirectoryName);
56 if (isBuildDirectory(platform, startDirectory.dirName()))
57 startDirectory.cdUp();
58 return qmlDirectoryRecursion(platform, startDirectory.path());
59}
60
62 DebugMatchMode debugMatchMode, QStringList *matches)
63{
64 const QStringList &dlls = findSharedLibraries(directory, platform, debugMatchMode);
65 for (const QString &dll : dlls)
66 matches->append(directory.filePath(dll));
68 for (const QFileInfo &subDirFi : subDirs) {
69 QDir subDirectory(subDirFi.absoluteFilePath());
70 // Don't enter other QML modules when recursing!
71 if (subDirectory.isReadable() && !subDirectory.exists(QStringLiteral("qmldir")))
72 findFileRecursion(subDirectory, platform, debugMatchMode, matches);
73 }
74}
75
77 bool usesWidgets, int platform, DebugMatchMode debugMatchMode,
79{
80 Q_UNUSED(usesWidgets);
83 for (const QString &importPath : qmlImportPaths)
84 arguments << QStringLiteral("-importPath") << importPath;
85 arguments << QStringLiteral("-rootPath") << directory;
86 unsigned long exitCode;
87 QByteArray stdOut;
88 QByteArray stdErr;
89 const QString binary = QStringLiteral("qmlimportscanner");
90 if (!runProcess(binary, arguments, QDir::currentPath(), &exitCode, &stdOut, &stdErr, errorMessage))
91 return result;
92 if (exitCode) {
93 *errorMessage = binary + QStringLiteral(" returned ") + QString::number(exitCode)
94 + QStringLiteral(": ") + QString::fromLocal8Bit(stdErr);
95 return result;
96 }
97 QJsonParseError jsonParseError{};
98 const QJsonDocument data = QJsonDocument::fromJson(stdOut, &jsonParseError);
99 if (data.isNull() ) {
100 *errorMessage = binary + QStringLiteral(" returned invalid JSON output: ")
101 + jsonParseError.errorString() + QStringLiteral(" :\"")
102 + QString::fromLocal8Bit(stdOut) + u'"';
103 return result;
104 }
105 const QJsonArray array = data.array();
106 const int childCount = array.count();
107 for (int c = 0; c < childCount; ++c) {
108 const QJsonObject object = array.at(c).toObject();
109 if (object.value(QStringLiteral("type")).toString() == "module"_L1) {
110 const QString path = object.value(QStringLiteral("path")).toString();
111 if (!path.isEmpty()) {
113 module.name = object.value(QStringLiteral("name")).toString();
114 module.className = object.value(QStringLiteral("classname")).toString();
115 module.sourcePath = path;
116 module.relativePath = object.value(QStringLiteral("relativePath")).toString();
117 result.modules.append(module);
118 findFileRecursion(QDir(path), Platform(platform), debugMatchMode, &result.plugins);
119 }
120 }
121 }
122 result.ok = true;
123 return result;
124}
125
127{
128 for (const QmlImportScanResult::Module &module : other.modules) {
129 if (std::find(modules.cbegin(), modules.cend(), module) == modules.cend())
130 modules.append(module);
131 }
132 for (const QString &plugin : other.plugins) {
133 if (!plugins.contains(plugin))
134 plugins.append(plugin);
135 }
136}
137
\inmodule QtCore
Definition qbytearray.h:57
\inmodule QtCore
Definition qdir.h:20
@ NoSort
Definition qdir.h:62
static QString currentPath()
Returns the absolute path of the application's current directory.
Definition qdir.cpp:2054
@ Files
Definition qdir.h:23
@ NoSymLinks
Definition qdir.h:25
@ NoDotAndDotDot
Definition qdir.h:44
@ Dirs
Definition qdir.h:22
\inmodule QtCore\reentrant
Definition qjsonarray.h:18
qsizetype count() const
Same as size().
Definition qjsonarray.h:42
\inmodule QtCore\reentrant
static QJsonDocument fromJson(const QByteArray &json, QJsonParseError *error=nullptr)
Parses json as a UTF-8 encoded JSON document, and creates a QJsonDocument from it.
\inmodule QtCore\reentrant
Definition qjsonobject.h:20
\inmodule QtCore
\inmodule QtCore
Definition qstringview.h:78
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:129
QString left(qsizetype n) const &
Definition qstring.h:363
qsizetype lastIndexOf(QChar c, Qt::CaseSensitivity cs=Qt::CaseSensitive) const noexcept
Definition qstring.h:296
static QString fromLocal8Bit(QByteArrayView ba)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition qstring.cpp:5949
static QString number(int, int base=10)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition qstring.cpp:8084
QList< QVariant > arguments
Combined button and popup list for selecting options.
QList< QString > QStringList
Constructs a string list that contains the given string, str.
static const QPainterPath::ElementType * subPath(const QPainterPath::ElementType *t, const QPainterPath::ElementType *end, const qreal *points, bool *closed)
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
QmlImportScanResult runQmlImportScanner(const QString &directory, const QStringList &qmlImportPaths, bool usesWidgets, int platform, DebugMatchMode debugMatchMode, QString *errorMessage)
Definition qmlutils.cpp:76
QT_BEGIN_NAMESPACE QString findQmlDirectory(Platform platform, const QString &startDirectoryName)
Definition qmlutils.cpp:53
static bool matches(const QJsonObject &object, const QString &osName, const QVersionNumber &kernelVersion, const QString &osRelease, const QOpenGLConfig::Gpu &gpu)
Definition qopengl.cpp:270
GLsizei GLsizei GLenum void * binary
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
const GLubyte * c
GLenum array
GLsizei const GLchar *const * path
GLuint64EXT * result
[6]
#define QStringLiteral(str)
static void findFileRecursion(const QDir &directory, Platform platform, DebugMatchMode debugMatchMode, QStringList *matches)
Definition qmlutils.cpp:61
static QString qmlDirectoryRecursion(Platform platform, const QString &path)
Definition qmlutils.cpp:36
bool operator==(const QmlImportScanResult::Module &m1, const QmlImportScanResult::Module &m2)
Definition qmlutils.cpp:19
#define Q_UNUSED(x)
ptrdiff_t qsizetype
Definition qtypes.h:165
static QString errorMessage(QUrlPrivate::ErrorCode errorCode, const QString &errorSource, qsizetype errorPosition)
Definition qurl.cpp:3517
QT_BEGIN_NAMESPACE Platform platform()
Platform
QSharedPointer< T > other(t)
[5]
QString dir
[11]
char * toString(const MyType &t)
[31]
\inmodule QtCore\reentrant
QString installPath(const QString &root) const
Definition qmlutils.cpp:25
QStringList plugins
Definition qmlutils.h:29
QList< Module > modules
Definition qmlutils.h:28
void append(const QmlImportScanResult &other)
Definition qmlutils.cpp:126
QStringList findSharedLibraries(const QDir &directory, Platform platform, DebugMatchMode debugMatchMode, const QString &prefix)
Definition utils.cpp:88
bool runProcess(const QString &binary, const QStringList &args, const QString &workingDirectory, unsigned long *exitCode, QByteArray *stdOut, QByteArray *stdErr, QString *errorMessage)
Definition utils.cpp:311
bool isBuildDirectory(Platform platform, const QString &dirName)
Definition utils.cpp:37
DebugMatchMode
Definition utils.h:152