[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:
committed by
Space Team
parent
1b8fd01969
commit
28ff94533a
+55
@@ -0,0 +1,55 @@
|
||||
/*
|
||||
* 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.scripting.compiler.plugin
|
||||
|
||||
import org.jetbrains.kotlin.builtins.functions.FunctionTypeKind
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.builder.scriptConfigurators
|
||||
import org.jetbrains.kotlin.fir.containingClassLookupTag
|
||||
import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction
|
||||
import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrar
|
||||
import org.jetbrains.kotlin.fir.extensions.extensionService
|
||||
import org.jetbrains.kotlin.fir.resolve.FirSamConversionTransformerExtension
|
||||
import org.jetbrains.kotlin.fir.resolve.createFunctionType
|
||||
import org.jetbrains.kotlin.fir.resolve.toFirRegularClassSymbol
|
||||
import org.jetbrains.kotlin.fir.types.ConeLookupTagBasedType
|
||||
import org.jetbrains.kotlin.fir.types.coneType
|
||||
import org.jetbrains.kotlin.fir.types.functionTypeService
|
||||
import org.jetbrains.kotlin.scripting.compiler.plugin.services.FirScriptConfiguratorExtensionImpl
|
||||
import org.jetbrains.kotlin.utils.addToStdlib.runIf
|
||||
|
||||
|
||||
class FirScriptingSamWithReceiverExtensionRegistrar() : FirExtensionRegistrar() {
|
||||
override fun ExtensionRegistrarContext.configurePlugin() {
|
||||
+FirScriptingSamWithReceiverExtensionRegistrar::FirScriptSamWithReceiverConventionTransformer
|
||||
}
|
||||
|
||||
class FirScriptSamWithReceiverConventionTransformer(
|
||||
session: FirSession
|
||||
) : FirSamConversionTransformerExtension(session) {
|
||||
|
||||
val knownAnnotations: Set<String> by lazy {
|
||||
session.extensionService.scriptConfigurators.flatMapTo(mutableSetOf()) {
|
||||
(it as? FirScriptConfiguratorExtensionImpl)?.knownAnnotationsForSamWithReceiver ?: emptySet()
|
||||
}
|
||||
}
|
||||
|
||||
override fun getCustomFunctionTypeForSamConversion(function: FirSimpleFunction): ConeLookupTagBasedType? {
|
||||
val containingClassSymbol = function.containingClassLookupTag()?.toFirRegularClassSymbol(session) ?: return null
|
||||
return runIf(containingClassSymbol.resolvedAnnotationClassIds.any { it.asSingleFqName().asString() in knownAnnotations }) {
|
||||
val parameterTypes = function.valueParameters.map { it.returnTypeRef.coneType }
|
||||
if (parameterTypes.isEmpty()) return null
|
||||
val kind = session.functionTypeService.extractSingleSpecialKindForFunction(function.symbol) ?: FunctionTypeKind.Function
|
||||
createFunctionType(
|
||||
kind,
|
||||
parameters = parameterTypes.subList(1, parameterTypes.size),
|
||||
receiverType = parameterTypes[0],
|
||||
rawReturnType = function.returnTypeRef.coneType
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+1
-49
@@ -8,16 +8,15 @@
|
||||
package org.jetbrains.kotlin.scripting.compiler.plugin.impl
|
||||
|
||||
import com.intellij.openapi.Disposable
|
||||
import org.jetbrains.kotlin.builtins.functions.FunctionTypeKind
|
||||
import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys
|
||||
import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments
|
||||
import org.jetbrains.kotlin.cli.common.arguments.parseCommandLineArguments
|
||||
import org.jetbrains.kotlin.cli.common.arguments.validateArguments
|
||||
import org.jetbrains.kotlin.cli.common.checkPluginsArguments
|
||||
import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity
|
||||
import org.jetbrains.kotlin.cli.common.messages.MessageCollector
|
||||
import org.jetbrains.kotlin.cli.common.reportArgumentParseProblems
|
||||
import org.jetbrains.kotlin.cli.common.setupCommonArguments
|
||||
import org.jetbrains.kotlin.cli.common.checkPluginsArguments
|
||||
import org.jetbrains.kotlin.cli.jvm.*
|
||||
import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles
|
||||
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment
|
||||
@@ -38,18 +37,6 @@ import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
||||
import org.jetbrains.kotlin.extensions.AnnotationBasedExtension
|
||||
import org.jetbrains.kotlin.extensions.StorageComponentContainerContributor
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.builder.scriptConfigurators
|
||||
import org.jetbrains.kotlin.fir.containingClassLookupTag
|
||||
import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction
|
||||
import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrar
|
||||
import org.jetbrains.kotlin.fir.extensions.extensionService
|
||||
import org.jetbrains.kotlin.fir.resolve.FirSamConversionTransformerExtension
|
||||
import org.jetbrains.kotlin.fir.resolve.createFunctionType
|
||||
import org.jetbrains.kotlin.fir.resolve.toFirRegularClassSymbol
|
||||
import org.jetbrains.kotlin.fir.types.ConeLookupTagBasedType
|
||||
import org.jetbrains.kotlin.fir.types.coneType
|
||||
import org.jetbrains.kotlin.fir.types.functionTypeService
|
||||
import org.jetbrains.kotlin.platform.TargetPlatform
|
||||
import org.jetbrains.kotlin.platform.jvm.isJvm
|
||||
import org.jetbrains.kotlin.psi.KtFile
|
||||
@@ -58,12 +45,10 @@ import org.jetbrains.kotlin.resolve.sam.SamWithReceiverResolver
|
||||
import org.jetbrains.kotlin.scripting.compiler.plugin.ScriptingCompilerConfigurationComponentRegistrar
|
||||
import org.jetbrains.kotlin.scripting.compiler.plugin.dependencies.ScriptsCompilationDependencies
|
||||
import org.jetbrains.kotlin.scripting.compiler.plugin.dependencies.collectScriptsCompilationDependencies
|
||||
import org.jetbrains.kotlin.scripting.compiler.plugin.services.FirScriptConfiguratorExtensionImpl
|
||||
import org.jetbrains.kotlin.scripting.configuration.ScriptingConfigurationKeys
|
||||
import org.jetbrains.kotlin.scripting.definitions.ScriptDefinition
|
||||
import org.jetbrains.kotlin.scripting.definitions.ScriptDependenciesProvider
|
||||
import org.jetbrains.kotlin.scripting.definitions.annotationsForSamWithReceivers
|
||||
import org.jetbrains.kotlin.utils.addToStdlib.runIf
|
||||
import kotlin.script.experimental.api.ScriptCompilationConfiguration
|
||||
import kotlin.script.experimental.api.compilerOptions
|
||||
import kotlin.script.experimental.api.dependencies
|
||||
@@ -139,39 +124,6 @@ internal class ScriptingSamWithReceiverComponentContributor(val annotations: Lis
|
||||
}
|
||||
}
|
||||
|
||||
internal class FirScriptingSamWithReceiverExtensionRegistrar() : FirExtensionRegistrar() {
|
||||
override fun ExtensionRegistrarContext.configurePlugin() {
|
||||
+::FirScriptSamWithReceiverConventionTransformer
|
||||
}
|
||||
|
||||
class FirScriptSamWithReceiverConventionTransformer(
|
||||
session: FirSession
|
||||
) : FirSamConversionTransformerExtension(session) {
|
||||
|
||||
val knownAnnotations: Set<String> by lazy {
|
||||
session.extensionService.scriptConfigurators.flatMapTo(mutableSetOf()) {
|
||||
(it as? FirScriptConfiguratorExtensionImpl)?.knownAnnotationsForSamWithReceiver ?: emptySet()
|
||||
}
|
||||
}
|
||||
|
||||
override fun getCustomFunctionTypeForSamConversion(function: FirSimpleFunction): ConeLookupTagBasedType? {
|
||||
val containingClassSymbol = function.containingClassLookupTag()?.toFirRegularClassSymbol(session) ?: return null
|
||||
return runIf(containingClassSymbol.resolvedAnnotationClassIds.any { it.asSingleFqName().asString() in knownAnnotations }) {
|
||||
val parameterTypes = function.valueParameters.map { it.returnTypeRef.coneType }
|
||||
if (parameterTypes.isEmpty()) return null
|
||||
val kind = session.functionTypeService.extractSingleSpecialKindForFunction(function.symbol) ?: FunctionTypeKind.Function
|
||||
createFunctionType(
|
||||
kind,
|
||||
parameters = parameterTypes.subList(1, parameterTypes.size),
|
||||
receiverType = parameterTypes[0],
|
||||
rawReturnType = function.returnTypeRef.coneType
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
internal fun SharedScriptCompilationContext.applyConfigure(): SharedScriptCompilationContext = apply {
|
||||
val samWithReceiverAnnotations = baseScriptCompilationConfiguration[ScriptCompilationConfiguration.annotationsForSamWithReceivers]
|
||||
if (samWithReceiverAnnotations?.isEmpty() == false) {
|
||||
|
||||
-1
@@ -30,7 +30,6 @@ import org.jetbrains.kotlin.scripting.compiler.plugin.definitions.CliScriptRepor
|
||||
import org.jetbrains.kotlin.scripting.compiler.plugin.extensions.JvmStandardReplFactoryExtension
|
||||
import org.jetbrains.kotlin.scripting.compiler.plugin.extensions.ScriptingCollectAdditionalSourcesExtension
|
||||
import org.jetbrains.kotlin.scripting.compiler.plugin.extensions.ScriptingProcessSourcesBeforeCompilingExtension
|
||||
import org.jetbrains.kotlin.scripting.compiler.plugin.impl.FirScriptingSamWithReceiverExtensionRegistrar
|
||||
import org.jetbrains.kotlin.scripting.definitions.ScriptDefinitionProvider
|
||||
import org.jetbrains.kotlin.scripting.definitions.ScriptDependenciesProvider
|
||||
import org.jetbrains.kotlin.scripting.extensions.ScriptExtraImportsProviderExtension
|
||||
|
||||
Reference in New Issue
Block a user