11package io.bazel.kotlin.plugin.jdeps.k2
22
3+ import io.bazel.kotlin.plugin.jdeps.k2.RefCache.vbseClass
4+ import io.bazel.kotlin.plugin.jdeps.k2.RefCache.vbseGetVirtualFileMethod
35import org.jetbrains.kotlin.descriptors.SourceElement
46import org.jetbrains.kotlin.load.kotlin.JvmPackagePartSource
57import org.jetbrains.kotlin.load.kotlin.KotlinJvmBinarySourceElement
68import org.jetbrains.kotlin.name.ClassId
79import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource
810
911private object RefCache {
12+ val vbseClass: Class <* >? by lazy {
13+ runCatching {
14+ Class .forName(" org.jetbrains.kotlin.fir.java.VirtualFileBasedSourceElement" )
15+ }.getOrNull()
16+ }
17+
18+ val vbseGetVirtualFileMethod by lazy {
19+ vbseClass
20+ ?.runCatching {
21+ getMethod(" getVirtualFile" )
22+ }?.getOrNull()
23+ }
24+
1025 val jbseClass: Class <* >? by lazy {
1126 runCatching {
1227 Class .forName(" org.jetbrains.kotlin.fir.java.JavaBinarySourceElement" )
@@ -28,8 +43,7 @@ private object RefCache {
2843 * @return whether class is provided by JSM runtime or not
2944 */
3045internal fun isJvmClass (className : String ): Boolean =
31- className.startsWith(" java" ) ||
32- className.startsWith(" modules/java.base/java/" )
46+ className.startsWith(" java" ) || className.startsWith(" modules/java.base/java/" )
3347
3448internal fun DeserializedContainerSource.classId (): ClassId ? =
3549 when (this ) {
@@ -43,6 +57,9 @@ internal fun SourceElement.binaryClass(): String? =
4357 binaryClass.location
4458 } else if (this is JvmPackagePartSource ) {
4559 this .knownJvmBinaryClass?.location
60+ } else if (vbseClass != null && vbseClass!! .isInstance(this )) {
61+ val virtualFile = vbseGetVirtualFileMethod!! .invoke(this )
62+ virtualFile?.javaClass!! .getMethod(" getPath" ).invoke(virtualFile) as ? String
4663 } else if (RefCache .jbseClass != null && RefCache .jbseClass!! .isInstance(this )) {
4764 val jClass = RefCache .jbseGetJavaClassMethod!! .invoke(this )
4865 val virtualFile = jClass!! .javaClass.getMethod(" getVirtualFile" ).invoke(jClass)
0 commit comments