10#include <QtQml/private/qqmljslexer_p.h>
11#include <QtQml/private/qqmljsparser_p.h>
12#include <QtQml/private/qqmljsengine_p.h>
13#include <QtQml/private/qqmljsastvisitor_p.h>
14#include <QtQml/private/qqmljsast_p.h>
16#include <QtCore/QScopeGuard>
17#include <QtCore/QFileInfo>
18#include <QtCore/QRegularExpression>
19#include <QtCore/QRegularExpressionMatch>
33 m_canonicalFilePath(filePath),
79void QmldirFile::parse()
90void QmldirFile::setFromQmldir()
106 if (canonicalExportFilePath.
isEmpty())
108 canonicalExportFilePath = exportFilePath;
110 exp.exportSourcePath = exportSource;
111 exp.isSingleton =
el.singleton;
112 exp.isInternal =
el.internal;
114 Version((
el.version.hasMajorVersion() ?
el.version.majorVersion() : majorVersion),
115 el.version.hasMinorVersion() ?
el.version.minorVersion() : 0);
116 exp.typeName =
el.typeName;
119 m_exports.insert(exp.typeName, exp);
120 if (exp.version.majorVersion > 0)
121 m_majorVersions.
insert(exp.version.majorVersion);
123 for (
auto const &
el : m_qmldir.scripts()) {
126 if (canonicalExportFilePath.
isEmpty())
128 canonicalExportFilePath = exportFilePath;
130 exp.exportSourcePath = exportSource;
131 exp.isSingleton =
true;
132 exp.isInternal =
false;
134 Version((
el.version.hasMajorVersion() ?
el.version.majorVersion() : majorVersion),
135 el.version.hasMinorVersion() ?
el.version.minorVersion() : 0);
138 exp.typeName =
el.nameSpace;
139 m_exports.insert(exp.typeName, exp);
140 if (exp.version.majorVersion > 0)
141 m_majorVersions.
insert(exp.version.majorVersion);
150 v =
Version((imp.version.hasMajorVersion() ? imp.version.majorVersion()
152 (imp.version.hasMinorVersion() ? imp.version.minorVersion()
156 m_autoExports.append(
162 qWarning() <<
"qmldir contains dependency with auto keyword";
164 (imp.version.hasMajorVersion() ? imp.version.majorVersion() : int(
Version::Latest)),
165 (imp.version.hasMinorVersion() ? imp.version.minorVersion()
169 bool hasInvalidTypeinfo =
false;
170 for (
auto const &
el : m_qmldir.typeInfos()) {
173 if (elPath.isRelative())
175 QString typeInfoPath = elPath.canonicalFilePath();
177 hasInvalidTypeinfo =
true;
178 typeInfoPath = elPath.absoluteFilePath();
182 if (m_qmltypesFilePaths.isEmpty() || hasInvalidTypeinfo) {
188 if (!m_qmltypesFilePaths.contains(
p))
189 m_qmltypesFilePaths.append(
p);
192 bool hasErrors =
false;
200 m_plugins = m_qmldir.
plugins();
205 return m_autoExports;
210 m_autoExports = autoExport;
220 DomItem env = self.environment();
222 for (
int majorV : m_majorVersions) {
242 cont = cont && self.dvValueField(visitor, Fields::uri,
uri().
toString());
243 cont = cont && self.dvValueField(visitor, Fields::designerSupported,
designerSupported());
244 cont = cont && self.dvReferencesField(visitor, Fields::qmltypesFiles, m_qmltypesFilePaths);
245 cont = cont && self.dvWrapField(visitor, Fields::exports, m_exports);
246 cont = cont && self.dvWrapField(visitor, Fields::imports, m_imports);
247 cont = cont && self.dvItemField(visitor, Fields::plugins, [
this, &self]() {
249 return self.subListItem(List::fromQListRef<QQmlDirParser::Plugin>(
250 self.pathFromOwner().field(Fields::plugins), m_plugins,
253 return list.subDataItem(p, pluginData(plugin, cNames));
258 cont = cont && self.dvItemField(visitor, Fields::qmlFiles, [
this, &self]() {
260 return self.subMapItem(
Map(
261 self.pathFromOwner().field(Fields::qmlFiles),
263 QString path = typeFileMap.value(typeV);
267 return map.subReferencesItem(
269 QList<Path>({ Paths::qmlFileObjectPath(path) }));
272 return QSet<QString>(typeFileMap.keyBegin(), typeFileMap.keyEnd());
276 cont = cont && self.dvWrapField(visitor, Fields::autoExports, m_autoExports);
286 for (
const auto &
e : m_exports)
288 e.typePath[2].headName());
292std::shared_ptr<OwningItem> QmlFile::doCopy(
DomItem &)
const
294 auto res = std::make_shared<QmlFile>(*
this);
300 m_engine(
o.m_engine),
302 m_astComments(
o.m_astComments),
303 m_comments(
o.m_comments),
304 m_fileLocationsTree(
o.m_fileLocationsTree),
305 m_components(
o.m_components),
306 m_pragmas(
o.m_pragmas),
307 m_imports(
o.m_imports),
308 m_importScope(
o.m_importScope)
311 m_astComments = std::make_shared<AstComments>(*m_astComments);
315 :
ExternalOwningItem(filePath, lastDataUpdateAt, Paths::qmlFilePath(filePath), derivedFrom,
323 QQmlJS::Parser parser(m_engine.get());
327 m_ast = parser.ast();
340 cont = cont && self.dvWrapField(visitor, Fields::components, m_components);
341 cont = cont && self.dvWrapField(visitor, Fields::pragmas, m_pragmas);
342 cont = cont && self.dvWrapField(visitor, Fields::imports, m_imports);
343 cont = cont && self.dvWrapField(visitor, Fields::importScope, m_importScope);
344 cont = cont && self.dvWrapField(visitor, Fields::fileLocationsTree, m_fileLocationsTree);
345 cont = cont && self.dvWrapField(visitor, Fields::comments, m_comments);
346 cont = cont && self.dvWrapField(visitor, Fields::astComments, m_astComments);
352 if (
name == Fields::components)
353 return self.wrapField(Fields::components, m_components);
359 self.containingObject().addError(msg);
364 for (
DomItem &
p : self.field(Fields::pragmas).values()) {
367 for (
auto i : self.field(Fields::imports).values()) {
377 auto res = std::make_shared<GlobalScope>(
392 DomItem env = self.environment();
396 for (
int majorV :
it.value()) {
399 mIndex->addQmltypeFilePath(self.canonicalPath());
409 cont = cont && self.dvWrapField(visitor, Fields::components, m_components);
410 cont = cont && self.dvWrapField(visitor, Fields::exports, m_exports);
411 cont = cont && self.dvItemField(visitor, Fields::uris, [
this, &self]() {
412 return self.subMapItem(Map::fromMapRef<
QSet<int>>(
413 self.pathFromOwner().field(Fields::uris), m_uris,
415 QList<int> l(el.cbegin(), el.cend());
416 std::sort(l.begin(), l.end());
417 return map.subListItem(
418 List::fromQList<int>(map.pathFromOwner().appendComponent(p), l,
419 [](DomItem &list, const PathEls::PathComponent &p,
420 int &el) { return list.subDataItem(p, el); }));
423 cont = cont && self.dvWrapField(visitor, Fields::imports, m_imports);
429 :
ExternalOwningItem(filePath, lastDataUpdateAt, Paths::qmlDirectoryPath(filePath), derivedFrom,
440 cont = cont && self.dvWrapField(visitor, Fields::exports, m_exports);
441 cont = cont && self.dvItemField(visitor, Fields::qmlFiles, [
this, &self]() ->
DomItem {
443 return self.subMapItem(
Map(
444 self.pathFromOwner().field(Fields::qmlFiles),
447 auto it = m_qmlFiles.find(key);
448 while (it != m_qmlFiles.end() && it.key() == key) {
449 res.append(Paths::qmlFilePath(
450 QFileInfo(baseDir.filePath(it.value())).canonicalFilePath()));
459 u
"List<Reference>"_s));
467 uR
"((?<compName>[a-zA-z0-9_]+)\.(?:qml|qmlannotation))"));
469 if (
m.hasMatch() && !m_qmlFiles.
values(
m.captured(u
"compName")).
contains(relativePath)) {
470 m_qmlFiles.
insert(
m.captured(u
"compName"), relativePath);
475 e.typeName =
m.captured(u
"compName");
478 m_exports.insert(
e.typeName,
e);
\inmodule QtCore\reentrant
\inmodule QtCore\reentrant
\inmodule QtCore\reentrant
\inmodule QtCore\reentrant
static QDateTime currentDateTimeUtc()
QString dirName() const
Returns the name of the directory; this is not the same as the path, e.g.
QString filePath(const QString &fileName) const
Returns the path name of a file in the directory.
\inmodule QtCore \reentrant
QString suffix() const
Returns the suffix (extension) of the file.
QString canonicalFilePath() const
Returns the canonical path including the file name, i.e.
QDir dir() const
Returns the path of the object's parent directory as a QDir object.
QList< Key > keys() const
iterator insert(const Key &key, const T &value)
QList< T > values() const
bool parse(const QString &source)
url is used for generating errors.
QString typeNamespace() const
QList< Plugin > plugins() const
virtual DomItem field(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()
void writeOut(OutWriter &lw)
Represents a set of tags grouping a set of related error messages.
ErrorMessage errorMessage(Dumper msg, ErrorLevel level, Path element=Path(), QString canonicalFilePath=QString(), SourceLocation location=SourceLocation()) const
Represents an error message connected to the dom.
ErrorMessage & withPath(const Path &)
ErrorMessage & withFile(QString)
A OwningItem that refers to an external resource (file,...)
Path canonicalPath() const
const QString & code() const
QString m_canonicalFilePath
QString canonicalFilePath() const
void setIsValid(bool val)
ExternalOwningItem(QString filePath, QDateTime lastDataUpdateAt, Path pathFromTop, int derivedFrom=0, QString code=QString())
bool iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) override
Represents and maintains a mapping between elements and their location in a file.
std::shared_ptr< OwningItem > doCopy(DomItem &) const override
bool iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) override
OutWriter & ensureNewline(int nNewlines=1)
virtual QDateTime lastDataUpdateAt() const
void addErrorLocal(ErrorMessage msg)
virtual int revision() const
Path field(QString name) const
static Path Field(QStringView s=u"")
bool addQmlFilePath(QString relativePath)
bool iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) override
DomItem field(DomItem &self, QStringView name) const override
void addError(DomItem &self, ErrorMessage msg) override
void writeOut(DomItem &self, OutWriter &lw) const override
QmlFile(const QmlFile &o)
bool iterateDirectSubpaths(DomItem &self, DirectVisitor) override
static ErrorGroups myParsingErrors()
static QmlUri fromDirectoryString(const QString &importStr)
static QmlUri fromUriString(const QString &importStr)
static ErrorGroups myParsingErrors()
const QList< Import > & imports() const &
bool iterateDirectSubpaths(DomItem &self, DirectVisitor visitor) override
QList< ModuleAutoExport > autoExports() const
void ensureInModuleIndex(DomItem &self, QString uri)
static std::shared_ptr< QmldirFile > fromPathAndCode(QString path, QString code)
QMap< QString, QString > qmlFiles() const
QStringList classNames() const
void setAutoExports(const QList< ModuleAutoExport > &autoExport)
bool designerSupported() const
void ensureInModuleIndex(DomItem &self)
bool iterateDirectSubpaths(DomItem &self, DirectVisitor) override
static constexpr qint32 Undefined
static constexpr qint32 Latest
void setCode(const QString &code, int lineno, bool qmlMode=true, CodeContinuation codeContinuation=CodeContinuation::Reset)
Represents an immutable JsonPath like path in the Qml code model (from a DomItem to another DomItem)
\inmodule QtCore \reentrant
\inmodule QtCore \reentrant
QRegularExpressionMatch match(const QString &subject, qsizetype offset=0, MatchType matchType=NormalMatch, MatchOptions matchOptions=NoMatchOption) const
Attempts to match the regular expression against the given subject string, starting at the position o...
static QString anchoredPattern(const QString &expression)
iterator insert(const T &value)
\macro QT_RESTRICTED_CAST_FROM_ASCII
int toInt(bool *ok=nullptr, int base=10) const
Returns the string converted to an int using base base, which is 10 by default and must be between 2 ...
bool isEmpty() const
Returns true if the string has no characters; otherwise returns false.
QMap< QString, QString > map
[6]
QSet< QString >::iterator it
Path jsFilePath(QString path)
Path qmltypesFilePath(QString path)
Path qmlFileObjectPath(QString canonicalFilePath)
QCborValue pluginData(QQmlDirParser::Plugin &pl, QStringList cNames)
static QString toString(const UiQualifiedId *qualifiedId, QChar delimiter=QLatin1Char('.'))
Combined button and popup list for selecting options.
DBusConnection const char DBusError * error
GLsizei const GLfloat * v
[13]
GLint GLenum GLint components
GLsizei const GLchar *const * path
#define NewErrorGroup(name)
static QString canonicalPath(const QString &rootPath)
QLatin1StringView QLatin1String
#define QStringLiteral(str)
\inmodule QtCore \reentrant
bool contains(const AT &t) const noexcept