Files
kotlin-fork/native/native.tests
Alexander Udalov 5dc882abf5 Reflection: create synthetic classes instead of throwing UOE
... for Kotlin-generated classes which do not correspond to a "class"
from the Kotlin language's point of view. For example, Kotlin lambdas,
file facade classes, multifile class facade/part classes, WhenMappings,
DefaultImpls. They can be distinguished from normal classes by the value
of `KotlinClassHeader.Kind` (which is the same as `Metadata.kind`).

Another theoretical option would be to throw exception at the point
where the `::class` expression is used, if the expression's type on the
left-hand side is a synthetic class. But we can't really do that since
it'll affect performance of most `<expression>::class` expressions.

So, construct a fake synthetic class instead, without any members except
equals/hashCode/toString, and without any non-trivial modifiers. It kind
of contradicts the general idea that kotlin-reflect presents anything
exactly the same as the compiler sees it, but arguably it's worth it to
avoid unexpected exceptions like in KT-41373.

In the newly added test, Java lambda check is muted but it should work
exactly the same as for Kotlin lambdas and other synthetic classes. It's
fixed in a subsequent commit.

 #KT-41373 In Progress
2023-06-30 13:11:41 +00:00
..

Running tests

  • To run all tests, use ./gradlew :native:native.tests:test. Please note, this Gradle task is available only in development environment and it not available at CI server.
  • To execute certain tests only, use the appropriate Gradle tasks. Example: ./gradlew :native:native.tests:codegenBoxTest
  • To execute InteropIndexer tests for all targets, use:
for TARGET in android_x64 android_x86 android_arm32 android_arm64 \
              ios_arm32 ios_arm64 ios_x64 ios_simulator_arm64 \
              linux_x64 linux_arm64 linux_arm32_hfp linux_mips32 linux_mipsel32 \
              macos_x64 macos_arm64 \
              mingw_x86 mingw_x64 \
              tvos_arm64 tvos_x64 tvos_simulator_arm64 \
              wasm32 \
              watchos_arm32 watchos_arm64 watchos_x86 watchos_x64 watchos_simulator_arm64 watchos_device_arm64
do
  echo $TARGET             
  ./gradlew :native:native.tests:interopIndexerTest -Pkotlin.internal.native.test.target=$TARGET
done
  • To re-generate tests, use ./gradlew :native:native.tests:generateTests

For more details see Testing.