diff options
author | Maximilian Goldstein <max.goldstein@qt.io> | 2020-03-26 10:57:12 +0100 |
---|---|---|
committer | Maximilian Goldstein <max.goldstein@qt.io> | 2020-03-26 13:41:46 +0100 |
commit | a5b4d3dbab70c8e0cc57e895007fc4a798e129c7 (patch) | |
tree | 161d4db067c1f885830588506e4005712b0b76a3 /tools | |
parent | 7aac345415ca8970f3e5f094ec8fa1a26b36587b (diff) |
qmltyperegistrar: Use target instead of template name
Due to the fact that multiple targets may be present in the same
directory we have to ensure they all get a unique qmltypes.
Fixes: QTBUG-82710
Change-Id: I4d7966035644b68f7d3330a4c974369503c48bf2
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
Diffstat (limited to 'tools')
-rw-r--r-- | tools/qmllint/findunqualified.cpp | 41 | ||||
-rw-r--r-- | tools/qmllint/findunqualified.h | 3 | ||||
-rw-r--r-- | tools/qmllint/main.cpp | 24 |
3 files changed, 52 insertions, 16 deletions
diff --git a/tools/qmllint/findunqualified.cpp b/tools/qmllint/findunqualified.cpp index 9bb9395015..4252cda9d6 100644 --- a/tools/qmllint/findunqualified.cpp +++ b/tools/qmllint/findunqualified.cpp @@ -182,8 +182,6 @@ QStringList completeImportPaths(const QString &uri, const QString &basePath, int } static const QLatin1String SlashQmldir = QLatin1String("/qmldir"); -static const QLatin1String SlashAppDotQmltypes = QLatin1String("/app.qmltypes"); -static const QLatin1String SlashLibDotQmltypes = QLatin1String("/lib.qmltypes"); static const QLatin1String SlashPluginsDotQmltypes = QLatin1String("/plugins.qmltypes"); void FindUnqualifiedIDVisitor::readQmltypes(const QString &filename, @@ -286,16 +284,29 @@ void FindUnqualifiedIDVisitor::importHelper(const QString &module, const QString break; } - Import result; - if (QFile::exists(qmltypesPath + SlashAppDotQmltypes)) - readQmltypes(qmltypesPath + SlashAppDotQmltypes, result); - else if (QFile::exists(qmltypesPath + SlashLibDotQmltypes)) - readQmltypes(qmltypesPath + SlashLibDotQmltypes, result); - else + if (!m_qmltypeFiles.isEmpty()) continue; + + Import result; + + QDirIterator it { qmltypesPath, QStringList() << QLatin1String("*.qmltypes"), QDir::Files }; + + while (it.hasNext()) + readQmltypes(it.next(), result); + processImport(prefix, result); } } + + if (!m_qmltypeFiles.isEmpty()) + { + Import result; + + for (const auto &qmltypeFile : m_qmltypeFiles) + readQmltypes(qmltypeFile, result); + + processImport("", result); + } } ScopeTree *FindUnqualifiedIDVisitor::localFile2ScopeTree(const QString &filePath) @@ -433,6 +444,17 @@ bool FindUnqualifiedIDVisitor::visit(QQmlJS::AST::UiProgram *) m_colorOut.writeUncolored(reader.errorMessage()); } } + + if (!m_qmltypeFiles.isEmpty()) + { + for (const auto &qmltypeFile : m_qmltypeFiles) { + auto reader = createQmltypesReaderForFile(qmltypeFile); + auto succ = reader(&objects, &moduleApis, &dependencies); + if (!succ) + m_colorOut.writeUncolored(reader.errorMessage()); + } + } + // add builtins for (auto objectIt = objects.begin(); objectIt != objects.end(); ++objectIt) { auto val = objectIt.value(); @@ -644,11 +666,12 @@ bool FindUnqualifiedIDVisitor::visit(QQmlJS::AST::IdentifierExpression *idexp) return true; } -FindUnqualifiedIDVisitor::FindUnqualifiedIDVisitor(QStringList qmltypeDirs, QString code, +FindUnqualifiedIDVisitor::FindUnqualifiedIDVisitor(QStringList qmltypeDirs, QStringList qmltypeFiles, QString code, QString fileName, bool silent) : m_rootScope(new ScopeTree { ScopeType::JSFunctionScope, "global" }), m_currentScope(m_rootScope.get()), m_qmltypeDirs(std::move(qmltypeDirs)), + m_qmltypeFiles(std::move(qmltypeFiles)), m_code(std::move(code)), m_rootId(QLatin1String("<id>")), m_filePath(std::move(fileName)), diff --git a/tools/qmllint/findunqualified.h b/tools/qmllint/findunqualified.h index 6668b53b08..1394816ac9 100644 --- a/tools/qmllint/findunqualified.h +++ b/tools/qmllint/findunqualified.h @@ -52,7 +52,7 @@ class FindUnqualifiedIDVisitor : public QQmlJS::AST::Visitor { Q_DISABLE_COPY_MOVE(FindUnqualifiedIDVisitor) public: - explicit FindUnqualifiedIDVisitor(QStringList qmltypeDirs, QString code, + explicit FindUnqualifiedIDVisitor(QStringList qmltypeDirs, QStringList qmltypeFiles, QString code, QString fileName, bool silent); ~FindUnqualifiedIDVisitor() override = default; bool check(); @@ -70,6 +70,7 @@ private: QHash<QString, ScopeTree::ConstPtr> m_types; QHash<QString, ScopeTree::ConstPtr> m_exportedName2Scope; QStringList m_qmltypeDirs; + QStringList m_qmltypeFiles; QString m_code; QHash<QString, const ScopeTree *> m_qmlid2scope; QString m_rootId; diff --git a/tools/qmllint/main.cpp b/tools/qmllint/main.cpp index fa601986b2..05519fc8d8 100644 --- a/tools/qmllint/main.cpp +++ b/tools/qmllint/main.cpp @@ -48,7 +48,7 @@ #endif static bool lint_file(const QString &filename, const bool silent, const bool warnUnqualied, - const QStringList &qmltypeDirs) + const QStringList &qmltypeDirs, const QStringList &qmltypeFiles) { QFile file(filename); if (!file.open(QFile::ReadOnly)) { @@ -84,7 +84,7 @@ static bool lint_file(const QString &filename, const bool silent, const bool war if (success && !isJavaScript && warnUnqualied) { auto root = parser.rootNode(); - FindUnqualifiedIDVisitor v { qmltypeDirs, code, filename, silent }; + FindUnqualifiedIDVisitor v { qmltypeDirs, qmltypeFiles, code, filename, silent }; root->accept(&v); success = v.check(); } @@ -118,6 +118,13 @@ int main(int argv, char *argc[]) QLatin1String("directory")); parser.addOption(qmltypesDirsOption); + QCommandLineOption qmltypesFilesOption( + QStringList() << "i" + << "qmltypes", + QLatin1String("Include the specified qmltypes files"), + QLatin1String("qmltypes")); + parser.addOption(qmltypesFilesOption); + parser.addPositionalArgument(QLatin1String("files"), QLatin1String("list of qml or js files to verify")); @@ -134,15 +141,20 @@ int main(int argv, char *argc[]) QStringList qmltypeDirs = parser.isSet(qmltypesDirsOption) ? parser.values(qmltypesDirsOption) # ifndef QT_BOOTSTRAPPED - : QStringList { QLibraryInfo::location(QLibraryInfo::Qml2ImportsPath), - QLatin1String(".") }; + : QStringList { QLibraryInfo::location(QLibraryInfo::Qml2ImportsPath) }; # else - : QStringList { QLatin1String(".") }; + : QStringList {}; # endif + + if (!parser.isSet(qmltypesFilesOption)) + qmltypeDirs << "."; + + QStringList qmltypeFiles = parser.isSet(qmltypesFilesOption) ? parser.values(qmltypesFilesOption) : QStringList {}; #else bool silent = false; bool warnUnqualified = false; QStringList qmltypeDirs {}; + QStringList qmltypeFiles {}; #endif bool success = true; #if QT_CONFIG(commandlineparser) @@ -151,7 +163,7 @@ int main(int argv, char *argc[]) const auto arguments = app.arguments(); for (const QString &filename : arguments) #endif - success &= lint_file(filename, silent, warnUnqualified, qmltypeDirs); + success &= lint_file(filename, silent, warnUnqualified, qmltypeDirs, qmltypeFiles); return success ? 0 : -1; } |