diff --git a/benchmarks/src/org/jetbrains/kotlin/benchmarks/AbstractSimpleFileBenchmark.kt b/benchmarks/src/org/jetbrains/kotlin/benchmarks/AbstractSimpleFileBenchmark.kt index 0ce5873ce0a..f196b1543e0 100644 --- a/benchmarks/src/org/jetbrains/kotlin/benchmarks/AbstractSimpleFileBenchmark.kt +++ b/benchmarks/src/org/jetbrains/kotlin/benchmarks/AbstractSimpleFileBenchmark.kt @@ -5,7 +5,6 @@ package org.jetbrains.kotlin.benchmarks import com.intellij.openapi.Disposable -import com.intellij.openapi.extensions.Extensions import com.intellij.openapi.project.Project import com.intellij.openapi.vfs.CharsetToolkit import com.intellij.psi.PsiElementFinder @@ -104,9 +103,7 @@ abstract class AbstractSimpleFileBenchmark { ) if (isIR) { - Extensions.getArea(env.project) - .getExtensionPoint(PsiElementFinder.EP_NAME) - .unregisterExtension(JavaElementFinder::class.java) + PsiElementFinder.EP.getPoint(env.project).unregisterExtension(JavaElementFinder::class.java) } file = createFile( @@ -163,8 +160,8 @@ abstract class AbstractSimpleFileBenchmark { totalTransformer.process(listOf(firFile)) bh.consume(firFile.hashCode()) - Extensions.getArea(env.project) - .getExtensionPoint(PsiElementFinder.EP_NAME) + env.project.extensionArea + .getExtensionPoint(PsiElementFinder.EP.name) .unregisterExtension(FirJavaElementFinder::class.java) } 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 229b1364908..8c67d102cf5 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 @@ -120,7 +120,7 @@ class KotlinCoreEnvironment private constructor( private var extensionRegistered = false override fun preregisterServices() { - registerProjectExtensionPoints(Extensions.getArea(project)) + registerProjectExtensionPoints(project.extensionArea) } fun registerExtensionsFromPlugins(configuration: CompilerConfiguration) { @@ -598,9 +598,9 @@ class KotlinCoreEnvironment private constructor( @JvmStatic fun registerProjectExtensionPoints(area: ExtensionsArea) { CoreApplicationEnvironment.registerExtensionPoint( - area, PsiTreeChangePreprocessor.EP_NAME, PsiTreeChangePreprocessor::class.java + area, PsiTreeChangePreprocessor.EP.name, PsiTreeChangePreprocessor::class.java ) - CoreApplicationEnvironment.registerExtensionPoint(area, PsiElementFinder.EP_NAME, PsiElementFinder::class.java) + CoreApplicationEnvironment.registerExtensionPoint(area, PsiElementFinder.EP.name, PsiElementFinder::class.java) IdeaExtensionPoints.registerVersionSpecificProjectExtensionPoints(area) } @@ -644,12 +644,15 @@ class KotlinCoreEnvironment private constructor( registerService(KotlinAsJavaSupport::class.java, kotlinAsJavaSupport) registerService(CodeAnalyzerInitializer::class.java, traceHolder) - val area = Extensions.getArea(this) - - area.getExtensionPoint(PsiElementFinder.EP_NAME).registerExtension(JavaElementFinder(this, kotlinAsJavaSupport)) - area.getExtensionPoint(PsiElementFinder.EP_NAME).registerExtension( - PsiElementFinderImpl(this, ServiceManager.getService(this, JavaFileManager::class.java)) - ) + // We don't pass Disposable because in some tests, we manually unregister these extensions, and that leads to LOG.error + // exception from `ExtensionPointImpl.doRegisterExtension`, because the registered extension can no longer be found + // when the project is being disposed. + // For example, see the `unregisterExtension` call in `GenerationUtils.compileFilesUsingFrontendIR`. + // TODO: refactor this to avoid registering unneeded extensions in the first place, and avoid using deprecated API. + @Suppress("DEPRECATION") + PsiElementFinder.EP.getPoint(project).registerExtension(JavaElementFinder(this, kotlinAsJavaSupport)) + @Suppress("DEPRECATION") + PsiElementFinder.EP.getPoint(project).registerExtension(PsiElementFinderImpl(this)) } } diff --git a/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/AbstractFirResolveWithSessionTestCase.kt b/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/AbstractFirResolveWithSessionTestCase.kt index a9e26f6ef69..0fe80e77aa8 100644 --- a/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/AbstractFirResolveWithSessionTestCase.kt +++ b/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/AbstractFirResolveWithSessionTestCase.kt @@ -5,7 +5,6 @@ package org.jetbrains.kotlin.fir -import com.intellij.openapi.extensions.Extensions import com.intellij.openapi.project.Project import com.intellij.psi.PsiElementFinder import org.jetbrains.kotlin.asJava.finder.JavaElementFinder @@ -20,9 +19,6 @@ abstract class AbstractFirResolveWithSessionTestCase : KotlinTestWithEnvironment } protected fun prepareProjectExtensions(project: Project) { - Extensions.getArea(project) - .getExtensionPoint(PsiElementFinder.EP_NAME) - .unregisterExtension(JavaElementFinder::class.java) + PsiElementFinder.EP.getPoint(project).unregisterExtension(JavaElementFinder::class.java) } - } diff --git a/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/java/AbstractFirOldFrontendLightClassesTest.kt b/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/java/AbstractFirOldFrontendLightClassesTest.kt index bf04fc50a90..1d9b1977e10 100644 --- a/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/java/AbstractFirOldFrontendLightClassesTest.kt +++ b/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/java/AbstractFirOldFrontendLightClassesTest.kt @@ -5,7 +5,6 @@ package org.jetbrains.kotlin.fir.java -import com.intellij.openapi.extensions.Extensions import com.intellij.psi.PsiElementFinder import com.intellij.psi.impl.compiled.ClsClassImpl import com.intellij.psi.search.GlobalSearchScope @@ -20,8 +19,7 @@ abstract class AbstractFirOldFrontendLightClassesTest : AbstractFirOldFrontendDi override fun checkResultingFirFiles(firFiles: List, testDataFile: File) { super.checkResultingFirFiles(firFiles, testDataFile) - val ourFinders = - Extensions.getArea(project).getExtensionPoint(PsiElementFinder.EP_NAME).extensions.filterIsInstance() + val ourFinders = PsiElementFinder.EP.getPoint(project).extensions.filterIsInstance() assertNotEmpty(ourFinders) diff --git a/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/java/AbstractFirTypeEnhancementTest.kt b/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/java/AbstractFirTypeEnhancementTest.kt index a2774852786..de044a956ec 100644 --- a/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/java/AbstractFirTypeEnhancementTest.kt +++ b/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/java/AbstractFirTypeEnhancementTest.kt @@ -6,7 +6,6 @@ package org.jetbrains.kotlin.fir.java import com.intellij.lang.java.JavaLanguage -import com.intellij.openapi.extensions.Extensions import com.intellij.openapi.project.Project import com.intellij.openapi.util.io.FileUtil import com.intellij.openapi.util.text.StringUtilRt @@ -82,9 +81,7 @@ abstract class AbstractFirTypeEnhancementTest : KtUsefulTestCase() { ), EnvironmentConfigFiles.JVM_CONFIG_FILES ).apply { - Extensions.getArea(project) - .getExtensionPoint(PsiElementFinder.EP_NAME) - .unregisterExtension(JavaElementFinder::class.java) + PsiElementFinder.EP.getPoint(project).unregisterExtension(JavaElementFinder::class.java) } } diff --git a/compiler/fir/fir2ir/tests/org/jetbrains/kotlin/fir/AbstractFir2IrTextTest.kt b/compiler/fir/fir2ir/tests/org/jetbrains/kotlin/fir/AbstractFir2IrTextTest.kt index 99d8b597ea3..af22c6db478 100644 --- a/compiler/fir/fir2ir/tests/org/jetbrains/kotlin/fir/AbstractFir2IrTextTest.kt +++ b/compiler/fir/fir2ir/tests/org/jetbrains/kotlin/fir/AbstractFir2IrTextTest.kt @@ -5,7 +5,6 @@ package org.jetbrains.kotlin.fir -import com.intellij.openapi.extensions.Extensions import com.intellij.openapi.project.Project import com.intellij.psi.PsiElementFinder import com.intellij.psi.search.GlobalSearchScope @@ -20,9 +19,7 @@ import java.io.File abstract class AbstractFir2IrTextTest : AbstractIrTextTestCase() { private fun prepareProjectExtensions(project: Project) { - Extensions.getArea(project) - .getExtensionPoint(PsiElementFinder.EP_NAME) - .unregisterExtension(JavaElementFinder::class.java) + PsiElementFinder.EP.getPoint(project).unregisterExtension(JavaElementFinder::class.java) } override fun doTest(wholeFile: File, testFiles: List) { diff --git a/compiler/fir/modularized-tests/tests/org/jetbrains/kotlin/fir/FirResolveModularizedTotalKotlinTest.kt b/compiler/fir/modularized-tests/tests/org/jetbrains/kotlin/fir/FirResolveModularizedTotalKotlinTest.kt index 874c8fe6f98..c18a0e6fc27 100644 --- a/compiler/fir/modularized-tests/tests/org/jetbrains/kotlin/fir/FirResolveModularizedTotalKotlinTest.kt +++ b/compiler/fir/modularized-tests/tests/org/jetbrains/kotlin/fir/FirResolveModularizedTotalKotlinTest.kt @@ -5,7 +5,6 @@ package org.jetbrains.kotlin.fir -import com.intellij.openapi.extensions.Extensions import com.intellij.openapi.util.Disposer import com.intellij.psi.PsiElementFinder import com.intellij.psi.search.GlobalSearchScope @@ -167,13 +166,10 @@ class FirResolveModularizedTotalKotlinTest : AbstractModularizedTest() { override fun processModule(moduleData: ModuleData): ProcessorAction { val disposable = Disposer.newDisposable() - - val configuration = createDefaultConfiguration(moduleData) val environment = KotlinCoreEnvironment.createForTests(disposable, configuration, EnvironmentConfigFiles.JVM_CONFIG_FILES) - Extensions.getArea(environment.project) - .getExtensionPoint(PsiElementFinder.EP_NAME) + PsiElementFinder.EP.getPoint(environment.project) .unregisterExtension(JavaElementFinder::class.java) runAnalysis(moduleData, environment) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/extensions/ApplicationExtensionDescriptor.kt b/compiler/frontend/src/org/jetbrains/kotlin/extensions/ApplicationExtensionDescriptor.kt index e9f4940c425..8f4572a2a6d 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/extensions/ApplicationExtensionDescriptor.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/extensions/ApplicationExtensionDescriptor.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.extensions +import com.intellij.openapi.Disposable import com.intellij.openapi.extensions.ExtensionPoint import com.intellij.openapi.extensions.ExtensionPointName import com.intellij.openapi.extensions.Extensions @@ -20,8 +21,8 @@ open class ApplicationExtensionDescriptor(name: String, private val ext ) } - fun registerExtension(extension: T) { - Extensions.getRootArea().getExtensionPoint(extensionPointName).registerExtension(extension) + fun registerExtension(extension: T, disposable: Disposable) { + Extensions.getRootArea().getExtensionPoint(extensionPointName).registerExtension(extension, disposable) } fun getInstances(): List { @@ -30,4 +31,4 @@ open class ApplicationExtensionDescriptor(name: String, private val ext return projectArea.getExtensionPoint(extensionPointName).extensions.toList() } -} \ No newline at end of file +} diff --git a/compiler/frontend/src/org/jetbrains/kotlin/extensions/ProjectExtensionDescriptor.kt b/compiler/frontend/src/org/jetbrains/kotlin/extensions/ProjectExtensionDescriptor.kt index 55b8eabca1f..4ea15130af5 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/extensions/ProjectExtensionDescriptor.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/extensions/ProjectExtensionDescriptor.kt @@ -18,14 +18,13 @@ package org.jetbrains.kotlin.extensions import com.intellij.openapi.extensions.ExtensionPoint import com.intellij.openapi.extensions.ExtensionPointName -import com.intellij.openapi.extensions.Extensions import com.intellij.openapi.project.Project open class ProjectExtensionDescriptor(name: String, private val extensionClass: Class) { val extensionPointName: ExtensionPointName = ExtensionPointName.create(name) fun registerExtensionPoint(project: Project) { - Extensions.getArea(project).registerExtensionPoint( + project.extensionArea.registerExtensionPoint( extensionPointName.name, extensionClass.name, ExtensionPoint.Kind.INTERFACE @@ -33,13 +32,13 @@ open class ProjectExtensionDescriptor(name: String, private val extensi } fun registerExtension(project: Project, extension: T) { - Extensions.getArea(project).getExtensionPoint(extensionPointName).registerExtension(extension) + project.extensionArea.getExtensionPoint(extensionPointName).registerExtension(extension, project) } fun getInstances(project: Project): List { - val projectArea = Extensions.getArea(project) + val projectArea = project.extensionArea if (!projectArea.hasExtensionPoint(extensionPointName.name)) return listOf() return projectArea.getExtensionPoint(extensionPointName).extensions.toList() } -} \ No newline at end of file +} diff --git a/compiler/frontend/src/org/jetbrains/kotlin/util/MappedExtensionProvider.kt b/compiler/frontend/src/org/jetbrains/kotlin/util/MappedExtensionProvider.kt index b8f1ac7f2e0..3f58bc035a5 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/util/MappedExtensionProvider.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/util/MappedExtensionProvider.kt @@ -40,7 +40,7 @@ protected constructor( private fun update(): R { val newVal = ApplicationManager.getApplication().let { app -> - Pair(app, map(app.getExtensions(epName).toList())) + Pair(app, map(app.extensionArea.getExtensionPoint(epName).extensionList)) } cached = WeakReference(newVal) return newVal.second diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/finder/JavaElementFinder.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/finder/JavaElementFinder.kt index ad10f732092..8d54ba5b08b 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/finder/JavaElementFinder.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/finder/JavaElementFinder.kt @@ -17,7 +17,6 @@ package org.jetbrains.kotlin.asJava.finder import com.google.common.collect.Sets -import com.intellij.openapi.extensions.Extensions import com.intellij.openapi.project.Project import com.intellij.openapi.util.Condition import com.intellij.psi.* @@ -36,6 +35,7 @@ import org.jetbrains.kotlin.psi.KtClass import org.jetbrains.kotlin.psi.KtEnumEntry import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.resolve.jvm.KotlinFinderMarker +import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull import java.util.* class JavaElementFinder( @@ -172,16 +172,9 @@ class JavaElementFinder( } companion object { - - fun getInstance(project: Project): JavaElementFinder { - val extensions = Extensions.getArea(project).getExtensionPoint(PsiElementFinder.EP_NAME).extensions - for (extension in extensions) { - if (extension is JavaElementFinder) { - return extension - } - } - throw IllegalStateException(JavaElementFinder::class.java.simpleName + " is not found for project " + project) - } + fun getInstance(project: Project): JavaElementFinder = + EP.getPoint(project).extensions.firstIsInstanceOrNull() + ?: error(JavaElementFinder::class.java.simpleName + " is not found for project " + project) fun byClasspathComparator(searchScope: GlobalSearchScope): Comparator { return Comparator { o1, o2 -> diff --git a/compiler/resolution.common.jvm/src/org/jetbrains/kotlin/resolve/jvm/KotlinJavaPsiFacade.java b/compiler/resolution.common.jvm/src/org/jetbrains/kotlin/resolve/jvm/KotlinJavaPsiFacade.java index 9a3795216f1..ff0c064455c 100644 --- a/compiler/resolution.common.jvm/src/org/jetbrains/kotlin/resolve/jvm/KotlinJavaPsiFacade.java +++ b/compiler/resolution.common.jvm/src/org/jetbrains/kotlin/resolve/jvm/KotlinJavaPsiFacade.java @@ -208,7 +208,7 @@ public class KotlinJavaPsiFacade { ); List nonKotlinFinders = ArraysKt.filter( - getProject().getExtensions(PsiElementFinder.EP_NAME), + PsiElementFinder.EP.getPoint(getProject()).getExtensions(), finder -> (finder instanceof KotlinSafeClassFinder) || !(finder instanceof NonClasspathClassFinder || finder instanceof KotlinFinderMarker || diff --git a/compiler/tests-common/tests/org/jetbrains/kotlin/codegen/GenerationUtils.kt b/compiler/tests-common/tests/org/jetbrains/kotlin/codegen/GenerationUtils.kt index 7527dba1fe5..c2ec5fcd93a 100644 --- a/compiler/tests-common/tests/org/jetbrains/kotlin/codegen/GenerationUtils.kt +++ b/compiler/tests-common/tests/org/jetbrains/kotlin/codegen/GenerationUtils.kt @@ -16,7 +16,6 @@ package org.jetbrains.kotlin.codegen -import com.intellij.openapi.extensions.Extensions import com.intellij.openapi.project.Project import com.intellij.psi.PsiElementFinder import com.intellij.psi.search.GlobalSearchScope @@ -109,9 +108,7 @@ object GenerationUtils { packagePartProvider: (GlobalSearchScope) -> PackagePartProvider, trace: BindingTrace ): GenerationState { - Extensions.getArea(project) - .getExtensionPoint(PsiElementFinder.EP_NAME) - .unregisterExtension(JavaElementFinder::class.java) + PsiElementFinder.EP.getPoint(project).unregisterExtension(JavaElementFinder::class.java) val scope = GlobalSearchScope.filesScope(project, files.map { it.virtualFile }) .uniteWith(TopDownAnalyzerFacadeForJVM.AllJavaSourcesInProjectScope(project)) diff --git a/compiler/tests-common/tests/org/jetbrains/kotlin/fir/AbstractFirBaseDiagnosticsTest.kt b/compiler/tests-common/tests/org/jetbrains/kotlin/fir/AbstractFirBaseDiagnosticsTest.kt index f5a8a2a7d90..b6b21b980df 100644 --- a/compiler/tests-common/tests/org/jetbrains/kotlin/fir/AbstractFirBaseDiagnosticsTest.kt +++ b/compiler/tests-common/tests/org/jetbrains/kotlin/fir/AbstractFirBaseDiagnosticsTest.kt @@ -5,7 +5,6 @@ package org.jetbrains.kotlin.fir -import com.intellij.openapi.extensions.Extensions import com.intellij.openapi.util.TextRange import com.intellij.psi.PsiElement import com.intellij.psi.PsiElementFinder @@ -58,9 +57,7 @@ abstract class AbstractFirBaseDiagnosticsTest : BaseDiagnosticsTest() { get() = false override fun setupEnvironment(environment: KotlinCoreEnvironment) { - Extensions.getArea(environment.project) - .getExtensionPoint(PsiElementFinder.EP_NAME) - .unregisterExtension(JavaElementFinder::class.java) + PsiElementFinder.EP.getPoint(environment.project).unregisterExtension(JavaElementFinder::class.java) } open fun analyzeAndCheckUnhandled(testDataFile: File, files: List, useLightTree: Boolean = false) { diff --git a/compiler/visualizer/tests/org/jetbrains/kotlin/visualizer/fir/AbstractFirVisualizer.kt b/compiler/visualizer/tests/org/jetbrains/kotlin/visualizer/fir/AbstractFirVisualizer.kt index 5f715247448..d88b7f5214d 100644 --- a/compiler/visualizer/tests/org/jetbrains/kotlin/visualizer/fir/AbstractFirVisualizer.kt +++ b/compiler/visualizer/tests/org/jetbrains/kotlin/visualizer/fir/AbstractFirVisualizer.kt @@ -5,7 +5,6 @@ package org.jetbrains.kotlin.visualizer.fir -import com.intellij.openapi.extensions.Extensions import com.intellij.psi.PsiElementFinder import com.intellij.psi.search.GlobalSearchScope import org.jetbrains.kotlin.asJava.finder.JavaElementFinder @@ -25,8 +24,7 @@ import java.io.File abstract class AbstractFirVisualizer : AbstractVisualizer() { override fun doVisualizerTest(file: File, environment: KotlinCoreEnvironment) { - Extensions.getArea(environment.project) - .getExtensionPoint(PsiElementFinder.EP_NAME) + PsiElementFinder.EP.getPoint(environment.project) .unregisterExtension(JavaElementFinder::class.java) val ktFiles = environment.getSourceFiles()