diff --git a/plugins/scripting/scripting-tests/test/org/jetbrains/kotlin/scripting/test/ScriptWithCustomDefConfigurators.kt b/plugins/scripting/scripting-tests/test/org/jetbrains/kotlin/scripting/test/ScriptWithCustomDefConfigurators.kt index f5444f85d2b..f7ce0df4f02 100644 --- a/plugins/scripting/scripting-tests/test/org/jetbrains/kotlin/scripting/test/ScriptWithCustomDefConfigurators.kt +++ b/plugins/scripting/scripting-tests/test/org/jetbrains/kotlin/scripting/test/ScriptWithCustomDefConfigurators.kt @@ -9,6 +9,7 @@ import org.jetbrains.kotlin.cli.jvm.config.addJvmClasspathRoots import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.scripting.configuration.ScriptingConfigurationKeys import org.jetbrains.kotlin.test.directives.model.DirectivesContainer +import org.jetbrains.kotlin.test.directives.model.StringDirective import org.jetbrains.kotlin.test.model.TestModule import org.jetbrains.kotlin.test.services.EnvironmentConfigurator import org.jetbrains.kotlin.test.services.RuntimeClasspathProvider @@ -30,9 +31,15 @@ class ScriptWithCustomDefEnvironmentConfigurator(testServices: TestServices) : E configuration.addJvmClasspathRoots(testScriptDefinitionClasspath) val dirSplitRegex = Regex(" *, *") ScriptingTestDirectives.directivesToPassViaEnvironment.forEach { (directive, envName) -> - module.directives[directive].flatMap { it.split(dirSplitRegex).filter { it.isNotEmpty() } }.let { - if (it.isNotEmpty()) { - configuration.put(ScriptingConfigurationKeys.LEGACY_SCRIPT_RESOLVER_ENVIRONMENT_OPTION, envName, it) + if (directive is StringDirective) { + module.directives[directive].flatMap { it.split(dirSplitRegex).filter { it.isNotEmpty() } }.let { + if (it.isNotEmpty()) { + configuration.put(ScriptingConfigurationKeys.LEGACY_SCRIPT_RESOLVER_ENVIRONMENT_OPTION, envName, it) + } + } + } else { + if (directive in module.directives) { + configuration.put(ScriptingConfigurationKeys.LEGACY_SCRIPT_RESOLVER_ENVIRONMENT_OPTION, envName, "true") } } } diff --git a/plugins/scripting/scripting-tests/test/org/jetbrains/kotlin/scripting/test/ScriptingTestDirectives.kt b/plugins/scripting/scripting-tests/test/org/jetbrains/kotlin/scripting/test/ScriptingTestDirectives.kt index 13dbe6d4ec4..4be9c6b3e08 100644 --- a/plugins/scripting/scripting-tests/test/org/jetbrains/kotlin/scripting/test/ScriptingTestDirectives.kt +++ b/plugins/scripting/scripting-tests/test/org/jetbrains/kotlin/scripting/test/ScriptingTestDirectives.kt @@ -10,10 +10,12 @@ import org.jetbrains.kotlin.test.directives.model.SimpleDirectivesContainer object ScriptingTestDirectives : SimpleDirectivesContainer() { val SCRIPT_DEFAULT_IMPORTS by stringDirective("Default imports", multiLine = true) val SCRIPT_PROVIDED_PROPERTIES by stringDirective("Provided properties", multiLine = true) + val GRADLE_LIKE_SCRIPT by directive("Provided properties") val directivesToPassViaEnvironment = listOf( SCRIPT_DEFAULT_IMPORTS to "defaultImports", SCRIPT_PROVIDED_PROPERTIES to "providedProperties", + GRADLE_LIKE_SCRIPT to "gradleLikeScript", ) } diff --git a/plugins/scripting/test-script-definition/test/org/jetbrains/kotlin/scripting/test/definition/customTestScriptDefinition.kt b/plugins/scripting/test-script-definition/test/org/jetbrains/kotlin/scripting/test/definition/customTestScriptDefinition.kt index 5213997fdb3..cd9876cdb31 100644 --- a/plugins/scripting/test-script-definition/test/org/jetbrains/kotlin/scripting/test/definition/customTestScriptDefinition.kt +++ b/plugins/scripting/test-script-definition/test/org/jetbrains/kotlin/scripting/test/definition/customTestScriptDefinition.kt @@ -7,8 +7,12 @@ package org.jetbrains.kotlin.scripting.test.definition import kotlin.script.experimental.annotations.KotlinScript import org.jetbrains.kotlin.scripting.definitions.getEnvironment +import org.jetbrains.kotlin.scripting.test.definition.gradleLike.CompiledKotlinBuildScript +import org.jetbrains.kotlin.scripting.test.definition.gradleLike.Project import kotlin.script.experimental.api.* import kotlin.script.experimental.host.ScriptingHostConfiguration +import kotlin.script.experimental.jvm.dependenciesFromCurrentContext +import kotlin.script.experimental.jvm.jvm @Suppress("unused", "UNUSED_PARAMETER") @KotlinScript(fileExtension = "test.kts", compilationConfiguration = ConfigurableTestScriptConfiguration::class) @@ -23,6 +27,15 @@ class ConfigurableTestScriptConfiguration : ScriptCompilationConfiguration( if (env == null) makeFailureResult("Unable to retrieve environment for the custom test script") else ScriptCompilationConfiguration(ctx.compilationConfiguration) { + env["gradleLikeScript"]?.let { + @Suppress("UNCHECKED_CAST") + defaultImports("org.jetbrains.kotlin.scripting.test.definition.gradleLike.*") + jvm { + dependenciesFromCurrentContext(wholeClasspath = true) + } + baseClass(CompiledKotlinBuildScript::class) + implicitReceivers(Project::class) + } env["defaultImports"]?.let { @Suppress("UNCHECKED_CAST") defaultImports.append(it as List) diff --git a/plugins/scripting/test-script-definition/test/org/jetbrains/kotlin/scripting/test/definition/gradleLike/PluginAware.java b/plugins/scripting/test-script-definition/test/org/jetbrains/kotlin/scripting/test/definition/gradleLike/PluginAware.java new file mode 100644 index 00000000000..3a837a6cbf3 --- /dev/null +++ b/plugins/scripting/test-script-definition/test/org/jetbrains/kotlin/scripting/test/definition/gradleLike/PluginAware.java @@ -0,0 +1,9 @@ +/* + * Copyright 2010-2024 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.test.definition.gradleLike; + +public interface PluginAware { +} diff --git a/plugins/scripting/test-script-definition/test/org/jetbrains/kotlin/scripting/test/definition/gradleLike/base.kt b/plugins/scripting/test-script-definition/test/org/jetbrains/kotlin/scripting/test/definition/gradleLike/base.kt new file mode 100644 index 00000000000..06739846b16 --- /dev/null +++ b/plugins/scripting/test-script-definition/test/org/jetbrains/kotlin/scripting/test/definition/gradleLike/base.kt @@ -0,0 +1,16 @@ +/* + * Copyright 2010-2024 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.test.definition.gradleLike + +open class DefaultKotlinScript { + fun memberApi1(body: (Int) -> Int = { it }): Int = body(42) +} + +open class CompiledKotlinBuildScript : DefaultKotlinScript(), PluginAware + +class Project : PluginAware + + diff --git a/plugins/scripting/test-script-definition/test/org/jetbrains/kotlin/scripting/test/definition/gradleLike/gradleLikeDsl.kt b/plugins/scripting/test-script-definition/test/org/jetbrains/kotlin/scripting/test/definition/gradleLike/gradleLikeDsl.kt new file mode 100644 index 00000000000..14ad6010f86 --- /dev/null +++ b/plugins/scripting/test-script-definition/test/org/jetbrains/kotlin/scripting/test/definition/gradleLike/gradleLikeDsl.kt @@ -0,0 +1,11 @@ +/* + * Copyright 2010-2024 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.test.definition.gradleLike + +@JvmOverloads +fun Project.projectApi(body: (Int) -> Int = { it }): Int = body(42) + +fun staticApi(): Int = 42