From a9715de70496ba4e3a294d053f5fee4f188a26b2 Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Mon, 21 Jun 2021 16:47:13 +0200 Subject: [PATCH] FIR IDE: fix leaking of FirJavaElementFinder in tests --- .../based/AbstractCompilerBasedTest.kt | 21 +++++++++++++- .../api/test/base/AbstractLowLevelApiTest.kt | 17 +---------- .../level/api/test/base/TestWithDisposable.kt | 28 +++++++++++++++++++ 3 files changed, 49 insertions(+), 17 deletions(-) create mode 100644 idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/test/base/TestWithDisposable.kt diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/compiler/based/AbstractCompilerBasedTest.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/compiler/based/AbstractCompilerBasedTest.kt index aefc67919f1..4020b1fce15 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/compiler/based/AbstractCompilerBasedTest.kt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/compiler/based/AbstractCompilerBasedTest.kt @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.idea.fir.low.level.api.compiler.based import com.intellij.mock.MockProject import com.intellij.openapi.Disposable +import com.intellij.openapi.util.Disposer import com.intellij.psi.PsiElementFinder import com.intellij.psi.search.GlobalSearchScope import com.intellij.psi.search.ProjectScope @@ -53,11 +54,28 @@ import org.jetbrains.kotlin.test.frontend.fir.* import org.jetbrains.kotlin.test.model.* import org.jetbrains.kotlin.test.runners.AbstractKotlinCompilerTest import org.jetbrains.kotlin.test.services.* +import org.junit.jupiter.api.AfterEach +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.TestInfo import java.nio.file.Path import java.nio.file.Paths import kotlin.io.path.nameWithoutExtension abstract class AbstractCompilerBasedTest : AbstractKotlinCompilerTest() { + private var _disposable: Disposable? = null + protected val disposable: Disposable get() = _disposable!! + + @BeforeEach + private fun intiDisposable(testInfo: TestInfo) { + _disposable = Disposer.newDisposable("disposable for ${testInfo.displayName}") + } + + @AfterEach + private fun disposeDisposable() { + _disposable?.let { Disposer.dispose(it) } + _disposable = null + } + final override fun TestConfigurationBuilder.configuration() { globalDefaults { frontend = FrontendKinds.FIR @@ -90,7 +108,8 @@ abstract class AbstractCompilerBasedTest : AbstractKotlinCompilerTest() { val moduleInfo = TestModuleInfo(module) testServices.firModuleInfoProvider.registerModuleData(module, FirModuleInfoBasedModuleData(moduleInfo)) - val configurator = FirModuleResolveStateConfiguratorForSingleModuleTestImpl(testServices, module, ktFiles, moduleInfo, project) + val configurator = + FirModuleResolveStateConfiguratorForSingleModuleTestImpl(testServices, module, ktFiles, moduleInfo, disposable) with(project as MockProject) { registerTestServices(configurator, ktFiles) 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 adb50983230..986120a261b 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 @@ -26,30 +26,15 @@ import org.jetbrains.kotlin.test.services.* import org.jetbrains.kotlin.test.services.configuration.CommonEnvironmentConfigurator import org.jetbrains.kotlin.test.services.configuration.JvmEnvironmentConfigurator import org.jetbrains.kotlin.test.services.impl.TemporaryDirectoryManagerImpl -import org.junit.jupiter.api.AfterEach import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.TestInfo import java.nio.file.Path import java.nio.file.Paths import kotlin.io.path.nameWithoutExtension -abstract class AbstractLowLevelApiTest { +abstract class AbstractLowLevelApiTest: TestWithDisposable() { private lateinit var testInfo: KotlinTestInfo - private var _disposable: Disposable? = null - protected val disposable: Disposable get() = _disposable!! - - @BeforeEach - private fun intiDisposable(testInfo: TestInfo) { - _disposable = Disposer.newDisposable("disposable for ${testInfo.displayName}") - } - - @AfterEach - private fun disposeDisposable() { - _disposable?.let { Disposer.dispose(it) } - _disposable = null - } - private val configure: TestConfigurationBuilder.() -> Unit = { globalDefaults { frontend = FrontendKinds.FIR diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/test/base/TestWithDisposable.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/test/base/TestWithDisposable.kt new file mode 100644 index 00000000000..b344bfbe428 --- /dev/null +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/test/base/TestWithDisposable.kt @@ -0,0 +1,28 @@ +/* + * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.idea.fir.low.level.api.test.base + +import com.intellij.openapi.Disposable +import com.intellij.openapi.util.Disposer +import org.junit.jupiter.api.AfterEach +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.TestInfo + +abstract class TestWithDisposable { + private var _disposable: Disposable? = null + protected val disposable: Disposable get() = _disposable!! + + @BeforeEach + private fun intiDisposable(testInfo: TestInfo) { + _disposable = Disposer.newDisposable("disposable for ${testInfo.displayName}") + } + + @AfterEach + private fun disposeDisposable() { + _disposable?.let { Disposer.dispose(it) } + _disposable = null + } +} \ No newline at end of file