[Kotlin Import] Added refreshing new dependencies paths in vfs during kotlin import

^KTIJ-30915 Fixed

Merge-request: IJ-MR-145945
Merged-by: Dmitrii Krasnov <Dmitrii.Krasnov@jetbrains.com>

GitOrigin-RevId: cf7b84456300394682ef34e64c4f21bc85f699fc
This commit is contained in:
Dmitrii Krasnov
2024-10-10 10:49:37 +00:00
committed by intellij-monorepo-bot
parent d05472457e
commit e4ebb60a12
8 changed files with 98 additions and 11 deletions

View File

@@ -7,16 +7,16 @@ import com.intellij.openapi.externalSystem.model.project.LibraryDependencyData
import com.intellij.openapi.externalSystem.model.project.LibraryLevel
import com.intellij.openapi.externalSystem.model.project.LibraryPathType
import com.intellij.openapi.externalSystem.model.project.ProjectData
import org.jetbrains.kotlin.gradle.idea.tcs.IdeaKotlinBinaryDependency
import org.jetbrains.kotlin.gradle.idea.tcs.IdeaKotlinResolvedBinaryDependency
import org.jetbrains.kotlin.gradle.idea.tcs.IdeaKotlinUnresolvedBinaryDependency
import com.intellij.openapi.vfs.VirtualFileManager
import org.jetbrains.kotlin.gradle.idea.tcs.*
import org.jetbrains.kotlin.gradle.idea.tcs.extras.*
import org.jetbrains.kotlin.gradle.idea.tcs.isKotlinCompileBinaryType
import org.jetbrains.kotlin.idea.gradle.configuration.klib.KotlinNativeLibraryNameUtil.KOTLIN_NATIVE_LIBRARY_PREFIX
import org.jetbrains.kotlin.idea.gradleJava.configuration.utils.ifNull
import org.jetbrains.plugins.gradle.model.data.GradleSourceSetData
import org.jetbrains.plugins.gradle.service.project.GradleProjectResolverUtil
import org.jetbrains.plugins.gradle.util.GradleConstants.GRADLE_NAME
import java.io.File
import java.nio.file.Path
fun DataNode<GradleSourceSetData>.addDependency(dependency: IdeaKotlinBinaryDependency): DataNode<out LibraryDependencyData>? {
@@ -51,22 +51,37 @@ fun DataNode<GradleSourceSetData>.addDependency(dependency: IdeaKotlinBinaryDepe
if (dependency is IdeaKotlinResolvedBinaryDependency) {
if (dependency.isKotlinCompileBinaryType) {
dependency.classpath.forEach { file ->
dependencyNode.data.target.addPath(LibraryPathType.BINARY, file.absolutePath)
addToDependencyNode(file, dependencyNode, LibraryPathType.BINARY)
}
}
dependency.sourcesClasspath.forEach { file ->
dependencyNode.data.target.addPath(LibraryPathType.SOURCE, file.absolutePath)
addToDependencyNode(file, dependencyNode, LibraryPathType.SOURCE)
}
dependency.documentationClasspath.forEach { file ->
dependencyNode.data.target.addPath(LibraryPathType.DOC, file.absolutePath)
addToDependencyNode(file, dependencyNode, LibraryPathType.DOC)
}
}
return dependencyNode
}
private fun addToDependencyNode(
file: File,
dependencyNode: DataNode<out LibraryDependencyData>,
libraryPathType: LibraryPathType
) {
refreshInVFSIfNecessary(file.toPath().toAbsolutePath())
dependencyNode.data.target.addPath(libraryPathType, file.absolutePath)
}
private fun refreshInVFSIfNecessary(absolutePath: Path) {
val virtualFileManager = VirtualFileManager.getInstance()
if (virtualFileManager.findFileByNioPath(absolutePath) == null) {
virtualFileManager.refreshAndFindFileByNioPath(absolutePath)
}
}
private fun buildNativeDistributionInternalLibraryName(dependency: IdeaKotlinBinaryDependency): String {
return buildString {

View File

@@ -134,20 +134,28 @@ abstract class AbstractKotlinMppGradleImportingTest : GradleImportingTestCase(),
open fun TestConfigurationDslScope.defaultTestConfiguration() {}
protected fun doTest(runImport: Boolean = true, testSpecificConfiguration: TestConfigurationDslScope.() -> Unit = { }) {
protected fun doTest(
runImport: Boolean = true,
afterImport: (KotlinMppTestsContextImpl) -> Unit = { },
testSpecificConfiguration: TestConfigurationDslScope.() -> Unit = { },
) {
context.testConfiguration.defaultTestConfiguration()
context.testConfiguration.testSpecificConfiguration()
context.doTest(runImport)
context.doTest(runImport, afterImport)
}
private fun KotlinMppTestsContextImpl.doTest(runImport: Boolean) {
private fun KotlinMppTestsContextImpl.doTest(runImport: Boolean, afterImport: (KotlinMppTestsContextImpl) -> Unit = { }) {
runAll(
{
runForEnabledFeatures { context.beforeTestExecution() }
createLocalPropertiesFile()
configureByFiles()
runForEnabledFeatures { context.beforeImport() }
if (runImport) importProject()
if (runImport) {
importProject()
}
afterImport.invoke(context)
runForEnabledFeatures { context.afterImport() }
},
{

View File

@@ -109,4 +109,20 @@ class KotlinMppRegressionTests : AbstractKotlinMppGradleImportingTest() {
onlyCheckers(HighlightingChecker, KotlinFacetSettingsChecker, GradleProjectsPublishingTestsFeature)
}
}
@Test
@PluginTargetVersions(pluginVersion = "2.1.20-dev-201+")
fun testKTIJ30915KotlinNewKlibRefreshInVfs() {
doTest(
afterImport = { context ->
val cinteropHeaderFile = context.testProjectRoot.resolve("libs/include/interop/myInterop.h")
cinteropHeaderFile.writeText(cinteropHeaderFile.readText().replace("BAG", "BAT"))
// The problem with VFS occures only with second import after changing .h file.
// Also, see: KTIJ-30915
importProject()
}) {
onlyCheckers(HighlightingChecker)
hideLineMarkers = true
}
}
}

View File

@@ -0,0 +1,16 @@
plugins {
kotlin("multiplatform")
}
allprojects {
repositories {
{{ kts_kotlin_plugin_repositories }}
}
}
kotlin {
jvm()
linuxX64 {
compilations.getByName("main").cinterops.create("myInterop")
}
}

View File

@@ -0,0 +1,10 @@
pluginManagement {
repositories {
{{kts_kotlin_plugin_repositories}}
}
plugins {
kotlin("multiplatform") version "{{kgp_version}}"
}
}
rootProject.name = "KTIJ30915KotlinNewKlibRefreshInVfs"

View File

@@ -0,0 +1,14 @@
//region Test configuration
// - hidden: line markers
//endregion
package p
import kotlinx.cinterop.ExperimentalForeignApi
import myInterop.*
@OptIn(ExperimentalForeignApi::class)
fun test() {
MyEnum.FOO
MyEnum.BAR
MyEnum.BAZ
}

View File

@@ -0,0 +1,2 @@
headers = interop/myInterop.h
compilerOpts = -Ilibs/include