aboutsummaryrefslogtreecommitdiffstats
path: root/tests/auto/qml/qmlcppcodegen
Commit message (Collapse)AuthorAgeFilesLines
* qmlcachegen: fix nonstrict equality code generationSemih Yavuz2023-01-312-1/+12
| | | | | | | | | | | | | | We should generate type checking code for only strict comparison of var against null/undefined types or vice versa cases. The non- strict comparison should be handled elsewhere. Removed pragma Strict to allow to add warning emitting tests of non-strict comparison. This amends 6a816a9e0dfc2b41a4f86c721679f2517ec27eb6 Pick-to: 6.5 Fixes: QTBUG-110769 Change-Id: I7f9a457e71a621a005f377216e841bec01667454 Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
* qmlcachegen: Improve QObject comparison code generation testSemih Yavuz2023-01-312-0/+15
| | | | | | | | | | | | The code generated for QObject comparisons holds for both weak and strong comparisons. Improve tst_qmlcppcodegen by adding missing weak comparison tests. Amends afc7928d1a1e47ecbc9d101c4e5d5fb1c5b78326. Pick-to: 6.5 Change-Id: Ib6176a39b329e792b81b3d8e8a288dcea074320b Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
* QML: Turn singleton/type mismatch into a run time type errorUlf Hermann2023-01-274-0/+33
| | | | | | | | | | | | | | | | | | | | | | | There are many ways to "hide" the qmldir from the engine at run time, which turns singletons into regular types. While all of this is invalid, we should not assert on it, but rather produce a legible warning. Furthermore, sharpen the importing of extra modules from qrc as implicit imports. We should really only import modules the file in question can ever be part of. Otherwise we needlessly produce the above situation and hide legitimate warning messages. Amends commit 7517c1b3ae9aa92f36b19d74a4b2de5e8531309b. Now we need to teach our tools about the default import paths in the resorurce file system. They cannot guess any type they may find in any resource file anymore. Pick-to: 6.5 Task-number: QTBUG-106929 Change-Id: Ic8c02396d10830a7f461e8a81649bb8c9a1add1f Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Sami Shalayel <sami.shalayel@qt.io>
* QML: Allow more conversions between different listsUlf Hermann2023-01-262-0/+24
| | | | | | | | | | You should be able to assign any list of QObjects to any other list of QObjects. Pick-to: 6.5 Fixes: QTBUG-108155 Change-Id: I6ddf0b49f7248ad56cc9560d217f3ea316c648a8 Reviewed-by: Sami Shalayel <sami.shalayel@qt.io>
* QML: Allow converting any object list to QQmlListPropertyUlf Hermann2023-01-252-0/+8
| | | | | | | | | We can use QSequentialIterable for this. Pick-to: 6.5 Fixes: QTBUG-110438 Change-Id: I7e82d0f089c9bb9eab46be46dedc2db3726e64b0 Reviewed-by: Sami Shalayel <sami.shalayel@qt.io>
* qmltyperegistrar: Strip '*' from list value typesUlf Hermann2023-01-254-2/+40
| | | | | | | | | | | | | | | | | We do this for function return types, property types, and function argument types already. Formally, we would have to store some "isPointer" somewhere, but considering that we never read it anyway, let's not go there. This allows the compilers to recognize lists of QObject-derived types as proper lists. This way we can generate better code for moving them around or getting their length. Pick-to: 6.5 Task-number: QTBUG-110438 Change-Id: I35e0fc21d574afc18799e9c3cef402f05b60a3ed Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io> Reviewed-by: Sami Shalayel <sami.shalayel@qt.io>
* tst_qmlcppcodegen: Add QML dependency for AndroidFabian Kosmale2023-01-253-4/+9
| | | | | | | | | | | | qmlimportscanner is rather limited in how it works, and does not pick up the Qt.labs.folderlistmodel dependency for Dialogs. Pick-to: 6.5 Fixes: QTBUG-103044 Change-Id: I778f5c8981f1a2603bc3a5d2fd249a83de6c9bd8 Reviewed-by: Sami Shalayel <sami.shalayel@qt.io> Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
* QmlCompiler: Wrap sequences with unknown elemnts in QVariantListUlf Hermann2023-01-232-0/+2
| | | | | | | | | | | Otherwise we later try to perform value type lookups on them. That won't work. Pick-to: 6.5 Task-number: QTBUG-110438 Change-Id: I1690a3375841ba5a1ff1a471a7f88bd2023ab4c4 Reviewed-by: Semih Yavuz <semih.yavuz@qt.io> Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* QML: Add a pragma for value type behaviorUlf Hermann2023-01-204-0/+105
| | | | | | | | | | | Unfortunately value types behave differently when compiled to C++. Document the difference and introduce a pragma to make them behave one way or the other. Pick-to: 6.5 Fixes: QTBUG-109221 Change-Id: Ib2685153c0b4ae209bafbea7a01229377fdb47dd Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* QmlCompiler: Handle various date and time conversions correctlyUlf Hermann2023-01-174-0/+75
| | | | | | | | | | | | | We can coerce QDateTime, QDate and QTime into each other because they would all be represented by a Date object in JavaScript. Furthermore we can coerce them all to QString. Technically, we could also coerce strings to all of them, but we don't want to because that is terrible. Fixes: QTBUG-109380 Change-Id: I176bfb5b715a6a6750cb5918c44261fa23fb8832 Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io> Reviewed-by: Sami Shalayel <sami.shalayel@qt.io>
* Allow extraction of V4 values from QJSPrimitiveValueUlf Hermann2023-01-163-0/+28
| | | | | | | | | | Since we can produce QJSPrimitiveValue in metaTypeFromJS, we should also handle the other direction. Fixes: QTBUG-109867 Pick-to: 6.5 Change-Id: I2c7598d19eba3e78d071ca3eceb32deda4d0ead8 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* QmlCachegen: Equality comparison ability to QObject *Semih Yavuz2023-01-103-1/+38
| | | | | | | | | | We should be able to compare QObject * with QObject * or a nullptr. Pick-to: 6.5 Fixes: QTBUG-109377 Change-Id: I0e9d6fdc89cbb471774d6382316dfb4813310e1d Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
* QmlCachegen: Equality comparison ability to var and void/null typesSemih Yavuz2023-01-064-0/+93
| | | | | | | | | | | | | | | The code generator currently rejects any comparisons other than primitive types. Add comparison capability for var types against null or undefined types and vice versa. To achieve this, we generate code that fetches the contained object within the variant and comparison is done depending on the stored type. Ideally, we also need to add comparison capability for QObject *, that will be handled with QTBUG-109377. Pick-to: 6.5 Fixes: QTBUG-108632 Change-Id: Ib15450d7922f6025c78def5cc548c74827ad740f Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
* QmlCompiler: Test that infinities cleanly cast to intUlf Hermann2022-12-233-0/+29
| | | | | | | Task-number: QTBUG-108820 Change-Id: I984f6f35ffd32ca9adae31e56010d10c683e5615 Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Sami Shalayel <sami.shalayel@qt.io>
* QmlCompiler: Fix recognition of builtin list typesUlf Hermann2022-12-151-0/+7
| | | | | | | | | | | | | Previously all list types used as arguments or return types for methods had to be looked up via the imports. However, builtin types are not part of the imports at run time. Therefore, recognize list types already early on, when generating the IR. This is the same way we do it for property types and it allows us to easily identify lists of builtins. Pick-to: 6.5 Fixes: QTBUG-109147 Change-Id: I91fa9c8fc99c1e0155cc5db5faddd928ca7fabbc Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
* QmlCompiler: Fix wrapping of numbers in QJSPrimitiveValueUlf Hermann2022-12-154-0/+148
| | | | | | | | | | | | | | | | | | We need to explicitly cast to double if we are wrapping a number type that's not natively accepted by the ctors. As a side effect, correctly run conversions from generic QVariant to QJSPrimitiveValue through the engine now. For that we need another clause in metaTypeFromJS(). Since we are calling methods that return list types in the test, we need to add another clause that converts JS arrays to list types. Otherwise we cannot run that test in interpreted mode. Pick-to: 6.5 6.2 6.4 6.4.2 Task-number: QTBUG-109111 Change-Id: I87f7aafd24371d2c1ffe85569e1f2cd3a1979742 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* QmlCompiler: Mark StoreElement on JS values has having side effectsUlf Hermann2022-12-153-0/+23
| | | | | | | | | | A StoreElement on a JS value can do pretty much anything you can imagine, after all. Pick-to: 6.5 6.4 6.4.2 Fixes: QTBUG-109196 Change-Id: Ic638d94b55e6340eb9fe56abc663a6f0f2277f5e Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* QQmlJSCodeGenerator: fix nullptr dereferenceFabian Kosmale2022-12-125-0/+84
| | | | | | | | | | | | | If we try to lookup the length of a generic QVariant, we fail, and so far crashed. We should ideally detect that we are dealing with an array (and thus length is a known, available property), but for now simply reject compilation to C++. Pick-to: 6.4 Fixes: QTBUG-109164 Change-Id: I9d4149ac09a351754d012dbc829774413d6b32eb Reviewed-by: Semih Yavuz <semih.yavuz@qt.io> Reviewed-by: Sami Shalayel <sami.shalayel@qt.io>
* QML: Unify postprocessing of importsUlf Hermann2022-12-075-0/+44
| | | | | | | | | | | We want to always import dependencies, always import qualified scripts, and always try to load C++-based types from the binary. Furthermore, directory imports should be imported with their qmldir URI where possible, so that we can find them when loading local C++-based types. Fixes: QTBUG-109109 Change-Id: I58f08f479623a886c802035b41f5f604338468b5 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* QmlCompiler: Ignore cloned signals when analyzing signal handlersUlf Hermann2022-12-074-1/+28
| | | | | | | | | We obviously want to see the defaulted parameters when generating the handlers. Fixes: QTBUG-108762 Change-Id: I33a52bac305238467d45650bf8a2ad59d40e366f Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* Fix comparison AOT-lookup and intended type in value typesSemih Yavuz2022-12-054-0/+57
| | | | | | | | | | | | We currently force the lookup metatype to be exactly the same data type with the caller's. As a result, the conversion from enum to integral data type is not recognized. Relax this comparison by using isTypeCompatible helper. Pick-to: 6.4 Fixes: QTBUG-109007 Change-Id: I188dc3e6c1fd7100e9ed5c4ba5d0c90d85d79be4 Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
* QmlCompiler: Fix various kinds of enum lookupUlf Hermann2022-12-024-0/+90
| | | | | | | | | | | | | | | | | * If we got an object type exposed as namespace, we still need to add the "*" to get its augmentedInternalName(). Otherwise we cannot get its metaobject, needed to look up enums. * Enums cannot be shadowed. The shadow check will produce garbage if we try to check because an enum lookup also does not use the accumulator, which then contains some artifact from a previous operation. * If we find a property lookup on a plain QMetaObject* we have to immediately return in order to not confuse it with attached properties. Pick-to: 6.4 6.2 Fixes: QTBUG-109048 Change-Id: If9e3b4806e4d773de9cf48f1b3750b684a8c8f69 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* qmltyperegistrar: Generate accessSemantics="none" for foreign namespacesUlf Hermann2022-11-294-1/+26
| | | | | | | | | | | | If the local type is a namespace, the resulting type can only be a namespace, too, no matter what kind of tag the foreign one has. Furthermore, we can re-use types with other QML_* tags this way. Task-number: QTBUG-108883 Change-Id: Ib2ae08d5b081b8faa35124314f97d406d7b4f76f Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* QmlCompiler: Store imported types in a QListUlf Hermann2022-11-254-0/+74
| | | | | | | | | | | | | | | The same type can be exported multiple times with different attributes, even in the same module. This requires us to fix directory imports as qmllint otherwise complains about SegFault.bad.qml and SegFault.qml being the same type (which they obviously aren't). Task-number: QTCREATORBUG-27590 Change-Id: I295d927b9a07acbb715055a6883ac44b50129c2d Reviewed-by: Sami Shalayel <sami.shalayel@qt.io> Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io> Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
* QmlCompiler: Implement console logging methodsUlf Hermann2022-11-234-0/+71
| | | | | | | | | | | We provide semi-private functions in the AOT context for this. Since we cannot know the complete run time type of the potential logging category at compile time, we have to check any first argument that might be one separately. Fixes: QTBUG-107175 Change-Id: I46a8922b1c5c16d2b450b8728d650d31dfd867e3 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* QmlCompiler: Fix comparison of null and undefinedUlf Hermann2022-11-233-0/+43
| | | | | | | | | | | | Those are not stored. If we compare null to null or undefined to undefined, we do not have to generate a comparison at all. the result is statically known. Pick-to: 6.4 Fixes: QTBUG-108634 Change-Id: I6a5323c2e0c023838609aec90d7ecc15b885dc08 Reviewed-by: Sami Shalayel <sami.shalayel@qt.io> Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* QmlCompiler: Don't crash on CallWithSpreadUlf Hermann2022-11-223-0/+21
| | | | | | | | | | | | | When preparing for such a call, the byte code loads an "empty" constant. This has to be represented in the type system so that we don't hit the assert at the end of the instruction. Pick-to: 6.4 6.2 Task-number: QTBUG-108441 Change-Id: I66220bfae3d3a4b8e9600d84d4cfc43ac858b77e Reviewed-by: Sami Shalayel <sami.shalayel@qt.io> Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* Remove signal index mismatch in aot-compiled codeSami Shalayel2022-11-153-0/+65
| | | | | | | | | | | | | | | | | | | | | There are multiple types of signal indexes, one of them belongs to QMetaMethod::signalIndex and another one to QObjectPrivate::signalIndex. Stop mixing them up in aot-compiled code when capturing properties as this leads to weird and hard to debug bugs. Add a smaller version of the drag and drop example as test to make sure that the bug does not appear again, without any visual elements. Fixes: QTBUG-104047 Fixes: QTBUG-104716 Pick-to: 6.4 6.2 Change-Id: I4f64ba237e824ff0ba1624c29ddcf5371d03d69e Reviewed-by: Ulf Hermann <ulf.hermann@qt.io> Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* QML: Fix the most blatant TDZ violationsUlf Hermann2022-11-141-0/+6
| | | | | | | | | | | When reading a let or const register before its declaration we can be sure this is invalid. Task-number: QTBUG-108362 Fixes: QTBUG-77428 Change-Id: I7e8f8b46079860f00c051c1a91f773dc8cdd5595 Reviewed-by: Sami Shalayel <sami.shalayel@qt.io> Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* QmlCompiler: Ignore InitializeDeadTemporalZone instructionUlf Hermann2022-11-114-0/+34
| | | | | | | | | We don't discern between empty and undefined values in the compiler. Fixes: QTBUG-104192 Change-Id: Ida06386433ef9e8f9a7cba4bec99ba8e77edc324 Reviewed-by: Sami Shalayel <sami.shalayel@qt.io> Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* QmlCompiler: Allow lists as arguments to methodsUlf Hermann2022-11-103-0/+50
| | | | | | | | | | | | | | | | | | | Since lists are allowed as property types, you should be able to pass them as arguments to methods, too. For now we only handle QML-defined methods, implemented by adding JavaScript functions to your QML elements. The usual type coercion rules apply if you pass JavaScript arrays to such methods. That is, it usually works. We now resolve properties with the "list" flag to their actual types (QQmlListProperty or QList) already when populating the QQmlJSScope, and store the list types as members of QQmlJSScope rather than as a special map in QQmlJSTypeResolver. This allows us to do the same to lists passed as arguments and simplifies some of the type analysis. Fixes: QTBUG-107171 Change-Id: Idf71ccdc1d59f472c17084a36b5d7879c4d959c0 Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* Port to new Q_UNREACHABLE_RETURN()Marc Mutz2022-10-201-2/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This is a semantic patch using ClangTidyTransformator to convert sequences of Q_UNREACHABLE() + return into Q_UNREACHABLE_RETURN(), newly added to qtbase. const std::string unr = "unr", val = "val", ret = "ret"; auto makeUnreachableReturn = cat("Q_UNREACHABLE_RETURN(", ifBound(val, cat(node(val)), cat("")), ")"); auto ignoringSwitchCases = [](auto stmt) { return anyOf(stmt, switchCase(subStmt(stmt))); }; makeRule(stmt(ignoringSwitchCases(stmt(isExpandedFromMacro("Q_UNREACHABLE")).bind(unr)), nextStmt(returnStmt(optionally(hasReturnValue(expr().bind(val)))).bind(ret))), {changeTo(node(unr), cat(makeUnreachableReturn, ";")), // TODO: why is the ; lost w/o this? changeTo(node(ret), cat(""))}, cat("use ", makeUnreachableReturn)); a.k.a qt-use-unreachable-return. subStmt() and nextStmt() are non-standard matchers. There was one false positive, suppressed it with NOLINTNEXTLINE. It's not really a false positiive, it's just that Clang sees the world in one way and if conditonal compilation (#if) differs for other compilers, Clang doesn't know better. This is an artifact of matching two consecutive statements. Change-Id: I3855b2dc8523db1ea860f72ad9818738162495c6 Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* Add option to enforce function signaturesUlf Hermann2022-10-144-0/+72
| | | | | | | | | | | | | | | | | | | | | By default, the QML engine does not enforce signatures given as type annotations to functions. By passing different types than the function declares, you can get different behavior between the interpreter/JIT and the AOT-compiled code. In addition, in interpreted or JIT'ed mode, we pass all non-primitive value types as references. This means, if you modify them within the called function, the modifications are propagated back to the place where the value was loaded from. Enforcing the signature prevents all of this, at a run time cost. Since we have to coerce all arguments to the desired types, the function call overhead grows. This change introduces a pragma "FunctionSignatureBehavior" which you can set to "Ignored" or "Enforced" to choose one way or the other as universal way of handling type annotations. Fixes: QTBUG-106819 Change-Id: I50e9b2bd6702907da44974cd9e05b48a96bb609e Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* Port from container::count() and length() to size() - V5Marc Mutz2022-10-131-4/+4
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This is a semantic patch using ClangTidyTransformator as in qtbase/df9d882d41b741fef7c5beeddb0abe9d904443d8, but extended to handle typedefs and accesses through pointers, too: const std::string o = "object"; auto hasTypeIgnoringPointer = [](auto type) { return anyOf(hasType(type), hasType(pointsTo(type))); }; auto derivedFromAnyOfClasses = [&](ArrayRef<StringRef> classes) { auto exprOfDeclaredType = [&](auto decl) { return expr(hasTypeIgnoringPointer(hasUnqualifiedDesugaredType(recordType(hasDeclaration(decl))))).bind(o); }; return exprOfDeclaredType(cxxRecordDecl(isSameOrDerivedFrom(hasAnyName(classes)))); }; auto renameMethod = [&] (ArrayRef<StringRef> classes, StringRef from, StringRef to) { return makeRule(cxxMemberCallExpr(on(derivedFromAnyOfClasses(classes)), callee(cxxMethodDecl(hasName(from), parameterCountIs(0)))), changeTo(cat(access(o, cat(to)), "()")), cat("use '", to, "' instead of '", from, "'")); }; renameMethod(<classes>, "count", "size"); renameMethod(<classes>, "length", "size"); except that on() was replaced with a matcher that doesn't ignoreParens(). a.k.a qt-port-to-std-compatible-api V5 with config Scope: 'Container'. Change-Id: I58e1b41b91c34d2e860dbb5847b3752edbfc6fc9 Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
* QmlCompiler: Properly check contained type for enumsUlf Hermann2022-10-123-0/+22
| | | | | | | | | | | | | | | In case of an enum the actual contained type is the one the enum dictates. This brings registerContains() in line with containedType() and makes it possible to match previously discovered types on subsequent passes of the type propagator. Therefore, it avoids infinite loops where the same types would be tracked over and over. Pick-to: 6.4 Fixes: QTBUG-107176 Fixes: QTBUG-107542 Change-Id: I4b8d66b157d0ec0ece4ca345cb99a630b8898a1b Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io> Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
* Port from container::count() and length() to size()Marc Mutz2022-10-072-7/+7
| | | | | | | | | | | | | | | | | | | | This is a semantic patch using ClangTidyTransformator as in qtbase/df9d882d41b741fef7c5beeddb0abe9d904443d8: auto QtContainerClass = anyOf( expr(hasType(cxxRecordDecl(isSameOrDerivedFrom(hasAnyName(classes))))).bind(o), expr(hasType(namedDecl(hasAnyName(<classes>)))).bind(o)); makeRule(cxxMemberCallExpr(on(QtContainerClass), callee(cxxMethodDecl(hasAnyName({"count", "length"), parameterCountIs(0))))), changeTo(cat(access(o, cat("size"), "()"))), cat("use 'size()' instead of 'count()/length()'")) a.k.a qt-port-to-std-compatible-api with config Scope: 'Container', with the extended set of container classes recognized. Change-Id: Idb1f75dfe2323bd1d9e8b4d58d54f1b4b80c7ed7 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* QmlCompiler: Do not crash on version-mismatched property accessUlf Hermann2022-10-064-1/+27
| | | | | | | | | | | If we cannot access a property due to a version mismatch, that's not an unqualified access. Pick-to: 6.4 Fixes: QTBUG-107080 Change-Id: I1780b171928df437a2121601f1aac829dbe1e994 Reviewed-by: Semih Yavuz <semih.yavuz@qt.io> Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* V4: Use an enum to categorize functions and rename aotFunctionUlf Hermann2022-09-291-1/+1
| | | | | | | | We want to use the aotFunction member also for typed JavaScript functions. Change-Id: Iad6d12ebed3ad3069832484137ed8e4d9e7a7cf4 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* Extend hack to pass QML types through QMetaObject::invokeMethod()Ulf Hermann2022-09-131-2/+23
| | | | | | | | We now actually need a valid metatype. Task-number: QTBUG-106194 Change-Id: Idfc41cae4216e30058f797b08863c350f473ba55 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* Change the license of all CMakeLists.txt and *.cmake files to BSDLucie Gérard2022-09-072-2/+2
| | | | | | | Task-number: QTBUG-105718 Change-Id: Id89ed14990804a5024183e75382cc539d4293da1 Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Jörg Bornemann <joerg.bornemann@qt.io>
* QmlCompiler: Prevent lookup of value type where we need an object typeUlf Hermann2022-08-303-0/+28
| | | | | | | | | | | | | | | | | With a particular nefarious combination of Q_GADGET and inheritance from QObject you can make QmlCompiler believe a type is a value type even though it is actually an object type. We never want to touch such a thing. There was a safe guard against this when looking up the type from the scope, but by putting it in a type namespace you could circumvent it. Refactor the code to apply to both cases the same way. Pick-to: 6.2 6.3 6.4 Fixes: QTBUG-104556 Fixes: QTBUG-105608 Change-Id: I8a690e2b6f78fcaba0911a93504cde0d2c7dde0d Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* QmlCompiler: Implement remaining operatorsUlf Hermann2022-08-294-36/+469
| | | | | | | | | | | | | Some of the math operators were still missing. Add them and test them all. Since the "runInterpreted()" test function takes too long now, split the qmlcppcodegen test in two: One that runs in compiled mode and one that runs in interpreted mode. Fixes: QTBUG-105188 Change-Id: I4b641d5e51b5a7e2a9254be40f257d7b249deb13 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* tst_QmlCppCodegen: don't use QGenericArgument directlyThiago Macieira2022-08-041-3/+9
| | | | | | | | | | Just create a dummy type that has the actual name. To make that possible, export the property cache creator's class counter to the autotests – otherwise, we cannot know the name of the actual type, as it would depend on the order in which the tests run. Change-Id: I36b24183fbd041179f2ffffd17026b224c9737fa Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
* QmlCompiler: Allow any conversion possible via QJSPrimitiveValueUlf Hermann2022-08-033-0/+21
| | | | | | | | | | | | All of those are legal in ECMAScript, and so we need to support them in script bindings. As we have stricter rules for literal bindings, add an extra method there to check for what QQmlPropertyValidator does. Pick-to: 6.4 Fixes: QTBUG-105252 Task-number: QTBUG-105188 Change-Id: I0621b2c3aa196414f669873e93670557284a8bca Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* QQmlListAccessor: Accept QQmlListPropertyUlf Hermann2022-07-263-0/+29
| | | | | | | | | | | So far we have only accepted QQmlListReference. However, we can also pass a QQmlListProperty around as value. Pick-to: 6.2 6.3 6.4 Fixes: QTBUG-105137 Change-Id: I7d4cd3048b62594298f91013c4cda5ec864a28df Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io> Reviewed-by: Andrei Golubev <andrei.golubev@qt.io>
* QmlCompiler: Support conversions between QString and QByteArrayUlf Hermann2022-07-225-0/+48
| | | | | | | Pick-to: 6.4 Fixes: QTBUG-104702 Change-Id: I80d3a28e17751d440ec4bea4c7be0d09c935fa19 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* QmlCompiler: Implement Math.pow()Ulf Hermann2022-07-212-1/+2
| | | | | | | | | Also, add missing positive infinity to test data. Pick-to: 6.4 Fixes: QTBUG-104745 Change-Id: I958aca672cca8cc83c540ed3ea75b08e70eb90fd Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* QmlCompiler: Allow storeNameSloppy to reset a propertyUlf Hermann2022-07-113-0/+14
| | | | | | | | | We should not convert from undefined on storeNameSloppy. The reset is intentional. Task-number: QTBUG-104508 Change-Id: Iede88fe6331dd173c9e8ea0ec4200df2b8bd30eb Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
* Add license headers to cmake filesLucie Gérard2022-07-082-0/+6
| | | | | | | | | | | | CMakeLists.txt and .cmake files of significant size (more than 2 lines according to our check in tst_license.pl) now have the copyright and license header. Existing copyright statements remain intact Task-number: QTBUG-88621 Change-Id: I72c89a98c42bbc9234d8495e9e503bec81d11037 Reviewed-by: Jörg Bornemann <joerg.bornemann@qt.io>
* QmlCompiler: Handle trivial signal handler constructionsUlf Hermann2022-07-076-1/+46
| | | | | | | | | | | | | | If the signal handler does nothing but return a closure, we have to compile the closure using the same signature as the outer signal handler. In order for this to work, we also have to detect unresolved argument types for signal handlers. Those are just as bad as unresolved argument types for other functions. Fixes: QTBUG-101531 Change-Id: Idb5b3994809d91a4b4ce936282685435eb75e670 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>