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 annotations =
|
||||
when (moduleInfo) {
|
||||
is ScriptModuleInfo -> moduleInfo.scriptDefinition.legacyDefinition.annotationsForSamWithReceivers
|
||||
is ScriptDependenciesInfo.ForFile -> moduleInfo.scriptDefinition.legacyDefinition.annotationsForSamWithReceivers
|
||||
is ScriptModuleInfo -> moduleInfo.scriptDefinition.annotationsForSamWithReceivers
|
||||
is ScriptDependenciesInfo.ForFile -> moduleInfo.scriptDefinition.annotationsForSamWithReceivers
|
||||
is ModuleProductionSourceInfo -> getAnnotationsForModule(moduleInfo.module)
|
||||
else -> null
|
||||
} ?: return
|
||||
|
||||
+7
@@ -45,6 +45,7 @@ abstract class ScriptDefinition : UserDataHolderBase() {
|
||||
|
||||
abstract val baseClassType: KotlinType
|
||||
abstract val compilerOptions: Iterable<String>
|
||||
abstract val annotationsForSamWithReceivers: List<String>
|
||||
|
||||
@Suppress("DEPRECATION")
|
||||
inline fun <reified T : KotlinScriptDefinition> asLegacyOrNull(): T? =
|
||||
@@ -94,6 +95,9 @@ abstract class ScriptDefinition : UserDataHolderBase() {
|
||||
override val compilerOptions: Iterable<String>
|
||||
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 hashCode(): Int = legacyDefinition.hashCode()
|
||||
@@ -158,6 +162,9 @@ abstract class ScriptDefinition : UserDataHolderBase() {
|
||||
override val compilerOptions: Iterable<String>
|
||||
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 ||
|
||||
(other as? FromConfigurations)?.let {
|
||||
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.JVMConfigurationKeys
|
||||
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.KtModifierListOwner
|
||||
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.configuration.ScriptingConfigurationKeys
|
||||
import org.jetbrains.kotlin.scripting.definitions.ScriptDefinition
|
||||
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.compilerOptions
|
||||
import kotlin.script.experimental.api.dependencies
|
||||
@@ -64,7 +76,7 @@ internal fun createIsolatedCompilationContext(
|
||||
|
||||
return SharedScriptCompilationContext(
|
||||
disposable, initialScriptCompilationConfiguration, environment, ignoredOptionsReportingState
|
||||
)
|
||||
).applyConfigure()
|
||||
}
|
||||
|
||||
internal fun createCompilationContextFromEnvironment(
|
||||
@@ -83,7 +95,37 @@ internal fun createCompilationContextFromEnvironment(
|
||||
|
||||
return SharedScriptCompilationContext(
|
||||
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(
|
||||
|
||||
Reference in New Issue
Block a user