mirror of
https://gitflic.ru/project/openide/openide.git
synced 2025-12-16 14:23:28 +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.LibraryLevel
|
||||||
import com.intellij.openapi.externalSystem.model.project.LibraryPathType
|
import com.intellij.openapi.externalSystem.model.project.LibraryPathType
|
||||||
import com.intellij.openapi.externalSystem.model.project.ProjectData
|
import com.intellij.openapi.externalSystem.model.project.ProjectData
|
||||||
import org.jetbrains.kotlin.gradle.idea.tcs.IdeaKotlinBinaryDependency
|
import com.intellij.openapi.vfs.VirtualFileManager
|
||||||
import org.jetbrains.kotlin.gradle.idea.tcs.IdeaKotlinResolvedBinaryDependency
|
import org.jetbrains.kotlin.gradle.idea.tcs.*
|
||||||
import org.jetbrains.kotlin.gradle.idea.tcs.IdeaKotlinUnresolvedBinaryDependency
|
|
||||||
import org.jetbrains.kotlin.gradle.idea.tcs.extras.*
|
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.gradle.configuration.klib.KotlinNativeLibraryNameUtil.KOTLIN_NATIVE_LIBRARY_PREFIX
|
||||||
import org.jetbrains.kotlin.idea.gradleJava.configuration.utils.ifNull
|
import org.jetbrains.kotlin.idea.gradleJava.configuration.utils.ifNull
|
||||||
import org.jetbrains.plugins.gradle.model.data.GradleSourceSetData
|
import org.jetbrains.plugins.gradle.model.data.GradleSourceSetData
|
||||||
import org.jetbrains.plugins.gradle.service.project.GradleProjectResolverUtil
|
import org.jetbrains.plugins.gradle.service.project.GradleProjectResolverUtil
|
||||||
import org.jetbrains.plugins.gradle.util.GradleConstants.GRADLE_NAME
|
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>? {
|
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 is IdeaKotlinResolvedBinaryDependency) {
|
||||||
if (dependency.isKotlinCompileBinaryType) {
|
if (dependency.isKotlinCompileBinaryType) {
|
||||||
dependency.classpath.forEach { file ->
|
dependency.classpath.forEach { file ->
|
||||||
dependencyNode.data.target.addPath(LibraryPathType.BINARY, file.absolutePath)
|
addToDependencyNode(file, dependencyNode, LibraryPathType.BINARY)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
dependency.sourcesClasspath.forEach { file ->
|
dependency.sourcesClasspath.forEach { file ->
|
||||||
dependencyNode.data.target.addPath(LibraryPathType.SOURCE, file.absolutePath)
|
addToDependencyNode(file, dependencyNode, LibraryPathType.SOURCE)
|
||||||
}
|
}
|
||||||
|
|
||||||
dependency.documentationClasspath.forEach { file ->
|
dependency.documentationClasspath.forEach { file ->
|
||||||
dependencyNode.data.target.addPath(LibraryPathType.DOC, file.absolutePath)
|
addToDependencyNode(file, dependencyNode, LibraryPathType.DOC)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return dependencyNode
|
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 {
|
private fun buildNativeDistributionInternalLibraryName(dependency: IdeaKotlinBinaryDependency): String {
|
||||||
return buildString {
|
return buildString {
|
||||||
|
|||||||
@@ -134,20 +134,28 @@ abstract class AbstractKotlinMppGradleImportingTest : GradleImportingTestCase(),
|
|||||||
|
|
||||||
open fun TestConfigurationDslScope.defaultTestConfiguration() {}
|
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.defaultTestConfiguration()
|
||||||
context.testConfiguration.testSpecificConfiguration()
|
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(
|
runAll(
|
||||||
{
|
{
|
||||||
runForEnabledFeatures { context.beforeTestExecution() }
|
runForEnabledFeatures { context.beforeTestExecution() }
|
||||||
createLocalPropertiesFile()
|
createLocalPropertiesFile()
|
||||||
configureByFiles()
|
configureByFiles()
|
||||||
runForEnabledFeatures { context.beforeImport() }
|
runForEnabledFeatures { context.beforeImport() }
|
||||||
if (runImport) importProject()
|
if (runImport) {
|
||||||
|
importProject()
|
||||||
|
}
|
||||||
|
afterImport.invoke(context)
|
||||||
|
|
||||||
runForEnabledFeatures { context.afterImport() }
|
runForEnabledFeatures { context.afterImport() }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -109,4 +109,20 @@ class KotlinMppRegressionTests : AbstractKotlinMppGradleImportingTest() {
|
|||||||
onlyCheckers(HighlightingChecker, KotlinFacetSettingsChecker, GradleProjectsPublishingTestsFeature)
|
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