Implement samWithReceiver support for scripts when ...
it configured from script compilation configuration #KT-34294 fixed
This commit is contained in:
+2
-2
@@ -66,8 +66,8 @@ class IdeSamWithReceiverComponentContributor(val project: Project) : StorageComp
|
|||||||
val moduleInfo = moduleDescriptor.getCapability(ModuleInfo.Capability)
|
val moduleInfo = moduleDescriptor.getCapability(ModuleInfo.Capability)
|
||||||
val annotations =
|
val annotations =
|
||||||
when (moduleInfo) {
|
when (moduleInfo) {
|
||||||
is ScriptModuleInfo -> moduleInfo.scriptDefinition.legacyDefinition.annotationsForSamWithReceivers
|
is ScriptModuleInfo -> moduleInfo.scriptDefinition.annotationsForSamWithReceivers
|
||||||
is ScriptDependenciesInfo.ForFile -> moduleInfo.scriptDefinition.legacyDefinition.annotationsForSamWithReceivers
|
is ScriptDependenciesInfo.ForFile -> moduleInfo.scriptDefinition.annotationsForSamWithReceivers
|
||||||
is ModuleProductionSourceInfo -> getAnnotationsForModule(moduleInfo.module)
|
is ModuleProductionSourceInfo -> getAnnotationsForModule(moduleInfo.module)
|
||||||
else -> null
|
else -> null
|
||||||
} ?: return
|
} ?: return
|
||||||
|
|||||||
+7
@@ -45,6 +45,7 @@ abstract class ScriptDefinition : UserDataHolderBase() {
|
|||||||
|
|
||||||
abstract val baseClassType: KotlinType
|
abstract val baseClassType: KotlinType
|
||||||
abstract val compilerOptions: Iterable<String>
|
abstract val compilerOptions: Iterable<String>
|
||||||
|
abstract val annotationsForSamWithReceivers: List<String>
|
||||||
|
|
||||||
@Suppress("DEPRECATION")
|
@Suppress("DEPRECATION")
|
||||||
inline fun <reified T : KotlinScriptDefinition> asLegacyOrNull(): T? =
|
inline fun <reified T : KotlinScriptDefinition> asLegacyOrNull(): T? =
|
||||||
@@ -94,6 +95,9 @@ abstract class ScriptDefinition : UserDataHolderBase() {
|
|||||||
override val compilerOptions: Iterable<String>
|
override val compilerOptions: Iterable<String>
|
||||||
get() = legacyDefinition.additionalCompilerArguments ?: emptyList()
|
get() = legacyDefinition.additionalCompilerArguments ?: emptyList()
|
||||||
|
|
||||||
|
override val annotationsForSamWithReceivers: List<String>
|
||||||
|
get() = legacyDefinition.annotationsForSamWithReceivers
|
||||||
|
|
||||||
override fun equals(other: Any?): Boolean = this === other || legacyDefinition == (other as? FromLegacy)?.legacyDefinition
|
override fun equals(other: Any?): Boolean = this === other || legacyDefinition == (other as? FromLegacy)?.legacyDefinition
|
||||||
|
|
||||||
override fun hashCode(): Int = legacyDefinition.hashCode()
|
override fun hashCode(): Int = legacyDefinition.hashCode()
|
||||||
@@ -158,6 +162,9 @@ abstract class ScriptDefinition : UserDataHolderBase() {
|
|||||||
override val compilerOptions: Iterable<String>
|
override val compilerOptions: Iterable<String>
|
||||||
get() = compilationConfiguration[ScriptCompilationConfiguration.compilerOptions].orEmpty()
|
get() = compilationConfiguration[ScriptCompilationConfiguration.compilerOptions].orEmpty()
|
||||||
|
|
||||||
|
override val annotationsForSamWithReceivers: List<String>
|
||||||
|
get() = compilationConfiguration[ScriptCompilationConfiguration.annotationsForSamWithReceivers].orEmpty().map { it.typeName }
|
||||||
|
|
||||||
override fun equals(other: Any?): Boolean = this === other ||
|
override fun equals(other: Any?): Boolean = this === other ||
|
||||||
(other as? FromConfigurations)?.let {
|
(other as? FromConfigurations)?.let {
|
||||||
compilationConfiguration == it.compilationConfiguration && evaluationConfiguration == it.evaluationConfiguration
|
compilationConfiguration == it.compilationConfiguration && evaluationConfiguration == it.evaluationConfiguration
|
||||||
|
|||||||
+44
-2
@@ -23,13 +23,25 @@ import org.jetbrains.kotlin.config.CommonConfigurationKeys
|
|||||||
import org.jetbrains.kotlin.config.CompilerConfiguration
|
import org.jetbrains.kotlin.config.CompilerConfiguration
|
||||||
import org.jetbrains.kotlin.config.JVMConfigurationKeys
|
import org.jetbrains.kotlin.config.JVMConfigurationKeys
|
||||||
import org.jetbrains.kotlin.config.JvmTarget
|
import org.jetbrains.kotlin.config.JvmTarget
|
||||||
|
import org.jetbrains.kotlin.container.StorageComponentContainer
|
||||||
|
import org.jetbrains.kotlin.container.useInstance
|
||||||
|
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||||
|
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.load.java.sam.SamWithReceiverResolver
|
||||||
|
import org.jetbrains.kotlin.platform.TargetPlatform
|
||||||
|
import org.jetbrains.kotlin.platform.jvm.isJvm
|
||||||
import org.jetbrains.kotlin.psi.KtFile
|
import org.jetbrains.kotlin.psi.KtFile
|
||||||
|
import org.jetbrains.kotlin.psi.KtModifierListOwner
|
||||||
import org.jetbrains.kotlin.scripting.compiler.plugin.ScriptingCompilerConfigurationComponentRegistrar
|
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.ScriptsCompilationDependencies
|
||||||
import org.jetbrains.kotlin.scripting.compiler.plugin.dependencies.collectScriptsCompilationDependencies
|
import org.jetbrains.kotlin.scripting.compiler.plugin.dependencies.collectScriptsCompilationDependencies
|
||||||
import org.jetbrains.kotlin.scripting.configuration.ScriptingConfigurationKeys
|
import org.jetbrains.kotlin.scripting.configuration.ScriptingConfigurationKeys
|
||||||
import org.jetbrains.kotlin.scripting.definitions.ScriptDefinition
|
import org.jetbrains.kotlin.scripting.definitions.ScriptDefinition
|
||||||
import org.jetbrains.kotlin.scripting.definitions.ScriptDependenciesProvider
|
import org.jetbrains.kotlin.scripting.definitions.ScriptDependenciesProvider
|
||||||
|
import org.jetbrains.kotlin.scripting.definitions.annotationsForSamWithReceivers
|
||||||
import kotlin.script.experimental.api.ScriptCompilationConfiguration
|
import kotlin.script.experimental.api.ScriptCompilationConfiguration
|
||||||
import kotlin.script.experimental.api.compilerOptions
|
import kotlin.script.experimental.api.compilerOptions
|
||||||
import kotlin.script.experimental.api.dependencies
|
import kotlin.script.experimental.api.dependencies
|
||||||
@@ -64,7 +76,7 @@ internal fun createIsolatedCompilationContext(
|
|||||||
|
|
||||||
return SharedScriptCompilationContext(
|
return SharedScriptCompilationContext(
|
||||||
disposable, initialScriptCompilationConfiguration, environment, ignoredOptionsReportingState
|
disposable, initialScriptCompilationConfiguration, environment, ignoredOptionsReportingState
|
||||||
)
|
).applyConfigure()
|
||||||
}
|
}
|
||||||
|
|
||||||
internal fun createCompilationContextFromEnvironment(
|
internal fun createCompilationContextFromEnvironment(
|
||||||
@@ -83,7 +95,37 @@ internal fun createCompilationContextFromEnvironment(
|
|||||||
|
|
||||||
return SharedScriptCompilationContext(
|
return SharedScriptCompilationContext(
|
||||||
null, initialScriptCompilationConfiguration, environment, ignoredOptionsReportingState
|
null, initialScriptCompilationConfiguration, environment, ignoredOptionsReportingState
|
||||||
)
|
).applyConfigure()
|
||||||
|
}
|
||||||
|
|
||||||
|
// copied with minor modifications from the sam-with-receiver-cli
|
||||||
|
// TODO: consider placing into a shared jar
|
||||||
|
internal class ScriptingSamWithReceiverComponentContributor(val annotations: List<String>) : StorageComponentContainerContributor {
|
||||||
|
|
||||||
|
private class Extension(private val annotations: List<String>) : SamWithReceiverResolver, AnnotationBasedExtension {
|
||||||
|
override fun getAnnotationFqNames(modifierListOwner: KtModifierListOwner?) = annotations
|
||||||
|
|
||||||
|
override fun shouldConvertFirstSamParameterToReceiver(function: FunctionDescriptor): Boolean =
|
||||||
|
(function.containingDeclaration as? ClassDescriptor)?.hasSpecialAnnotation(null) ?: false
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun registerModuleComponents(
|
||||||
|
container: StorageComponentContainer, platform: TargetPlatform, moduleDescriptor: ModuleDescriptor
|
||||||
|
) {
|
||||||
|
if (platform.isJvm()) {
|
||||||
|
container.useInstance(Extension(annotations))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal fun SharedScriptCompilationContext.applyConfigure(): SharedScriptCompilationContext = apply {
|
||||||
|
val samWithReceiverAnnotations = baseScriptCompilationConfiguration[ScriptCompilationConfiguration.annotationsForSamWithReceivers]
|
||||||
|
if (samWithReceiverAnnotations?.isEmpty() == false) {
|
||||||
|
StorageComponentContainerContributor.registerExtension(
|
||||||
|
environment.project,
|
||||||
|
ScriptingSamWithReceiverComponentContributor(samWithReceiverAnnotations.map { it.typeName })
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
internal fun createInitialConfigurations(
|
internal fun createInitialConfigurations(
|
||||||
|
|||||||
Reference in New Issue
Block a user