[KT-58817] Add script-related extensions for FIR session

The following two registrars were missing:
- FirScriptingCompilerExtensionIdeRegistrar
- FirScriptingSamWithReceiverExtensionRegistrar

`FirScriptingCompilerExtensionIdeRegistrar` was introduced as a copy of
`FirScriptingCompilerExtensionRegistrar` adapted for usage from IDE.

`FirRegisteredPluginAnnotations` and `FirJvmTypeMapper` are mandatory at
`FirExtensionService.registerExtensions` and reported as missing at
runtime.
This commit is contained in:
Andrei Klunnyi
2023-05-04 15:15:34 +02:00
committed by Space Team
parent 1b8fd01969
commit 28ff94533a
7 changed files with 114 additions and 55 deletions
@@ -27,6 +27,8 @@ dependencies {
implementation(project(":analysis:analysis-api-providers"))
implementation(project(":analysis:analysis-api"))
implementation(project(":analysis:analysis-internal-utils"))
implementation(project(":kotlin-scripting-compiler"))
implementation(project(":kotlin-scripting-common"))
// We cannot use the latest version `3.1.5` because it doesn't support Java 8.
implementation("com.github.ben-manes.caffeine:caffeine:2.9.3")
@@ -0,0 +1,35 @@
/*
* Copyright 2010-2023 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.analysis.low.level.api.fir.sessions
import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrar
import org.jetbrains.kotlin.scripting.compiler.plugin.services.FirScriptConfiguratorExtensionImpl
import org.jetbrains.kotlin.scripting.compiler.plugin.services.FirScriptDefinitionProviderService
import org.jetbrains.kotlin.scripting.definitions.ScriptDefinition
import org.jetbrains.kotlin.scripting.definitions.ScriptDefinitionsSource
import kotlin.script.experimental.host.ScriptingHostConfiguration
/**
* The class is a copy of [org.jetbrains.kotlin.scripting.compiler.plugin.FirScriptingCompilerExtensionRegistrar] adapted for the usage
* outside the compiler context. Difference lies in its constructor parameters, namely in
* [org.jetbrains.kotlin.config.CompilerConfiguration] replaced with a pair of explicit [scriptDefinitionSources] and [scriptDefinitions].
*/
internal class FirScriptingCompilerExtensionIdeRegistrar(
private val hostConfiguration: ScriptingHostConfiguration,
private val scriptDefinitionSources: List<ScriptDefinitionsSource>,
private val scriptDefinitions: List<ScriptDefinition>
) : FirExtensionRegistrar() {
override fun ExtensionRegistrarContext.configurePlugin() {
val definitionSources = scriptDefinitionSources
val definitions = scriptDefinitions
if (definitionSources.isNotEmpty() || definitions.isNotEmpty()) {
+FirScriptDefinitionProviderService.getFactory(definitions, definitionSources)
}
+FirScriptConfiguratorExtensionImpl.getFactory(hostConfiguration)
}
}
@@ -44,8 +44,12 @@ import org.jetbrains.kotlin.fir.symbols.FirLazyDeclarationResolver
import org.jetbrains.kotlin.platform.jvm.JvmPlatforms
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.resolve.jvm.modules.JavaModuleResolver
import org.jetbrains.kotlin.scripting.compiler.plugin.FirScriptingSamWithReceiverExtensionRegistrar
import org.jetbrains.kotlin.scripting.definitions.findScriptDefinition
import org.jetbrains.kotlin.utils.addIfNotNull
import org.jetbrains.kotlin.utils.addToStdlib.partitionIsInstance
import kotlin.script.experimental.host.ScriptingHostConfiguration
import kotlin.script.experimental.jvm.defaultJvmScriptingHostConfiguration
@OptIn(PrivateSessionConstructor::class, SessionConfiguration::class)
internal abstract class LLFirAbstractSessionFactory(protected val project: Project) {
@@ -117,7 +121,23 @@ internal abstract class LLFirAbstractSessionFactory(protected val project: Proje
register(FirPredicateBasedProvider::class, FirEmptyPredicateBasedProvider)
register(DEPENDENCIES_SYMBOL_PROVIDER_QUALIFIED_KEY, dependencyProvider)
register(FirRegisteredPluginAnnotations::class, FirRegisteredPluginAnnotations.Empty)
register(FirRegisteredPluginAnnotations::class, FirRegisteredPluginAnnotationsImpl(this))
register(FirJvmTypeMapper::class, FirJvmTypeMapper(this))
FirSessionConfigurator(this).apply {
val hostConfiguration = ScriptingHostConfiguration(defaultJvmScriptingHostConfiguration) {}
val scriptDefinition = module.file.findScriptDefinition()
?: error("Cannot load script definition for ${module.file.virtualFilePath}")
val extensionRegistrar = FirScriptingCompilerExtensionIdeRegistrar(
hostConfiguration,
scriptDefinitionSources = emptyList(),
scriptDefinitions = listOf(scriptDefinition)
)
registerExtensions(extensionRegistrar.configure())
registerExtensions(FirScriptingSamWithReceiverExtensionRegistrar().configure())
}.configure()
LLFirSessionConfigurator.configure(this)
}
@@ -10,15 +10,11 @@ import com.intellij.psi.util.CachedValue
import com.intellij.psi.util.CachedValueProvider
import com.intellij.psi.util.CachedValuesManager
import com.intellij.util.containers.CollectionFactory
import org.jetbrains.kotlin.analysis.low.level.api.fir.project.structure.*
import org.jetbrains.kotlin.analysis.low.level.api.fir.providers.*
import org.jetbrains.kotlin.analysis.low.level.api.fir.util.checkCanceled
import org.jetbrains.kotlin.analysis.project.structure.*
import org.jetbrains.kotlin.fir.FirModuleDataImpl
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.PrivateSessionConstructor
import org.jetbrains.kotlin.fir.extensions.*
import org.jetbrains.kotlin.fir.resolve.providers.*
import org.jetbrains.kotlin.fir.session.*
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.platform.JsPlatform