diff options
author | Qt Forward Merge Bot <qt_forward_merge_bot@qt-project.org> | 2020-03-26 01:00:11 +0100 |
---|---|---|
committer | Fabian Kosmale <fabian.kosmale@qt.io> | 2020-04-09 10:08:41 +0200 |
commit | 2812184e1bb87cd94d2989162bc6ea954bb585c4 (patch) | |
tree | 25460548730e2ddc1f6f328d54e97d3fbfb49d21 /tools | |
parent | cd4a99a7ba92968bf88da9af2624bb738d71e726 (diff) | |
parent | bf205b45a29ba80d94df3b6bac5fec4c7cd79bf9 (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.cpp | 12 | ||||
-rw-r--r-- | tools/qmlformat/commentastvisitor.h | 5 | ||||
-rw-r--r-- | tools/qmlformat/dumpastvisitor.cpp | 40 | ||||
-rw-r--r-- | tools/qmlformat/main.cpp | 35 | ||||
-rw-r--r-- | tools/qmllint/findunqualified.cpp | 41 | ||||
-rw-r--r-- | tools/qmllint/findunqualified.h | 3 | ||||
-rw-r--r-- | tools/qmllint/main.cpp | 24 |
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; } |