8#include <QtCore/QFileInfo>
9#include <QtCore/QScopeGuard>
33 cont = cont && self.dvValueField(visitor, Fields::uri,
uri);
34 cont = cont && self.dvWrapField(visitor, Fields::version,
version);
35 cont = cont && self.dvItemField(visitor, Fields::exports, [
this, &self]() {
37 return self.subMapItem(
Map(
38 self.pathFromOwner().field(Fields::exports),
40 DomItem mapExpOw = mapExp.owner();
41 QList<DomItem> exports =
42 mapExp.ownerAs<ModuleIndex>()->exportsWithNameAndMinorVersion(
43 mapExpOw, name, minorVersion);
44 return mapExp.subListItem(List::fromQList<DomItem>(
45 mapExp.pathFromOwner().key(name), exports,
46 [](const DomItem &, const PathEls::PathComponent &, const DomItem &el) {
57 cont = cont && self.dvItemField(visitor, Fields::symbols, [&self]() {
59 return self.subMapItem(
Map(
60 self.pathFromOwner().field(Fields::symbols),
62 QList<Path> symb({ basePath.key(name) });
66 DomItem mapExpOw = mapExp.owner();
67 return mapExp.ownerAs<
ModuleIndex>()->exportNames(mapExpOw);
71 cont = cont &&
self.dvItemField(visitor, Fields::autoExports, [
this, &self]() {
72 return containingObject(self).field(Fields::autoExports);
77std::shared_ptr<OwningItem> ModuleIndex::doCopy(
const DomItem &)
const
79 return std::make_shared<ModuleIndex>(*
this);
83 :
OwningItem(
o), m_uri(
o.uri()), m_majorVersion(
o.majorVersion())
85 QMap<int, ModuleScope *> scopes;
88 m_qmltypesFilesPaths +=
o.m_qmltypesFilesPaths;
89 m_qmldirPaths +=
o.m_qmldirPaths;
90 m_directoryPaths +=
o.m_directoryPaths;
91 scopes =
o.m_moduleScope;
94 auto end = scopes.end();
103 QMap<int, ModuleScope *> scopes;
106 scopes = m_moduleScope;
107 m_moduleScope.clear();
110 auto end = scopes.end();
119 bool cont = self.dvValueField(visitor, Fields::uri,
uri());
120 cont = cont && self.dvValueField(visitor, Fields::majorVersion,
majorVersion());
121 cont = cont && self.dvItemField(visitor, Fields::moduleScope, [
this, &self]() {
122 return self.subMapItem(
Map(
126 int minorVersion = minorVersionStr.toInt(&
ok);
127 if (minorVersionStr.isEmpty()
145 cont = cont && self.dvItemField(visitor, Fields::sources, [
this, &self]() {
148 cont = cont && self.dvValueLazyField(visitor, Fields::autoExports, [
this, &self]() {
157 QList<Path> mySources =
sources();
158 for (
int i = 0;
i < mySources.size(); ++
i) {
160 res +=
source.field(Fields::exports).keys();
170 QList<Path> cachedPaths;
177 if (cachedPaths.isEmpty())
180 DomItem env = self.environment();
181 if (!cachedPaths.isEmpty()) {
182 bool outdated =
false;
183 for (
const Path &
p : cachedPaths) {
187 qWarning() <<
"referenceCache outdated, reference at " << selfPath
188 <<
" leads to invalid path " <<
p;
200 QList<Path> mySources =
sources();
201 QSet<QString> knownAutoImportUris;
202 QList<ModuleAutoExport> knownExports;
203 for (
const Path &
p : mySources) {
207 if (!knownAutoImportUris.contains(iPtr->import.uri.toString())
208 || !knownExports.contains(*iPtr)) {
209 knownAutoImportUris.
insert(iPtr->import.uri.toString());
210 knownExports.
append(*iPtr);
212 cachedPaths.
append(
i.canonicalPath());
223 int minorVersion)
const
226 .
field(Fields::exports)
228 QList<Path> mySources =
sources();
230 QList<DomItem> undef;
231 if (minorVersion < 0)
232 minorVersion = std::numeric_limits<int>::max();
234 for (
int i = 0;
i < mySources.size(); ++
i) {
237 int nExports = exports.
indexes();
240 for (
int j = 0;
j < nExports; ++
j) {
244 Version const *versionPtr = exportItem.field(Fields::version).as<
Version>();
245 if (versionPtr ==
nullptr || !versionPtr->isValid()) {
246 undef.append(exportItem);
250 .
error(
tr(
"Module %1 (unversioned) has versioned entries "
253 source.canonicalPath().toString()))
257 && versionPtr->minorVersion >= vNow
258 && versionPtr->minorVersion <= minorVersion) {
259 if (versionPtr->minorVersion > vNow)
261 res.append(exportItem);
262 vNow = versionPtr->minorVersion;
267 if (!undef.isEmpty()) {
268 if (!
res.isEmpty()) {
270 .
error(
tr(
"Module %1 (major version %2) has versioned and "
271 "unversioned entries for '%3'")
286 res += m_qmltypesFilesPaths;
287 if (!m_qmldirPaths.isEmpty())
288 res += m_qmldirPaths.first();
289 else if (!m_directoryPaths.isEmpty())
290 res += m_directoryPaths.first();
296 if (minorVersion < 0)
300 auto it = m_moduleScope.constFind(minorVersion);
301 if (
it != m_moduleScope.cend())
306 auto cleanup =
qScopeGuard([&newScope] {
delete newScope; });
309 auto it = m_moduleScope.constFind(minorVersion);
310 if (
it != m_moduleScope.cend()) {
315 m_moduleScope.insert(minorVersion,
res);
324 QList<Path> qmltypesPaths;
325 QMap<int, ModuleScope *> scopes;
328 qmltypesPaths =
o->m_qmltypesFilesPaths;
329 scopes =
o->m_moduleScope;
333 for (
const Path &qttPath : qmltypesPaths) {
334 if (!m_qmltypesFilesPaths.contains((qttPath)))
335 m_qmltypesFilesPaths.append(qttPath);
339 auto end = scopes.end();
350 DomItem env = self.environment();
360 <<
"ModuleIndex::qmldirsToLoad: Searching versioned module" <<
subPath
361 <<
majorVersion() <<
"in" << envPtr->loadPaths().join(u
", ");
365 if (fInfo.isFile()) {
367 <<
"Found versioned module in " << fInfo.canonicalFilePath();
368 logicalPath = subPathV;
369 dirPath = fInfo.canonicalFilePath();
375 qCDebug(QQmlJSDomImporting) <<
"ModuleIndex::qmldirsToLoad: Searching unversioned module"
376 <<
subPath <<
"in" << envPtr->loadPaths().join(u
", ");
380 if (fInfo.isFile()) {
382 <<
"Found unversioned module in " << fInfo.canonicalFilePath();
384 dirPath = fInfo.canonicalFilePath();
392 }
else if (
uri() != u
"QML") {
393 const QString loadPaths = envPtr->loadPaths().join(u
", "_s);
394 qCDebug(QQmlJSDomImporting) <<
"ModuleIndex::qmldirsToLoad: qmldir at"
395 << (
uri() + u
"/qmldir"_s) <<
" was not found in " << loadPaths;
398 .
warning(
tr(
"Failed to find main qmldir file for %1 %2 in %3.")
bool isEmpty() const noexcept
iterator insert(const Key &key, const T &value)
virtual DomItem field(const DomItem &self, QStringView name) const
Represents a consistent set of types organized in modules, it is the top level of the DOM.
static ErrorGroup domErrorGroup
std::shared_ptr< T > ownerAs() const
index_type indexes() const
DomItem field(QStringView name) const
DomItem path(const Path &p, const ErrorHandler &h=&defaultErrorHandler) const
DomItem index(index_type) const
DomItem key(const QString &name) const
Represents a set of tags grouping a set of related error messages.
ModuleScope * ensureMinorVersion(int minorVersion)
QList< Path > qmldirPaths() const
QList< Path > sources() const
Path canonicalPath(const DomItem &) const override
QList< int > minorVersions() const
QList< DomItem > exportsWithNameAndMinorVersion(const DomItem &self, const QString &name, int minorVersion) const
QList< Path > qmldirsToLoad(const DomItem &self)
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const override
void mergeWith(const std::shared_ptr< ModuleIndex > &o)
QList< DomItem > autoExports(const DomItem &self) const
QSet< QString > exportNames(const DomItem &self) const
bool iterateDirectSubpaths(const DomItem &self, DirectVisitor visitor) const override
QBasicMutex * mutex() const
Path pathFromOwner() const
void addErrorLocal(ErrorMessage &&msg)
Path key(const QString &name) const
Path field(const QString &name) const
static Path Current(PathCurrent c)
static bool addForPath(const DomItem &el, const Path &canonicalPath, const RefCacheEntry &entry, AddOption addOption=AddOption::KeepExisting)
static RefCacheEntry forPath(const DomItem &el, const Path &canonicalPath)
QList< Path > canonicalPaths
static constexpr qint32 Undefined
static constexpr qint32 Latest
\macro QT_RESTRICTED_CAST_FROM_ASCII
QStringList split(const QString &sep, Qt::SplitBehavior behavior=Qt::KeepEmptyParts, Qt::CaseSensitivity cs=Qt::CaseSensitive) const
Splits the string into substrings wherever sep occurs, and returns the list of those strings.
bool isEmpty() const noexcept
Returns true if the string has no characters; otherwise returns false.
void clear()
Clears the contents of the string and makes it null.
QString & insert(qsizetype i, QChar c)
static QString number(int, int base=10)
This is an overloaded member function, provided for convenience. It differs from the above function o...
QString & append(QChar c)
QMap< QString, QString > map
[6]
QSet< QString >::iterator it
Path qmldirFilePath(const QString &path)
Path moduleScopePath(const QString &uri, Version version, const ErrorHandler &)
static ErrorGroups myVersioningErrors()
static ErrorGroups myExportErrors()
Combined button and popup list for selecting options.
static const QPainterPath::ElementType * subPath(const QPainterPath::ElementType *t, const QPainterPath::ElementType *end, const qreal *points, bool *closed)
DBusConnection const char DBusError * error
#define qCDebug(category,...)
GLuint64 GLenum void * handle
GLsizei GLsizei GLchar * source
GLsizei const GLchar *const * path
#define NewErrorGroup(name)
QQmlJS::Dom::DomItem DomItem
QDebug warning(QAnyStringView fileName, int lineNumber)
QScopeGuard< typename std::decay< F >::type > qScopeGuard(F &&f)
[qScopeGuard]
QLatin1StringView QLatin1String