mirror of
https://gitflic.ru/project/openide/openide.git
synced 2025-12-15 11:53:49 +07:00
[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:
committed by
intellij-monorepo-bot
parent
d05472457e
commit
e4ebb60a12
@@ -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 {
|
||||
|
||||
@@ -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() }
|
||||
},
|
||||
{
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
plugins {
|
||||
kotlin("multiplatform")
|
||||
}
|
||||
allprojects {
|
||||
repositories {
|
||||
{{ kts_kotlin_plugin_repositories }}
|
||||
}
|
||||
}
|
||||
|
||||
kotlin {
|
||||
jvm()
|
||||
linuxX64 {
|
||||
compilations.getByName("main").cinterops.create("myInterop")
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
typedef enum {
|
||||
FOO,
|
||||
BAR,
|
||||
BAZ,
|
||||
BAG
|
||||
} MyEnum;
|
||||
@@ -0,0 +1,10 @@
|
||||
pluginManagement {
|
||||
repositories {
|
||||
{{kts_kotlin_plugin_repositories}}
|
||||
}
|
||||
plugins {
|
||||
kotlin("multiplatform") version "{{kgp_version}}"
|
||||
}
|
||||
}
|
||||
|
||||
rootProject.name = "KTIJ30915KotlinNewKlibRefreshInVfs"
|
||||
@@ -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
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
headers = interop/myInterop.h
|
||||
compilerOpts = -Ilibs/include
|
||||
Reference in New Issue
Block a user