From 28e4721a89fd85fbee5fd48e3d778faef50e6c4f Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Fri, 30 Apr 2021 17:21:48 +0300 Subject: [PATCH] [FIR] Check internal visibility in FirJvmModuleVisibilityChecker using module data --- .../session/FirJvmModuleVisibilityChecker.kt | 27 +++---------------- .../compileKotlinAgainstKotlin/jvmField.kt | 1 - .../jvmFieldInConstructor.kt | 1 - 3 files changed, 3 insertions(+), 26 deletions(-) diff --git a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirJvmModuleVisibilityChecker.kt b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirJvmModuleVisibilityChecker.kt index 79a6b94360e..35e24744e81 100644 --- a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirJvmModuleVisibilityChecker.kt +++ b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirJvmModuleVisibilityChecker.kt @@ -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 - } } diff --git a/compiler/testData/codegen/box/compileKotlinAgainstKotlin/jvmField.kt b/compiler/testData/codegen/box/compileKotlinAgainstKotlin/jvmField.kt index aec5b7cfafd..e18363e9b37 100644 --- a/compiler/testData/codegen/box/compileKotlinAgainstKotlin/jvmField.kt +++ b/compiler/testData/codegen/box/compileKotlinAgainstKotlin/jvmField.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND_FIR: JVM_IR // TARGET_BACKEND: JVM // WITH_STDLIB diff --git a/compiler/testData/codegen/box/compileKotlinAgainstKotlin/jvmFieldInConstructor.kt b/compiler/testData/codegen/box/compileKotlinAgainstKotlin/jvmFieldInConstructor.kt index a4890317980..cde88e56413 100644 --- a/compiler/testData/codegen/box/compileKotlinAgainstKotlin/jvmFieldInConstructor.kt +++ b/compiler/testData/codegen/box/compileKotlinAgainstKotlin/jvmFieldInConstructor.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND_FIR: JVM_IR // TARGET_BACKEND: JVM // WITH_STDLIB