aboutsummaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorQt Forward Merge Bot <qt_forward_merge_bot@qt-project.org>2020-03-26 01:00:11 +0100
committerFabian Kosmale <fabian.kosmale@qt.io>2020-04-09 10:08:41 +0200
commit2812184e1bb87cd94d2989162bc6ea954bb585c4 (patch)
tree25460548730e2ddc1f6f328d54e97d3fbfb49d21 /tools
parentcd4a99a7ba92968bf88da9af2624bb738d71e726 (diff)
parentbf205b45a29ba80d94df3b6bac5fec4c7cd79bf9 (diff)
Merge remote-tracking branch 'origin/5.15' into dev
Conflicts: src/qml/jsruntime/qv4executablecompilationunit.cpp src/qml/jsruntime/qv4executablecompilationunit_p.h src/qml/qml/qqmlobjectcreator.cpp src/qml/qml/qqmlpropertycachecreator_p.h src/qml/qml/qqmltypecompiler.cpp src/qml/qml/qqmltypedata.cpp tests/auto/qml/qmlformat/tst_qmlformat.cpp tools/qmllint/scopetree.cpp src/qml/qml/qqmlapplicationengine_p.h Adjusted tools/qmllint/findunqualified.cpp to use newer API Change-Id: Ibfb4678ca39d626d47527265e3c96e43313873d4
Diffstat (limited to 'tools')
-rw-r--r--tools/qmlformat/commentastvisitor.cpp12
-rw-r--r--tools/qmlformat/commentastvisitor.h5
-rw-r--r--tools/qmlformat/dumpastvisitor.cpp40
-rw-r--r--tools/qmlformat/main.cpp35
-rw-r--r--tools/qmllint/findunqualified.cpp41
-rw-r--r--tools/qmllint/findunqualified.h3
-rw-r--r--tools/qmllint/main.cpp24
7 files changed, 131 insertions, 29 deletions
diff --git a/tools/qmlformat/commentastvisitor.cpp b/tools/qmlformat/commentastvisitor.cpp
index 4dd241ff93..9383fa29aa 100644
--- a/tools/qmlformat/commentastvisitor.cpp
+++ b/tools/qmlformat/commentastvisitor.cpp
@@ -126,6 +126,14 @@ Comment CommentAstVisitor::findComment(SourceLocation first, SourceLocation last
return Comment(m_engine, Comment::Location::Front, comments);
}
+ if (locations & Comment::Location::Front_Inline) {
+ quint32 searchAt = first.startLine;
+
+ const auto comments = findCommentsInLine(searchAt);
+ if (!comments.isEmpty())
+ return Comment(m_engine, Comment::Location::Front_Inline, comments);
+ }
+
if (locations & Comment::Location::Back_Inline) {
quint32 searchAt = last.startLine;
@@ -198,13 +206,13 @@ void CommentAstVisitor::endVisit(StatementList *node)
bool CommentAstVisitor::visit(UiObjectBinding *node)
{
- attachComment(node, Comment::Front | Comment::Back);
+ attachComment(node, Comment::Front | Comment::Front_Inline | Comment::Back);
return true;
}
bool CommentAstVisitor::visit(UiObjectDefinition *node)
{
- attachComment(node, Comment::Front | Comment::Back);
+ attachComment(node, Comment::Front | Comment::Front_Inline | Comment::Back);
return true;
}
diff --git a/tools/qmlformat/commentastvisitor.h b/tools/qmlformat/commentastvisitor.h
index d3de0a9b9d..21c7eb6416 100644
--- a/tools/qmlformat/commentastvisitor.h
+++ b/tools/qmlformat/commentastvisitor.h
@@ -45,10 +45,11 @@ struct Comment
enum Location : int
{
Front = 1,
- Back = Front << 1,
+ Front_Inline = Front << 1,
+ Back = Front_Inline << 1,
Back_Inline = Back << 1,
DefaultLocations = Front | Back_Inline,
- AllLocations = Front | Back | Back_Inline
+ AllLocations = Front | Back | Front_Inline | Back_Inline
} m_location = Front;
Comment() = default;
diff --git a/tools/qmlformat/dumpastvisitor.cpp b/tools/qmlformat/dumpastvisitor.cpp
index 75712975cc..e0feff4e51 100644
--- a/tools/qmlformat/dumpastvisitor.cpp
+++ b/tools/qmlformat/dumpastvisitor.cpp
@@ -626,7 +626,7 @@ QString DumpAstVisitor::parseStatement(Statement *statement, bool blockHasNext,
case Node::Kind_IfStatement: {
auto *ifStatement = cast<IfStatement *>(statement);
- m_blockNeededBraces = false;
+ m_blockNeededBraces = !blockAllowBraceless;
QString ifFalse = parseStatement(ifStatement->ko, false, true);
QString ifTrue = parseStatement(ifStatement->ok, !ifFalse.isEmpty(), true);
@@ -641,8 +641,36 @@ QString DumpAstVisitor::parseStatement(Statement *statement, bool blockHasNext,
ifTrue = parseStatement(ifStatement->ok, !ifFalse.isEmpty(), false);
}
+ if (ifStatement->ok->kind != Node::Kind_Block)
+ ifTrue += ";";
+
+ if (ifStatement->ko && ifStatement->ko->kind != Node::Kind_Block && ifStatement->ko->kind != Node::Kind_IfStatement)
+ ifFalse += ";";
+
QString result = "if (" + parseExpression(ifStatement->expression) + ")";
+ if (m_blockNeededBraces) {
+ if (ifStatement->ok->kind != Node::Kind_Block) {
+ QString result = "{\n";
+ m_indentLevel++;
+ result += formatLine(ifTrue);
+ m_indentLevel--;
+ result += formatLine("} ", false);
+ ifTrue = result;
+ ifTrueBlock = true;
+ }
+
+ if (ifStatement->ko && ifStatement->ko->kind != Node::Kind_Block && ifStatement->ko->kind != Node::Kind_IfStatement) {
+ QString result = "{\n";
+ m_indentLevel++;
+ result += formatLine(ifFalse);
+ m_indentLevel--;
+ result += formatLine("} ", false);
+ ifFalse = result;
+ ifFalseBlock = true;
+ }
+ }
+
if (ifTrueBlock) {
result += " " + ifTrue;
} else {
@@ -724,8 +752,6 @@ QString DumpAstVisitor::parseStatement(Statement *statement, bool blockHasNext,
else
result += ";";
-
-
return result;
}
case Node::Kind_WhileStatement: {
@@ -825,7 +851,7 @@ QString DumpAstVisitor::parseStatementList(StatementList *list)
result += getOrphanedComments(list);
for (auto *item = list; item != nullptr; item = item->next) {
- QString statement = parseStatement(item->statement->statementCast());
+ QString statement = parseStatement(item->statement->statementCast(), false, true);
if (statement.isEmpty())
continue;
@@ -843,8 +869,8 @@ QString DumpAstVisitor::parseStatementList(StatementList *list)
}
bool DumpAstVisitor::visit(UiPublicMember *node) {
- addLine(getComment(node, Comment::Location::Front));
+ QString commentFront = getComment(node, Comment::Location::Front);
QString commentBackInline = getComment(node, Comment::Location::Back_Inline);
switch (node->type)
@@ -859,6 +885,7 @@ bool DumpAstVisitor::visit(UiPublicMember *node) {
scope().m_firstSignal = false;
}
+ addLine(commentFront);
addLine("signal "+node->name.toString()+"("+parseUiParameterList(node->parameters) + ")"
+ commentBackInline);
break;
@@ -897,6 +924,7 @@ bool DumpAstVisitor::visit(UiPublicMember *node) {
if (has_type_modifier)
member_type = node->typeModifier + "<" + member_type + ">";
+ addLine(commentFront);
if (is_readonly && statement.isEmpty()
&& scope().m_bindings.contains(node->name.toString())) {
m_result += formatLine(prefix + "property " + member_type + " ", false);
@@ -1003,6 +1031,7 @@ bool DumpAstVisitor::visit(UiObjectDefinition *node) {
}
addLine(getComment(node, Comment::Location::Front));
+ addLine(getComment(node, Comment::Location::Front_Inline));
addLine(parseUiQualifiedId(node->qualifiedTypeNameId) + " {");
m_indentLevel++;
@@ -1198,6 +1227,7 @@ bool DumpAstVisitor::visit(UiObjectBinding *node) {
} else {
addNewLine();
addLine(getComment(node, Comment::Location::Front));
+ addLine(getComment(node, Comment::Location::Front_Inline));
addLine(result + " {");
}
diff --git a/tools/qmlformat/main.cpp b/tools/qmlformat/main.cpp
index da58ffd5d0..3e71110cf9 100644
--- a/tools/qmlformat/main.cpp
+++ b/tools/qmlformat/main.cpp
@@ -43,7 +43,7 @@
#include "dumpastvisitor.h"
#include "restructureastvisitor.h"
-bool parseFile(const QString& filename, bool inplace, bool verbose, bool sortImports, bool force)
+bool parseFile(const QString& filename, bool inplace, bool verbose, bool sortImports, bool force, const QString& newline)
{
QFile file(filename);
@@ -128,11 +128,27 @@ bool parseFile(const QString& filename, bool inplace, bool verbose, bool sortImp
}
}
+
+ const bool native = newline == "native";
+
+ if (!native) {
+ if (newline == "macos") {
+ dumpCode = dumpCode.replace("\n","\r");
+ } else if (newline == "windows") {
+ dumpCode = dumpCode.replace("\n", "\r\n");
+ } else if (newline == "unix") {
+ // Nothing needs to be done for unix line-endings
+ } else {
+ qWarning().noquote() << "Unknown line ending type" << newline;
+ return false;
+ }
+ }
+
if (inplace) {
if (verbose)
qWarning().noquote() << "Writing to file" << filename;
- if (!file.open(QIODevice::Text | QIODevice::WriteOnly))
+ if (!file.open(native ? QIODevice::WriteOnly | QIODevice::Text : QIODevice::WriteOnly))
{
qWarning().noquote() << "Failed to open" << filename << "for writing";
return false;
@@ -141,7 +157,9 @@ bool parseFile(const QString& filename, bool inplace, bool verbose, bool sortImp
file.write(dumpCode.toUtf8());
file.close();
} else {
- QTextStream(stdout) << dumpCode;
+ QFile out;
+ out.open(stdout, QIODevice::WriteOnly);
+ out.write(dumpCode.toUtf8());
}
return true;
@@ -172,6 +190,10 @@ int main(int argc, char *argv[])
parser.addOption(QCommandLineOption({"f", "force"},
QStringLiteral("Continue even if an error has occurred.")));
+ parser.addOption(QCommandLineOption({"l", "newline"},
+ QStringLiteral("Override the new line format to use (native macos unix windows)."),
+ "newline", "native"));
+
parser.addPositionalArgument("filenames", "files to be processed by qmlformat");
parser.process(app);
@@ -181,8 +203,13 @@ int main(int argc, char *argv[])
if (positionalArguments.isEmpty())
parser.showHelp(-1);
+ if (!parser.isSet("inplace") && parser.value("newline") != "native") {
+ qWarning() << "Error: The -l option can only be used with -i";
+ return -1;
+ }
+
for (const QString& file: parser.positionalArguments()) {
- if (!parseFile(file, parser.isSet("inplace"), parser.isSet("verbose"), !parser.isSet("no-sort"), parser.isSet("force")))
+ if (!parseFile(file, parser.isSet("inplace"), parser.isSet("verbose"), !parser.isSet("no-sort"), parser.isSet("force"), parser.value("newline")))
success = false;
}
#endif
diff --git a/tools/qmllint/findunqualified.cpp b/tools/qmllint/findunqualified.cpp
index baae3a3ce7..604cf49122 100644
--- a/tools/qmllint/findunqualified.cpp
+++ b/tools/qmllint/findunqualified.cpp
@@ -183,8 +183,6 @@ QStringList completeImportPaths(const QString &uri, const QString &basePath, QTy
}
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,
@@ -287,16 +285,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::Ptr 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, &dependencies);
+ if (!succ)
+ m_colorOut.writeUncolored(reader.errorMessage());
+ }
+ }
+
// add builtins
for (auto objectIt = objects.begin(); objectIt != objects.end(); ++objectIt) {
auto val = objectIt.value();
@@ -644,10 +666,11 @@ 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(ScopeTree::create(ScopeType::JSFunctionScope, "global")),
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 1c1751fafb..1782012424 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();
@@ -69,6 +69,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, ScopeTree::ConstPtr> 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;
}