Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qqmltyperegistrarutils.cpp
Go to the documentation of this file.
1// Copyright (C) 2023 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
3
5
10
11#include <QtCore/qcborarray.h>
12#include <QtCore/qcbormap.h>
13#include <QtCore/qcborvalue.h>
14#include <QtCore/qdebug.h>
15#include <QtCore/qfile.h>
16#include <QtCore/qdiriterator.h>
17#include <QtCore/private/qduplicatetracker_p.h>
18#include <QtCore/qtextstream.h>
19
20using namespace Qt::Literals::StringLiterals;
21
22QT_BEGIN_NAMESPACE
23
24QTypeRevision handleInMinorVersion(QTypeRevision revision, int majorVersion)
25{
26 if (!revision.hasMajorVersion() && revision.hasMinorVersion()) {
27 // this version has been obtained by QML_{ADDED,REMOVED}_IN_MINOR_VERSION
28 revision = QTypeRevision::fromVersion(majorVersion, revision.minorVersion());
29 }
30 return revision;
31}
32
34{
35 return iface.className;
36}
37
38static QDebug message(QDebug base, QAnyStringView message, QAnyStringView fileName, int lineNumber)
39{
40 // Formatted such that it becomes a link in QtCreator (even with "::" ending)
41 const QString lineString = lineNumber ? QString::number(lineNumber) : QString();
42 return (base.noquote().nospace()
43 << message << ": " << fileName << ":" << lineString << ":").space();
44}
45
46QDebug warning(QAnyStringView fileName, int lineNumber)
47{
48 return message(qWarning(), "Warning", fileName, lineNumber);
49}
50
51QDebug warning(const MetaType &classDef)
52{
53 const QAnyStringView file = classDef.inputFile();
54 int lineNo = classDef.lineNumber();
55 if (!file.isEmpty())
56 return warning(file, lineNo);
57
58 return warning(classDef.qualifiedClassName());
59}
60
61QDebug error(QAnyStringView fileName, int lineNumber)
62{
63 return message(qCritical(), "Error", fileName, lineNumber);
64}
65
66/*!
67 \internal
68 \a pathToList points to a file listing all qt.parts.conf files
69 In any given directory, there might be more than one qt.parts.conf file (especially on Winodws).
70 We need to merge all import paths for a a given folder (but want to avoid duplicate entries).
71 */
72int mergeQtConfFiles(const QString &pathToList)
73{
74 QFile listFile(pathToList);
75 if (!listFile.open(QFile::ReadOnly | QFile::Text))
76 return EXIT_FAILURE;
77 QMultiHash<QString, QString> directoryToNecessaryImports;
78 while (!listFile.atEnd()) {
79 QByteArray partFilePath = listFile.readLine().trimmed();
80 QString directoryPath = QFileInfo(QString::fromUtf8(partFilePath)).absolutePath();
81 QDirIterator dirIt(directoryPath, { "*_qt.part.conf"_L1 }, QDir::Filter::Files );
82 while (dirIt.hasNext()) {
83 QFile partialFile(dirIt.next());
84 if (!partialFile.open(QFile::ReadOnly | QFile::Text)) {
85 qDebug() << "could not open" << partialFile.fileName();
86 return EXIT_FAILURE;
87 }
88 while (!partialFile.atEnd()) {
89 QByteArray import = partialFile.readLine().trimmed();
90 directoryToNecessaryImports.insert(directoryPath, QString::fromUtf8(import));
91 }
92 }
93 }
94 for (const QString &directoryPath: directoryToNecessaryImports.keys()) {
95 QFile consolidatedQtConfFile(directoryPath + QDir::separator() + u"qt.conf");
96 if (!consolidatedQtConfFile.open(QFile::WriteOnly | QFile::Text)) {
97 qDebug() << "could not open" << consolidatedQtConfFile.fileName();
98 return EXIT_FAILURE;
99 }
100 QTextStream out(&consolidatedQtConfFile);
101 QStringList allIncludes = directoryToNecessaryImports.values(directoryPath);
102 allIncludes.removeDuplicates();
103 out << "[Config]\nMergeQtConf = true\n"
104 << "[Paths]\nQmlImports = "
105 << allIncludes.join(u",") << Qt::endl;
106 }
107 QFile outfile(pathToList + u".done");
108 if (!outfile.open(QFile::WriteOnly | QFile::Text))
109 return EXIT_FAILURE;
110 outfile.write(QByteArray::number(QDateTime::currentSecsSinceEpoch()));
111 return EXIT_SUCCESS;
112}
113
114QT_END_NAMESPACE
static QDebug message(QDebug base, QAnyStringView message, QAnyStringView fileName, int lineNumber)
QAnyStringView interfaceName(const Interface &iface)
QDebug warning(const MetaType &classDef)
int mergeQtConfFiles(const QString &pathToList)
QDebug error(QAnyStringView fileName, int lineNumber=0)
QDebug warning(QAnyStringView fileName, int lineNumber=0)