From 38f310467a25e82a0612617e2caa6a2e894f08a5 Mon Sep 17 00:00:00 2001 From: Sebastian Sellmair Date: Fri, 16 Dec 2022 10:11:41 +0100 Subject: [PATCH] [Gradle] Implement IdeaKotlinClasspath interner This very simple interner mechanism ensures that when import runs within the IDE process, we de-duplicate existing file instances. This might have an effect, because during GradleProjectResolution we could have plenty source sets that refer to the same files. ^KT-55492 Verification Pending --- .../gradle/idea/tcs/IdeaKotlinClasspath.kt | 14 ++++++++++++- .../idea/test/tcs/IdeaKotlinClasspathTest.kt | 20 +++++++++++++++---- 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin-idea/src/main/kotlin/org/jetbrains/kotlin/gradle/idea/tcs/IdeaKotlinClasspath.kt b/libraries/tools/kotlin-gradle-plugin-idea/src/main/kotlin/org/jetbrains/kotlin/gradle/idea/tcs/IdeaKotlinClasspath.kt index 5866d811aab..99cc281e776 100644 --- a/libraries/tools/kotlin-gradle-plugin-idea/src/main/kotlin/org/jetbrains/kotlin/gradle/idea/tcs/IdeaKotlinClasspath.kt +++ b/libraries/tools/kotlin-gradle-plugin-idea/src/main/kotlin/org/jetbrains/kotlin/gradle/idea/tcs/IdeaKotlinClasspath.kt @@ -7,6 +7,8 @@ package org.jetbrains.kotlin.gradle.idea.tcs import java.io.File import java.io.Serializable +import java.lang.ref.WeakReference +import java.util.* fun IdeaKotlinClasspath(files: Iterable): IdeaKotlinClasspath = IdeaKotlinClasspath.from(files) @@ -76,7 +78,8 @@ class IdeaKotlinClasspath private constructor(private val files: MutableSet): IdeaKotlinClasspath { @@ -88,5 +91,14 @@ class IdeaKotlinClasspath private constructor(private val files: MutableSet>() + + private fun intern(file: File): File { + return interner.getOrPut(file) { WeakReference(file) }.get() ?: run { + interner[file] = WeakReference(file) + file + } + } } } diff --git a/libraries/tools/kotlin-gradle-plugin-idea/src/test/kotlin/org/jetbrains/kotlin/gradle/idea/test/tcs/IdeaKotlinClasspathTest.kt b/libraries/tools/kotlin-gradle-plugin-idea/src/test/kotlin/org/jetbrains/kotlin/gradle/idea/test/tcs/IdeaKotlinClasspathTest.kt index cd283aeb7eb..8178bae0534 100644 --- a/libraries/tools/kotlin-gradle-plugin-idea/src/test/kotlin/org/jetbrains/kotlin/gradle/idea/test/tcs/IdeaKotlinClasspathTest.kt +++ b/libraries/tools/kotlin-gradle-plugin-idea/src/test/kotlin/org/jetbrains/kotlin/gradle/idea/test/tcs/IdeaKotlinClasspathTest.kt @@ -7,10 +7,7 @@ package org.jetbrains.kotlin.gradle.idea.test.tcs import org.jetbrains.kotlin.gradle.idea.tcs.IdeaKotlinClasspath import java.io.File -import kotlin.test.Test -import kotlin.test.assertEquals -import kotlin.test.assertNotEquals -import kotlin.test.assertTrue +import kotlin.test.* class IdeaKotlinClasspathTest { @@ -62,4 +59,19 @@ class IdeaKotlinClasspathTest { classpath.remove(File("test").absoluteFile) assertTrue(classpath.isEmpty()) } + + @Test + fun `test - classpath interner`() { + val classpath1 = IdeaKotlinClasspath() + val classpath2 = IdeaKotlinClasspath() + + val fileAInstance1 = File("a") + val fileAInstance2 = File("a") + + classpath1.add(fileAInstance1) + classpath2.add(fileAInstance2) + + /* Check that fileAInstance2 got interned and will re-use instance 1 */ + assertSame(classpath1.single(), classpath2.single()) + } } \ No newline at end of file