[FIR] Check internal visibility in FirJvmModuleVisibilityChecker using module data
This commit is contained in:
committed by
TeamCityServer
parent
02c58b7a8f
commit
28e4721a89
+3
-24
@@ -5,36 +5,15 @@
|
||||
|
||||
package org.jetbrains.kotlin.fir.session
|
||||
|
||||
import com.intellij.openapi.vfs.StandardFileSystems
|
||||
import com.intellij.openapi.vfs.VfsUtilCore
|
||||
import org.jetbrains.kotlin.fir.FirModuleVisibilityChecker
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration
|
||||
import org.jetbrains.kotlin.fir.declarations.containerSource
|
||||
import org.jetbrains.kotlin.fir.moduleData
|
||||
import org.jetbrains.kotlin.load.kotlin.JvmPackagePartSource
|
||||
import org.jetbrains.kotlin.load.kotlin.KotlinJvmBinarySourceElement
|
||||
import org.jetbrains.kotlin.load.kotlin.VirtualFileKotlinClass
|
||||
import java.nio.file.Paths
|
||||
|
||||
class FirJvmModuleVisibilityChecker(private val session: FirSession) : FirModuleVisibilityChecker {
|
||||
override fun isInFriendModule(declaration: FirMemberDeclaration): Boolean {
|
||||
val moduleInfo = (session.moduleData as? FirModuleInfoBasedModuleData)?.moduleInfo as? FirJvmModuleInfo ?: return false
|
||||
val binaryClass = when (val source = declaration.containerSource) {
|
||||
is KotlinJvmBinarySourceElement -> source.binaryClass
|
||||
is JvmPackagePartSource -> source.knownJvmBinaryClass
|
||||
else -> null
|
||||
} as? VirtualFileKotlinClass ?: return false
|
||||
// For incremental compilation, the already compiled part of the module should be accessible.
|
||||
return moduleInfo.friendPaths.any { binaryClass.isIn(it) } || moduleInfo.outputDirectory?.let { binaryClass.isIn(it) } == true
|
||||
val useSiteModuleData = session.moduleData
|
||||
val declarationModuleData = declaration.moduleData
|
||||
return useSiteModuleData == declarationModuleData || declarationModuleData in useSiteModuleData.friendDependencies
|
||||
}
|
||||
|
||||
private fun VirtualFileKotlinClass.isIn(jarOrDirectory: String): Boolean =
|
||||
when (file.fileSystem.protocol) {
|
||||
StandardFileSystems.FILE_PROTOCOL ->
|
||||
VfsUtilCore.virtualToIoFile(file).toPath().startsWith(jarOrDirectory)
|
||||
StandardFileSystems.JAR_PROTOCOL ->
|
||||
VfsUtilCore.getVirtualFileForJar(file)?.let(VfsUtilCore::virtualToIoFile)?.toPath() == Paths.get(jarOrDirectory)
|
||||
else -> false
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
// IGNORE_BACKEND_FIR: JVM_IR
|
||||
// TARGET_BACKEND: JVM
|
||||
// WITH_STDLIB
|
||||
|
||||
|
||||
-1
@@ -1,4 +1,3 @@
|
||||
// IGNORE_BACKEND_FIR: JVM_IR
|
||||
// TARGET_BACKEND: JVM
|
||||
// WITH_STDLIB
|
||||
|
||||
|
||||
Reference in New Issue
Block a user