[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
|
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.FirModuleVisibilityChecker
|
||||||
import org.jetbrains.kotlin.fir.FirSession
|
import org.jetbrains.kotlin.fir.FirSession
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration
|
import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration
|
||||||
import org.jetbrains.kotlin.fir.declarations.containerSource
|
|
||||||
import org.jetbrains.kotlin.fir.moduleData
|
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 {
|
class FirJvmModuleVisibilityChecker(private val session: FirSession) : FirModuleVisibilityChecker {
|
||||||
override fun isInFriendModule(declaration: FirMemberDeclaration): Boolean {
|
override fun isInFriendModule(declaration: FirMemberDeclaration): Boolean {
|
||||||
val moduleInfo = (session.moduleData as? FirModuleInfoBasedModuleData)?.moduleInfo as? FirJvmModuleInfo ?: return false
|
val useSiteModuleData = session.moduleData
|
||||||
val binaryClass = when (val source = declaration.containerSource) {
|
val declarationModuleData = declaration.moduleData
|
||||||
is KotlinJvmBinarySourceElement -> source.binaryClass
|
return useSiteModuleData == declarationModuleData || declarationModuleData in useSiteModuleData.friendDependencies
|
||||||
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
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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
|
// TARGET_BACKEND: JVM
|
||||||
// WITH_STDLIB
|
// WITH_STDLIB
|
||||||
|
|
||||||
|
|||||||
-1
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND_FIR: JVM_IR
|
|
||||||
// TARGET_BACKEND: JVM
|
// TARGET_BACKEND: JVM
|
||||||
// WITH_STDLIB
|
// WITH_STDLIB
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user