[FIR] Check internal visibility in FirJvmModuleVisibilityChecker using module data

This commit is contained in:
Dmitriy Novozhilov
2021-04-30 17:21:48 +03:00
committed by TeamCityServer
parent 02c58b7a8f
commit 28e4721a89
3 changed files with 3 additions and 26 deletions
@@ -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,4 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
// TARGET_BACKEND: JVM
// WITH_STDLIB