[FIR] Add FirExtensionRegistrarAdapter to fix extension points in FE 1.0 IDE plugin

FirExtensionRegistrar is FIR specific extension which requires FIR
  classes to work, which are missing in dependencies of FE 1.0 IDE plugin.
  To fix this issue FirExtensionRegistrarAdapter is introduced. This
  class is a base class for FirExtensionRegistrar and it does not have
  any FIR specific classes in it's API, so it can be safely registered
  in IDE
This commit is contained in:
Dmitriy Novozhilov
2021-12-06 12:52:40 +03:00
committed by teamcity
parent a2395ec8bb
commit 7bcd3c7948
4 changed files with 39 additions and 10 deletions
@@ -66,8 +66,8 @@
<extensionPoint qualifiedName="org.jetbrains.kotlin.renameHandler"
interface="com.intellij.refactoring.rename.RenameHandler"
dynamic="true"/>
<extensionPoint qualifiedName="org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrar"
interface="org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrar"/>
<extensionPoint qualifiedName="org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrarAdapter"
interface="org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrarAdapter"/>
<extensionPoint qualifiedName="org.jetbrains.kotlin.DescriptorSerializerPlugin"
interface="org.jetbrains.kotlin.serialization.DescriptorSerializerPlugin"/>
<extensionPoint qualifiedName="org.jetbrains.kotlin.defaultErrorMessages"
@@ -82,7 +82,7 @@ import org.jetbrains.kotlin.config.*
import org.jetbrains.kotlin.extensions.*
import org.jetbrains.kotlin.extensions.internal.CandidateInterceptor
import org.jetbrains.kotlin.extensions.internal.TypeResolutionInterceptor
import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrar
import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrarAdapter
import org.jetbrains.kotlin.idea.KotlinFileType
import org.jetbrains.kotlin.js.translate.extensions.JsSyntheticTranslateExtension
import org.jetbrains.kotlin.load.kotlin.KotlinBinaryClassCache
@@ -649,7 +649,7 @@ class KotlinCoreEnvironment private constructor(
TypeResolutionInterceptor.registerExtensionPoint(project)
CandidateInterceptor.registerExtensionPoint(project)
DescriptorSerializerPlugin.registerExtensionPoint(project)
FirExtensionRegistrar.registerExtensionPoint(project)
FirExtensionRegistrarAdapter.registerExtensionPoint(project)
}
internal fun registerExtensionsFromPlugins(project: MockProject, configuration: CompilerConfiguration) {
@@ -5,17 +5,23 @@
package org.jetbrains.kotlin.fir.extensions
import org.jetbrains.kotlin.extensions.ProjectExtensionDescriptor
import com.intellij.openapi.project.Project
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.SessionConfiguration
import org.jetbrains.kotlin.fir.analysis.extensions.FirAdditionalCheckersExtension
import kotlin.reflect.KClass
abstract class FirExtensionRegistrar {
companion object : ProjectExtensionDescriptor<FirExtensionRegistrar>(
name = "org.jetbrains.kotlin.fir.extensions.firExtensionRegistrar",
extensionClass = FirExtensionRegistrar::class.java
) {
abstract class FirExtensionRegistrar : FirExtensionRegistrarAdapter() {
companion object {
fun getInstances(project: Project): List<FirExtensionRegistrar> {
@Suppress("UNCHECKED_CAST")
return FirExtensionRegistrarAdapter.getInstances(project) as List<FirExtensionRegistrar>
}
fun registerExtension(project: Project, extension: FirExtensionRegistrar) {
FirExtensionRegistrarAdapter.registerExtension(project, extension)
}
internal val AVAILABLE_EXTENSIONS = listOf(
FirStatusTransformerExtension::class,
FirDeclarationGenerationExtension::class,
@@ -0,0 +1,23 @@
/*
* 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.fir.extensions
import org.jetbrains.kotlin.extensions.ProjectExtensionDescriptor
/*
* This is needed to prevent ClassNotFoundExceptions in IDE plugin built on FE 1.0
*
* Actual FirExtensionRegistrar uses some specific classes from FIR, so if we reference
* it in KotlinCoreEnvironment (where all extension points are registered) then we
* need to have all FIR compiler on classpath. And in IDE plugin we don't depend
* on FIR to reduce plugin size.
*/
abstract class FirExtensionRegistrarAdapter {
companion object : ProjectExtensionDescriptor<FirExtensionRegistrarAdapter>(
name = "org.jetbrains.kotlin.fir.extensions.firExtensionRegistrar",
extensionClass = FirExtensionRegistrarAdapter::class.java
)
}