From 5a4ffa0de0ecc666a514ef60f0149a76d25b040d Mon Sep 17 00:00:00 2001 From: Ulf Hermann Date: Mon, 25 Nov 2019 14:49:07 +0100 Subject: QQmlListProperty: Add replace and removeLast functions This allows us to implement QmlListWrapper::virtualPut(). Also, the additional functions make the list properties useful in other contexts. Fixes: QTBUG-79263 Change-Id: I528bc69222ca7743f0fc3697c3aed2a3468b4d87 Reviewed-by: Paul Wicking Reviewed-by: Shawn Rutledge Reviewed-by: Fabian Kosmale --- tools/qml/conf.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'tools') diff --git a/tools/qml/conf.h b/tools/qml/conf.h index e83d63cba5..4ad45428ed 100644 --- a/tools/qml/conf.h +++ b/tools/qml/conf.h @@ -81,7 +81,7 @@ public: QQmlListProperty sceneCompleters() { - return QQmlListProperty(this, completers); + return QQmlListProperty(this, &completers); } QList completers; -- cgit v1.2.3 From dbaf9685ca58580e7691958735458706fa3196da Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Wed, 15 Jan 2020 10:55:27 +0100 Subject: qml: Fix options that need to be set before QApplication instantiation Move the Open GL and scaling options setting QCoreApplication attributes into the helper getAppFlags() which already handles the application type. Change getAppFlags() to not modify argv which is not necessary since the parser will accept the options. Change-Id: Ib2f94f832e6551a938ff0e9bfe27649850d38d1e Reviewed-by: Ulf Hermann --- tools/qml/main.cpp | 51 ++++++++++++++++++++++++++------------------------- 1 file changed, 26 insertions(+), 25 deletions(-) (limited to 'tools') diff --git a/tools/qml/main.cpp b/tools/qml/main.cpp index daa278457d..15b3539188 100644 --- a/tools/qml/main.cpp +++ b/tools/qml/main.cpp @@ -332,26 +332,35 @@ void quietMessageHandler(QtMsgType type, const QMessageLogContext &ctxt, const Q } } -// Called before application initialization, removes arguments it uses -void getAppFlags(int &argc, char **argv) +// Called before application initialization +static void getAppFlags(int argc, char **argv) { #ifdef QT_GUI_LIB for (int i=0; isetConsistentTiming(true); #endif - if (parser.isSet(glEsOption)) - QCoreApplication::setAttribute(Qt::AA_UseOpenGLES); - if (parser.isSet(glSoftwareOption)) - QCoreApplication::setAttribute(Qt::AA_UseSoftwareOpenGL); - if (parser.isSet(glDesktopOption)) - QCoreApplication::setAttribute(Qt::AA_UseDesktopOpenGL); - if (parser.isSet(scalingOption)) - QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); - if (parser.isSet(noScalingOption)) - QCoreApplication::setAttribute(Qt::AA_DisableHighDpiScaling); for (const QString &importPath : parser.values(importOption)) e.addImportPath(importPath); files << parser.values(qmlFileOption); -- cgit v1.2.3 From 9e674be4fb8c369873a009f58e3152a12d2c4cce Mon Sep 17 00:00:00 2001 From: Maximilian Goldstein Date: Wed, 15 Jan 2020 11:25:18 +0100 Subject: qmlformat: Fix some language features being unsupported qmlformat now supports: - arrow functions - generator functions - this expressions - object patterns - regex literals - type expressions - plain expressions Aborts if an error occurs during dumping now. Also now automatically tests qmlformat against all example / test qml files. Change-Id: Idc24004c6f2c1cd65289bcad75985a1ef047c8d2 Reviewed-by: Fabian Kosmale --- tools/qmlformat/dumpastvisitor.cpp | 98 +++++++++++++++++++++++++++++++++----- tools/qmlformat/dumpastvisitor.h | 3 ++ tools/qmlformat/main.cpp | 17 +++++-- 3 files changed, 103 insertions(+), 15 deletions(-) (limited to 'tools') diff --git a/tools/qmlformat/dumpastvisitor.cpp b/tools/qmlformat/dumpastvisitor.cpp index 716be0a9a7..20ebef8927 100644 --- a/tools/qmlformat/dumpastvisitor.cpp +++ b/tools/qmlformat/dumpastvisitor.cpp @@ -28,6 +28,8 @@ #include "dumpastvisitor.h" +#include + DumpAstVisitor::DumpAstVisitor(Node *rootNode, CommentAstVisitor *comment): m_comment(comment) { // Add all completely orphaned comments @@ -257,6 +259,22 @@ QString DumpAstVisitor::parseFormalParameterList(FormalParameterList *list) return result; } +QString DumpAstVisitor::parsePatternProperty(PatternProperty *property) +{ + return escapeString(property->name->asString())+": "+parsePatternElement(property, false); +} + +QString DumpAstVisitor::parsePatternPropertyList(PatternPropertyList *list) +{ + QString result = ""; + + for (auto *item = list; item != nullptr; item = item->next) { + result += formatLine(parsePatternProperty(item->property) + (item->next != nullptr ? "," : "")); + } + + return result; +} + QString DumpAstVisitor::parseExpression(ExpressionNode *expression) { if (expression == nullptr) @@ -288,13 +306,23 @@ QString DumpAstVisitor::parseExpression(ExpressionNode *expression) auto *functExpr = cast(expression); m_indentLevel++; - QString result = "function"; + QString result; + + if (!functExpr->isArrowFunction) { + result += "function"; - if (!functExpr->name.isEmpty()) - result += " " + functExpr->name; + if (functExpr->isGenerator) + result += "*"; - result += "("+parseFormalParameterList(functExpr->formals)+") {\n" - + parseStatementList(functExpr->body); + if (!functExpr->name.isEmpty()) + result += " " + functExpr->name; + + result += "("+parseFormalParameterList(functExpr->formals)+") {\n" + + parseStatementList(functExpr->body); + } else { + result += "("+parseFormalParameterList(functExpr->formals)+") => {\n"; + result += parseStatementList(functExpr->body); + } m_indentLevel--; @@ -304,6 +332,8 @@ QString DumpAstVisitor::parseExpression(ExpressionNode *expression) } case Node::Kind_NullExpression: return "null"; + case Node::Kind_ThisExpression: + return "this"; case Node::Kind_PostIncrementExpression: return parseExpression(cast(expression)->base)+"++"; case Node::Kind_PreIncrementExpression: @@ -371,6 +401,44 @@ QString DumpAstVisitor::parseExpression(ExpressionNode *expression) return result; } + case Node::Kind_ObjectPattern: { + auto *objectPattern = cast(expression); + QString result = "{\n"; + + m_indentLevel++; + result += parsePatternPropertyList(objectPattern->properties); + m_indentLevel--; + + result += formatLine("}", false); + + return result; + } + case Node::Kind_Expression: { + auto* expr = cast(expression); + return parseExpression(expr->left)+", "+parseExpression(expr->right); + } + case Node::Kind_Type: { + auto* type = reinterpret_cast(expression); + + return parseUiQualifiedId(type->typeId); + } + case Node::Kind_RegExpLiteral: { + auto* regexpLiteral = cast(expression); + QString result = "/"+regexpLiteral->pattern+"/"; + + if (regexpLiteral->flags & QQmlJS::Lexer::RegExp_Unicode) + result += "u"; + if (regexpLiteral->flags & QQmlJS::Lexer::RegExp_Global) + result += "g"; + if (regexpLiteral->flags & QQmlJS::Lexer::RegExp_Multiline) + result += "m"; + if (regexpLiteral->flags & QQmlJS::Lexer::RegExp_Sticky) + result += "y"; + if (regexpLiteral->flags & QQmlJS::Lexer::RegExp_IgnoreCase) + result += "i"; + + return result; + } default: m_error = true; return "unknown_expression_"+QString::number(expression->kind); @@ -383,7 +451,7 @@ QString DumpAstVisitor::parseVariableDeclarationList(VariableDeclarationList *li for (auto *item = list; item != nullptr; item = item->next) { result += parsePatternElement(item->declaration, (item == list)) - + (item->next != nullptr ? ", " : ""); + + (item->next != nullptr ? ", " : ""); } return result; @@ -469,7 +537,7 @@ QString DumpAstVisitor::parseStatement(Statement *statement, bool blockHasNext, case Node::Kind_VariableStatement: return parseVariableDeclarationList(cast(statement)->declarations); case Node::Kind_ReturnStatement: - return "return "+parseExpression(cast(statement)->expression); + return "return "+parseExpression(cast(statement)->expression); case Node::Kind_ContinueStatement: return "continue"; case Node::Kind_BreakStatement: @@ -705,7 +773,7 @@ bool DumpAstVisitor::visit(UiPublicMember *node) { addLine("signal "+node->name.toString()+"("+parseUiParameterList(node->parameters) + ")" + commentBackInline); - break; + break; case UiPublicMember::Property: { if (m_firstProperty) { if (m_firstOfAll) @@ -912,7 +980,15 @@ bool DumpAstVisitor::visit(FunctionDeclaration *node) { addNewLine(); addLine(getComment(node, Comment::Location::Front)); - addLine("function "+node->name+"("+parseFormalParameterList(node->formals)+") {"); + + QString head = "function"; + + if (node->isGenerator) + head += "*"; + + head += " "+node->name+"("+parseFormalParameterList(node->formals)+") {"; + + addLine(head); m_indentLevel++; m_result += parseStatementList(node->body); m_indentLevel--; @@ -970,8 +1046,8 @@ bool DumpAstVisitor::visit(UiImport *node) { result += parseUiQualifiedId(node->importUri); if (node->version) { - result += " " + QString::number(node->version->majorVersion) + "." - + QString::number(node->version->minorVersion); + result += " " + QString::number(node->version->majorVersion) + "." + + QString::number(node->version->minorVersion); } if (node->asToken.isValid()) { diff --git a/tools/qmlformat/dumpastvisitor.h b/tools/qmlformat/dumpastvisitor.h index e73a7b628f..2001f4366e 100644 --- a/tools/qmlformat/dumpastvisitor.h +++ b/tools/qmlformat/dumpastvisitor.h @@ -89,6 +89,9 @@ private: QString parsePatternElement(PatternElement *element, bool scope = true); QString parsePatternElementList(PatternElementList *element); + QString parsePatternProperty(PatternProperty *property); + QString parsePatternPropertyList(PatternPropertyList *list); + QString parseArgumentList(ArgumentList *list); QString parseUiParameterList(UiParameterList *list); diff --git a/tools/qmlformat/main.cpp b/tools/qmlformat/main.cpp index bca788d316..036fbe9748 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 parseFile(const QString& filename, bool inplace, bool verbose, bool sortImports, bool force) { QFile file(filename); @@ -101,8 +101,14 @@ bool parseFile(const QString& filename, bool inplace, bool verbose, bool sortImp DumpAstVisitor dump(parser.rootNode(), &comment); - if (dump.error()) - qWarning().noquote() << "An error has occurred. The output may not be reliable."; + if (dump.error()) { + if (force) { + qWarning().noquote() << "An error has occurred. The output may not be reliable."; + } else { + qWarning().noquote() << "Am error has occurred. Aborting."; + return false; + } + } if (inplace) { if (verbose) @@ -145,6 +151,9 @@ int main(int argc, char *argv[]) parser.addOption(QCommandLineOption({"i", "inplace"}, QStringLiteral("Edit file in-place instead of outputting to stdout."))); + parser.addOption(QCommandLineOption({"f", "force"}, + QStringLiteral("Continue even if an error has occurred."))); + parser.addPositionalArgument("filenames", "files to be processed by qmlformat"); parser.process(app); @@ -155,7 +164,7 @@ int main(int argc, char *argv[]) parser.showHelp(-1); for (const QString& file: parser.positionalArguments()) { - if (!parseFile(file, parser.isSet("inplace"), parser.isSet("verbose"), !parser.isSet("no-sort"))) + if (!parseFile(file, parser.isSet("inplace"), parser.isSet("verbose"), !parser.isSet("no-sort"), parser.isSet("force"))) success = false; } #endif -- cgit v1.2.3 From c6899f16389458766904d8d913054f09076e06dd Mon Sep 17 00:00:00 2001 From: Olivier Goffart Date: Tue, 3 Dec 2019 20:24:38 +0100 Subject: Replace QVariant::type with QVariant::userType as type is going to be deprecated. This change was done automatically with the help of clazy. In addition, ColumnRoleMetadata was changed to take an int instead of a QVariant::Type Change-Id: Ibc02d7b52e7d931a56c19fdebc4788b5e6df2a39 Reviewed-by: Lars Knoll --- tools/qmlimportscanner/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'tools') diff --git a/tools/qmlimportscanner/main.cpp b/tools/qmlimportscanner/main.cpp index c37910bdaf..b563d7df95 100644 --- a/tools/qmlimportscanner/main.cpp +++ b/tools/qmlimportscanner/main.cpp @@ -509,7 +509,7 @@ QString generateCmakeIncludeFileContent(const QVariantList &importList) { QTextStream s(&content); int importsCount = 0; for (const QVariant &importVariant: importList) { - if (static_cast(importVariant.type()) == QMetaType::QVariantMap) { + if (static_cast(importVariant.userType()) == QMetaType::QVariantMap) { s << QStringLiteral("set(qml_import_scanner_import_") << importsCount << QStringLiteral(" \""); -- cgit v1.2.3 From 87462935249e554d40a4ecbf4be50579bda5f783 Mon Sep 17 00:00:00 2001 From: Alexandru Croitor Date: Thu, 5 Dec 2019 13:30:26 +0100 Subject: CMake: Add Qt6 forward compatible CMake API Task-number: QTBUG-74137 Task-number: QTBUG-80477 Change-Id: Iaf88de57dd25f0a28c153667593203f75b6c472c Reviewed-by: Leander Beernaert Reviewed-by: Cristian Adam --- tools/qmlimportscanner/Qt5QmlImportScannerConfig.cmake.in | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'tools') diff --git a/tools/qmlimportscanner/Qt5QmlImportScannerConfig.cmake.in b/tools/qmlimportscanner/Qt5QmlImportScannerConfig.cmake.in index 6cdfaf8f6f..f92b8d295d 100644 --- a/tools/qmlimportscanner/Qt5QmlImportScannerConfig.cmake.in +++ b/tools/qmlimportscanner/Qt5QmlImportScannerConfig.cmake.in @@ -182,3 +182,13 @@ but this file does not exist. Possible reasons include: endif() !!ENDIF // !isEmpty(CMAKE_STATIC_TYPE) endfunction() + +if(NOT QT_NO_CREATE_VERSIONLESS_FUNCTIONS) + function(qt_import_qml_plugins) + if(QT_DEFAULT_MAJOR_VERSION EQUAL 5) + qt5_import_qml_plugins(${ARGV}) + elseif(QT_DEFAULT_MAJOR_VERSION EQUAL 6) + qt6_import_qml_plugins(${ARGV}) + endif() + endfunction() +endif() -- cgit v1.2.3 From 406f15ce0e2707452462ff73b2d660ece960623f Mon Sep 17 00:00:00 2001 From: Ulf Hermann Date: Fri, 24 Jan 2020 14:11:53 +0100 Subject: Quick: Don't qualify OpenGL includes The headers are moving from QtGui to QtOpenGL. By avoiding the qualification we can keep them compiling either way. Also, add opengl-private to make the types available. Also removed the QGraphicsRotation hack to get access to the projected rotation function of QMatrix4x4. The function is public now. Task-number: QTBUG-74409 Change-Id: I216e8ca09f8e247f96627b081308e3a57c55c29c Reviewed-by: Ulf Hermann --- tools/qmlscene/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'tools') diff --git a/tools/qmlscene/main.cpp b/tools/qmlscene/main.cpp index 260c5bb7d1..28370cb522 100644 --- a/tools/qmlscene/main.cpp +++ b/tools/qmlscene/main.cpp @@ -36,7 +36,7 @@ #include #include -#include +#include #include #include -- cgit v1.2.3