From 77fcb12af88b71fa6238619a36c1106ba486f2e0 Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Wed, 21 Jul 2021 19:48:40 +0200 Subject: [PATCH] Fix project leaking in tests The project was leaking via MockApplication -> LowMemoryWatcherManager -> List It happened due to unregistered disposable provided to the MockApplication --- .../kotlin/cli/jvm/compiler/KotlinCoreEnvironment.kt | 9 ++++++++- .../low/level/api/test/base/AbstractLowLevelApiTest.kt | 1 + 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinCoreEnvironment.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinCoreEnvironment.kt index fbdd47b56ab..061e8e125e3 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinCoreEnvironment.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinCoreEnvironment.kt @@ -543,7 +543,14 @@ class KotlinCoreEnvironment private constructor( ): KotlinCoreApplicationEnvironment { synchronized(APPLICATION_LOCK) { if (ourApplicationEnvironment == null) { - val disposable = Disposer.newDisposable() + val disposable = if (unitTestMode) { + parentDisposable + } else { + // TODO this is a memory leak in the compiler, as this Disposable is not registered and thus is never disposed + // but using parentDisposable as disposable in compiler, causes access to application extension points after + // they was disposed, this needs to be fixed + Disposer.newDisposable("Disposable for the KotlinCoreApplicationEnvironment") + } ourApplicationEnvironment = createApplicationEnvironment(disposable, configuration, unitTestMode) ourProjectCount = 0 Disposer.register(disposable, Disposable { diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/test/base/AbstractLowLevelApiTest.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/test/base/AbstractLowLevelApiTest.kt index aa8f7fe64c2..972deab237f 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/test/base/AbstractLowLevelApiTest.kt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/test/base/AbstractLowLevelApiTest.kt @@ -76,6 +76,7 @@ abstract class AbstractLowLevelApiTest : TestWithDisposable() { protected fun runTest(path: String) { testDataPath = Paths.get(path) val testConfiguration = testConfiguration(path, configure) + Disposer.register(disposable, testConfiguration.rootDisposable) val testServices = testConfiguration.testServices val moduleStructure = testConfiguration.moduleStructureExtractor.splitTestDataByModules( path,