diff options
author | Ulf Hermann <[email protected]> | 2024-07-02 08:45:00 +0200 |
---|---|---|
committer | Ulf Hermann <[email protected]> | 2024-07-03 06:42:46 +0000 |
commit | 0f1592100616c7da8e2194e5f12c61dcf3e17f9c (patch) | |
tree | 8e666bce2b535f3801cc9be0be7f9075da799842 | |
parent | 265ae27a3cc747affae26923ebaa3cc7c49477c1 (diff) |
qmltc: Don't re-check headers for their suffix
qmltyperegistrar already does that and warns about suspicious headers.
Allowing only ".h" is overly restrictive.
Since qmltc uses the .h suffix also to mark scopes it has pre-processed,
we need to drop the preprocessing and determine the path names on the
fly when writing the includes.
Pick-to: 6.8
Fixes: QTBUG-125959
Change-Id: If68431ca92fd6625ca77beb6b00a460c43c987e5
Reviewed-by: Fabian Kosmale <[email protected]>
-rw-r--r-- | tests/auto/qml/qmltc/QmltcTests/CMakeLists.txt | 3 | ||||
-rw-r--r-- | tests/auto/qml/qmltc/QmltcTests/cpptypes/hpp.hpp | 15 | ||||
-rw-r--r-- | tests/auto/qml/qmltc/QmltcTests/hpp.qml | 8 | ||||
-rw-r--r-- | tests/auto/qml/qmltc/tst_qmltc.cpp | 9 | ||||
-rw-r--r-- | tests/auto/qml/qmltc/tst_qmltc.h | 2 | ||||
-rw-r--r-- | tools/qmltc/qmltcvisitor.cpp | 33 | ||||
-rw-r--r-- | tools/qmltc/qmltcvisitor.h | 4 |
7 files changed, 52 insertions, 22 deletions
diff --git a/tests/auto/qml/qmltc/QmltcTests/CMakeLists.txt b/tests/auto/qml/qmltc/QmltcTests/CMakeLists.txt index 4c472ec4ab..a60330bc8e 100644 --- a/tests/auto/qml/qmltc/QmltcTests/CMakeLists.txt +++ b/tests/auto/qml/qmltc/QmltcTests/CMakeLists.txt @@ -24,6 +24,7 @@ set(cpp_sources cpptypes/typewithsignal.h cpptypes/custominitialization.h cpptypes/typewithrequiredproperties.h + cpptypes/hpp.hpp ) set(qml_sources @@ -137,6 +138,8 @@ set(qml_sources badFile.qml requiredProperties.qml + + hpp.qml ) set(js_sources diff --git a/tests/auto/qml/qmltc/QmltcTests/cpptypes/hpp.hpp b/tests/auto/qml/qmltc/QmltcTests/cpptypes/hpp.hpp new file mode 100644 index 0000000000..5ba60daba9 --- /dev/null +++ b/tests/auto/qml/qmltc/QmltcTests/cpptypes/hpp.hpp @@ -0,0 +1,15 @@ +// Copyright (C) 2024 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +#ifndef HPP_HPP +#define HPP_HPP + +#include <QtQml/qqml.h> + +class Hpp : public QObject +{ + Q_OBJECT + QML_ELEMENT +}; + +#endif // HPP_HPP diff --git a/tests/auto/qml/qmltc/QmltcTests/hpp.qml b/tests/auto/qml/qmltc/QmltcTests/hpp.qml new file mode 100644 index 0000000000..999e5eaf00 --- /dev/null +++ b/tests/auto/qml/qmltc/QmltcTests/hpp.qml @@ -0,0 +1,8 @@ +// Copyright (C) 2024 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +import QmltcTests 1.0 + +Hpp { + objectName: "hpp" +} diff --git a/tests/auto/qml/qmltc/tst_qmltc.cpp b/tests/auto/qml/qmltc/tst_qmltc.cpp index ef33cebc00..6a7e6da201 100644 --- a/tests/auto/qml/qmltc/tst_qmltc.cpp +++ b/tests/auto/qml/qmltc/tst_qmltc.cpp @@ -92,6 +92,8 @@ #include "signalconnections.h" #include "requiredproperties.h" +#include "hpp.h" + // Qt: #include <QtCore/qstring.h> #include <QtCore/qbytearray.h> @@ -3396,4 +3398,11 @@ void tst_qmltc::signalConnections() QCOMPARE(createdByQmltc.objectName(), QLatin1String("second")); } +void tst_qmltc::hpp() +{ + QQmlEngine e; + PREPEND_NAMESPACE(hpp) createdByQmltc(&e); + QCOMPARE(createdByQmltc.objectName(), QLatin1String("hpp")); +} + QTEST_MAIN(tst_qmltc) diff --git a/tests/auto/qml/qmltc/tst_qmltc.h b/tests/auto/qml/qmltc/tst_qmltc.h index ede6d551a0..926081f6d2 100644 --- a/tests/auto/qml/qmltc/tst_qmltc.h +++ b/tests/auto/qml/qmltc/tst_qmltc.h @@ -105,4 +105,6 @@ private slots: #endif void urlToString(); void signalConnections(); + + void hpp(); }; diff --git a/tools/qmltc/qmltcvisitor.cpp b/tools/qmltc/qmltcvisitor.cpp index a6ec1f8661..7eac98da0e 100644 --- a/tools/qmltc/qmltcvisitor.cpp +++ b/tools/qmltc/qmltcvisitor.cpp @@ -89,7 +89,7 @@ void QmltcVisitor::findCppIncludes() return false; }; const auto addCppInclude = [this](const QQmlJSScope::ConstPtr &type) { - if (QString includeFile = type->filePath(); includeFile.endsWith(u".h")) + if (QString includeFile = filePath(type); !includeFile.isEmpty()) m_cppIncludes.insert(std::move(includeFile)); }; @@ -151,8 +151,8 @@ void QmltcVisitor::findCppIncludes() for (const QQmlJSMetaProperty &p : properties) { findInType(p.type()); - if (p.isPrivate() && t->filePath().endsWith(u".h")) { - const QString ownersInclude = t->filePath(); + if (p.isPrivate()) { + const QString ownersInclude = filePath(t); QString privateInclude = constructPrivateInclude(ownersInclude); if (!privateInclude.isEmpty()) m_cppIncludes.insert(std::move(privateInclude)); @@ -174,7 +174,7 @@ void QmltcVisitor::findCppIncludes() } // remove own include - m_cppIncludes.remove(m_exportedRootScope->filePath()); + m_cppIncludes.remove(filePath(m_exportedRootScope)); } static void addCleanQmlTypeName(QStringList *names, const QQmlJSScope::ConstPtr &scope) @@ -191,16 +191,9 @@ static void addCleanQmlTypeName(QStringList *names, const QQmlJSScope::ConstPtr bool QmltcVisitor::visit(QQmlJS::AST::UiObjectDefinition *object) { - const bool processingRoot = !rootScopeIsValid(); - if (!QQmlJSImportVisitor::visit(object)) return false; - if (processingRoot || m_currentScope->isInlineComponent()) { - Q_ASSERT(rootScopeIsValid()); - setRootFilePath(); - } - // we're not interested in non-QML scopes if (m_currentScope->scopeType() != QQmlSA::ScopeType::QMLScope) return true; @@ -831,14 +824,14 @@ void QmltcVisitor::checkNamesAndTypes(const QQmlJSScope::ConstPtr &type) } /*! \internal - * Sets the file paths for the document and the inline components roots. + * Returns the file path for the C++ header of \a scope or the header created + * by qmltc for it and its inline components. */ -void QmltcVisitor::setRootFilePath() +QString QmltcVisitor::filePath(const QQmlJSScope::ConstPtr &scope) const { - const QString filePath = m_currentScope->filePath(); - if (filePath.endsWith(u".h")) // assume the correct path is set - return; - Q_ASSERT(filePath.endsWith(u".qml"_s)); + const QString filePath = scope->filePath(); + if (!filePath.endsWith(u".qml")) // assume the correct path is set + return scope->filePath(); const QString correctedFilePath = sourceDirectoryPath(filePath); const QStringList paths = m_importer->resourceFileMapper()->resourcePaths( @@ -850,13 +843,13 @@ void QmltcVisitor::setRootFilePath() qCDebug(lcQmltcCompiler, "Failed to find a header file name for path %s. Paths checked:\n%s", correctedFilePath.toUtf8().constData(), matchedPaths.toUtf8().constData()); - return; + return QString(); } // NB: get the file name to avoid prefixes - m_currentScope->setFilePath(QFileInfo(*firstHeader).fileName()); + return QFileInfo(*firstHeader).fileName(); } -QString QmltcVisitor::sourceDirectoryPath(const QString &path) +QString QmltcVisitor::sourceDirectoryPath(const QString &path) const { auto result = QQmlJSUtils::sourceDirectoryPath(m_importer, path); if (const QString *srcDirPath = std::get_if<QString>(&result)) diff --git a/tools/qmltc/qmltcvisitor.h b/tools/qmltc/qmltcvisitor.h index 111df0e885..b96c19063f 100644 --- a/tools/qmltc/qmltcvisitor.h +++ b/tools/qmltc/qmltcvisitor.h @@ -23,9 +23,9 @@ class QmltcVisitor : public QQmlJSImportVisitor &qmlIrOrderedBindings); void setupAliases(); void checkNamesAndTypes(const QQmlJSScope::ConstPtr &type); - void setRootFilePath(); + QString filePath(const QQmlJSScope::ConstPtr &scope) const; - QString sourceDirectoryPath(const QString &path); + QString sourceDirectoryPath(const QString &path) const; using InlineComponentOrDocumentRootName = QQmlJSScope::InlineComponentOrDocumentRootName; |