diff --git a/src/corelib/kernel/qjnitypes.h b/src/corelib/kernel/qjnitypes.h index 73b5db297c..9c2e1efb77 100644 --- a/src/corelib/kernel/qjnitypes.h +++ b/src/corelib/kernel/qjnitypes.h @@ -148,70 +148,76 @@ static void staticAssertTypeMismatch() template constexpr auto typeSignature() { - if constexpr(std::is_same::value) + if constexpr(std::is_array_v) { + using UnderlyingType = typename std::remove_extent::type; + static_assert(!std::is_array_v, + "typeSignature() does not handle multi-dimensional arrays"); + return String("[") + typeSignature(); + } else if constexpr(std::is_same_v) { return String("Ljava/lang/Object;"); - else if constexpr(std::is_same::value) + } else if constexpr(std::is_same_v) { return String("Ljava/lang/Class;"); - else if constexpr(std::is_same::value) + } else if constexpr(std::is_same_v) { return String("Ljava/lang/String;"); - else if constexpr(std::is_same::value) + } else if constexpr(std::is_same_v) { return String("[Ljava/lang/Object;"); - else if constexpr(std::is_same::value) + } else if constexpr(std::is_same_v) { return String("Ljava/lang/Throwable;"); - else if constexpr(std::is_same::value) + } else if constexpr(std::is_same_v) { return String("[Z"); - else if constexpr(std::is_same::value) + } else if constexpr(std::is_same_v) { return String("[B"); - else if constexpr(std::is_same::value) + } else if constexpr(std::is_same_v) { return String("[S"); - else if constexpr(std::is_same::value) + } else if constexpr(std::is_same_v) { return String("[I"); - else if constexpr(std::is_same::value) + } else if constexpr(std::is_same_v) { return String("[J"); - else if constexpr(std::is_same::value) + } else if constexpr(std::is_same_v) { return String("[F"); - else if constexpr(std::is_same::value) + } else if constexpr(std::is_same_v) { return String("[D"); - else if constexpr(std::is_same::value) + } else if constexpr(std::is_same_v) { return String("[C"); - else if constexpr(std::is_same::value) + } else if constexpr(std::is_same_v) { return String("Z"); - else if constexpr(std::is_same::value) + } else if constexpr(std::is_same_v) { return String("Z"); - else if constexpr(std::is_same::value) + } else if constexpr(std::is_same_v) { return String("B"); - else if constexpr(std::is_same::value) + } else if constexpr(std::is_same_v) { return String("C"); - else if constexpr(std::is_same::value) + } else if constexpr(std::is_same_v) { return String("C"); - else if constexpr(std::is_same::value) + } else if constexpr(std::is_same_v) { return String("S"); - else if constexpr(std::is_same::value) + } else if constexpr(std::is_same_v) { return String("S"); - else if constexpr(std::is_same::value) + } else if constexpr(std::is_same_v) { return String("I"); - else if constexpr(std::is_same::value) + } else if constexpr(std::is_same_v) { return String("I"); - else if constexpr(std::is_same::value) + } else if constexpr(std::is_same_v) { return String("I"); - else if constexpr(std::is_same::value) + } else if constexpr(std::is_same_v) { return String("J"); - else if constexpr(std::is_same::value) + } else if constexpr(std::is_same_v) { return String("J"); - else if constexpr(std::is_same::value) + } else if constexpr(std::is_same_v) { return String("F"); - else if constexpr(std::is_same::value) + } else if constexpr(std::is_same_v) { return String("F"); - else if constexpr(std::is_same::value) + } else if constexpr(std::is_same_v) { return String("D"); - else if constexpr(std::is_same::value) + } else if constexpr(std::is_same_v) { return String("D"); - else if constexpr(std::is_same::value) + } else if constexpr(std::is_same_v) { return String("V"); - else if constexpr(IsStringType::value) + } else if constexpr(IsStringType::value) { static_assert(!IsStringType::value, "Don't use a literal type, call data!"); - else + } else { staticAssertTypeMismatch(); + } } template @@ -247,6 +253,13 @@ static constexpr bool isObjectType() } } +template +static constexpr bool isArrayType() +{ + constexpr auto signature = typeSignature(); + return signature.startsWith('['); +} + template static constexpr void assertPrimitiveType() { diff --git a/tests/auto/corelib/kernel/qjnitypes/tst_qjnitypes.cpp b/tests/auto/corelib/kernel/qjnitypes/tst_qjnitypes.cpp index 395028b8cb..093c387dcc 100644 --- a/tests/auto/corelib/kernel/qjnitypes/tst_qjnitypes.cpp +++ b/tests/auto/corelib/kernel/qjnitypes/tst_qjnitypes.cpp @@ -52,14 +52,17 @@ Q_DECLARE_JNI_CLASS(QtTextToSpeech, "org/qtproject/qt/android/speech/QtTextToSpe static_assert(QtJniTypes::className() == "org/qtproject/qt/android/speech/QtTextToSpeech"); static_assert(QtJniTypes::fieldSignature() == "I"); +static_assert(QtJniTypes::fieldSignature() == "[I"); static_assert(QtJniTypes::fieldSignature() != "X"); static_assert(QtJniTypes::fieldSignature() != "Ljava/lang/Object;"); static_assert(QtJniTypes::fieldSignature() == "J"); static_assert(QtJniTypes::fieldSignature() == "Ljava/lang/String;"); static_assert(QtJniTypes::fieldSignature() == "Ljava/lang/Object;"); +static_assert(QtJniTypes::fieldSignature() == "[Ljava/lang/Object;"); static_assert(QtJniTypes::fieldSignature() == "[Ljava/lang/Object;"); static_assert(QtJniTypes::fieldSignature() == "Ljava/lang/Object;"); static_assert(QtJniTypes::fieldSignature() == "Lorg/qtproject/qt/android/QtJavaWrapper;"); +static_assert(QtJniTypes::fieldSignature() == "[Lorg/qtproject/qt/android/QtJavaWrapper;"); static_assert(QtJniTypes::fieldSignature() == "Lorg/qtproject/qt/android/QtCustomJniObject;"); static_assert(QtJniTypes::methodSignature() == "()V"); @@ -82,6 +85,12 @@ static_assert(QtJniTypes::isObjectType()); static_assert(QtJniTypes::isObjectType()); static_assert(QtJniTypes::isObjectType()); +static_assert(!QtJniTypes::isArrayType()); +static_assert(QtJniTypes::isArrayType()); +static_assert(QtJniTypes::isArrayType()); +static_assert(QtJniTypes::isArrayType()); +static_assert(QtJniTypes::isArrayType()); + static_assert(QtJniTypes::String("ABCDE").startsWith("ABC")); static_assert(QtJniTypes::String("ABCDE").startsWith("A")); static_assert(QtJniTypes::String("ABCDE").startsWith("ABCDE"));