blob: a7efbb018f3efa4b88227d81fc98910634d43bcf [file] [view]
# kotlin-reflect
This directory contains the JVM implementation of `kotlin-reflect`.
## Implementations
The main `kotlin-reflect` implementation is based on `kotlin-metadata-jvm` and Java reflection objects. It reads Kotlin metadata from the
classes being inspected and combines it with the corresponding Java reflection information.
There is also an older, K1-based implementation, built from parts of the K1 compiler. The legacy implementation is still used for collection
subclasses (KT-85727) and can be selected for compatibility or troubleshooting with the following system properties:
* `kotlin.reflect.jvm.useK1Implementation` — use the K1-based implementation for all callables.
* `kotlin.reflect.jvm.loadMetadataDirectly` — make the new implementation load Kotlin metadata directly instead of obtaining parsed metadata
from K1 descriptors. This behavior will be enabled by default once the K1 implementation is removed.
The K1-based implementation is temporary and is going to be removed. It's fine to fix bugs or support new features only in the new
implementation. Since tests run both for old and new implementations, sometimes it's necessary to check the value of the system property
in the test to exclude testing the old implementation:
```kotlin
if (Class.forName("kotlin.reflect.jvm.internal.SystemPropertiesKt").getMethod("getUseK1Implementation").invoke(null) != true) {
// ... (tests for the new implementation only)
}
```
## Debugging
By default, `kotlin-reflect.jar` is post-processed by several tools (shadow jar with relocation, strip metadata, ProGuard). This can cause
difficulties in debugging in the IDE. To avoid all post-processing, add this Gradle property to the test run command:
```text
-Pkotlin.build.postprocessing=false
```
## Tests
Run all kotlin-reflect tests with:
```text
./gradlew :compiler:fir:fir2ir:cleanTest :compiler:fir:fir2ir:test --tests 'org.jetbrains.kotlin.test.runners.codegen.FirLightTreeBlackBoxCodegenTestGenerated$Box$Reflection' --tests 'org.jetbrains.kotlin.test.runners.codegen.FirLightTreeBlackBoxCodegenTestGenerated$BoxJvm$Reflection' --tests 'org.jetbrains.kotlin.test.runners.codegen.ReflectionLegacyImplementationTestGenerated' --tests 'org.jetbrains.kotlin.test.runners.ir.FirLightTreeJvmIrTextTestGenerated' --tests 'org.jetbrains.kotlin.test.runners.codegen.ReflectionLoadMetadataDirectlyTestGenerated' :compiler:tests-integration:cleanTest :compiler:tests-integration:test --tests 'org.jetbrains.kotlin.reflection.ReflectionIntegrationTest'
```