aboutsummaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorMaximilian Goldstein <max.goldstein@qt.io>2020-03-26 10:57:12 +0100
committerMaximilian Goldstein <max.goldstein@qt.io>2020-03-26 13:41:46 +0100
commita5b4d3dbab70c8e0cc57e895007fc4a798e129c7 (patch)
tree161d4db067c1f885830588506e4005712b0b76a3 /tools
parent7aac345415ca8970f3e5f094ec8fa1a26b36587b (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.cpp41
-rw-r--r--tools/qmllint/findunqualified.h3
-rw-r--r--tools/qmllint/main.cpp24
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;
}