diff --git a/compiler/testData/codegen/customScript/providedPropsInLambda.kts b/compiler/testData/codegen/customScript/providedPropsInLambda.kts new file mode 100644 index 00000000000..890c1fedfc4 --- /dev/null +++ b/compiler/testData/codegen/customScript/providedPropsInLambda.kts @@ -0,0 +1,10 @@ + +// KOTLIN_SCRIPT_DEFINITION: org.jetbrains.kotlin.codegen.TestScriptWithSimpleEnvVars + +// envVar: stringVar1=abracadabra + +fun foo(body: () -> String): String = body() + +val res = foo { stringVar1.drop(5) } + +// expected: res=adabra diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/CustomScriptCodegenTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/CustomScriptCodegenTestGenerated.java index e9967d96aec..ab17c238138 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/CustomScriptCodegenTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/CustomScriptCodegenTestGenerated.java @@ -34,6 +34,11 @@ public class CustomScriptCodegenTestGenerated extends AbstractCustomScriptCodege runTest("compiler/testData/codegen/customScript/pathPattern5.kts"); } + @TestMetadata("providedPropsInLambda.kts") + public void testProvidedPropsInLambda_kts() throws Exception { + runTest("compiler/testData/codegen/customScript/providedPropsInLambda.kts"); + } + @TestMetadata("simpleEnvVars.kts") public void testSimpleEnvVars_kts() throws Exception { runTest("compiler/testData/codegen/customScript/simpleEnvVars.kts"); diff --git a/libraries/scripting/jsr223-test/test/kotlin/script/experimental/jsr223/test/KotlinJsr223ScriptEngineIT.kt b/libraries/scripting/jsr223-test/test/kotlin/script/experimental/jsr223/test/KotlinJsr223ScriptEngineIT.kt index 633afacc00f..9ed9afbb973 100644 --- a/libraries/scripting/jsr223-test/test/kotlin/script/experimental/jsr223/test/KotlinJsr223ScriptEngineIT.kt +++ b/libraries/scripting/jsr223-test/test/kotlin/script/experimental/jsr223/test/KotlinJsr223ScriptEngineIT.kt @@ -18,6 +18,12 @@ private const val KOTLIN_JSR223_RESOLVE_FROM_CLASSLOADER_PROPERTY = "kotlin.jsr2 @Suppress("unused") // accessed from the tests below val shouldBeVisibleFromRepl = 7 +@Suppress("unused") // accessed from the tests below +fun callLambda(x: Int, aFunction: (Int) -> Int): Int = aFunction.invoke(x) + +@Suppress("unused") // accessed from the tests below +inline fun inlineCallLambda(x: Int, aFunction: (Int) -> Int): Int = aFunction.invoke(x) + class KotlinJsr223ScriptEngineIT { init { @@ -297,6 +303,30 @@ obj Assert.assertEquals(42, result) } + @Test + fun testResolveFromContextLambda() { + val scriptEngine = ScriptEngineManager().getEngineByExtension("kts")!! + + val script1 = """ + kotlin.script.experimental.jsr223.test.callLambda(4) { x -> + x % aValue + } + """ + + val script2 = """ + kotlin.script.experimental.jsr223.test.inlineCallLambda(5) { x -> + x % aValue + } + """ + + scriptEngine.put("aValue", 3) + + val res1 = scriptEngine.eval(script1) + Assert.assertEquals(1, res1) + val res2 = scriptEngine.eval(script2) + Assert.assertEquals(2, res2) + } + @Test fun testResolveFromContextDirectExperimental() { val prevProp = System.setProperty(KOTLIN_JSR223_RESOLVE_FROM_CLASSLOADER_PROPERTY, "true") diff --git a/plugins/scripting/scripting-compiler-impl/src/org/jetbrains/kotlin/scripting/resolve/ScriptProvidedPropertyDescriptor.kt b/plugins/scripting/scripting-compiler-impl/src/org/jetbrains/kotlin/scripting/resolve/ScriptProvidedPropertyDescriptor.kt index 599750b9b3b..68878e47238 100644 --- a/plugins/scripting/scripting-compiler-impl/src/org/jetbrains/kotlin/scripting/resolve/ScriptProvidedPropertyDescriptor.kt +++ b/plugins/scripting/scripting-compiler-impl/src/org/jetbrains/kotlin/scripting/resolve/ScriptProvidedPropertyDescriptor.kt @@ -8,9 +8,6 @@ package org.jetbrains.kotlin.scripting.resolve import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.annotations.Annotations import org.jetbrains.kotlin.descriptors.impl.PropertyDescriptorImpl -import org.jetbrains.kotlin.descriptors.impl.PropertyGetterDescriptorImpl -import org.jetbrains.kotlin.descriptors.impl.PropertySetterDescriptorImpl -import org.jetbrains.kotlin.descriptors.impl.ValueParameterDescriptorImpl import org.jetbrains.kotlin.name.Name class ScriptProvidedPropertyDescriptor( @@ -24,7 +21,7 @@ class ScriptProvidedPropertyDescriptor( null, Annotations.EMPTY, Modality.FINAL, - DescriptorVisibilities.PRIVATE, + DescriptorVisibilities.PUBLIC, isVar, name, CallableMemberDescriptor.Kind.SYNTHESIZED, @@ -34,58 +31,7 @@ class ScriptProvidedPropertyDescriptor( ) { init { setType(typeDescriptor.defaultType, emptyList(), receiver, null) - initialize( - makePropertyGetterDescriptor(), - if (!isVar) null else makePropertySetterDescriptor() - ) + // TODO: consider delegation instead + initialize(null, null, null, null) } } - -private fun PropertyDescriptorImpl.makePropertyGetterDescriptor() = - PropertyGetterDescriptorImpl( - this, - Annotations.EMPTY, - this.modality, - this.visibility, - /* isDefault = */ - false, /* isExternal = */ - false, /* isInline = */ - false, - this.kind, - null, - SourceElement.NO_SOURCE - ).also { - it.initialize(returnType) - } - -private fun PropertyDescriptorImpl.makePropertySetterDescriptor() = - PropertySetterDescriptorImpl( - this, - Annotations.EMPTY, - this.modality, - this.visibility, - /* isDefault = */ - false, /* isExternal = */ - false, /* isInline = */ - false, - this.kind, - null, - SourceElement.NO_SOURCE - ).also { - it.initialize( - ValueParameterDescriptorImpl( - this, - null, - 0, - Annotations.EMPTY, - Name.special(""), - returnType, - /* declaresDefaultValue = */ - false, /* isCrossinline = */ - false, /* isNoinline = */ - false, - null, - SourceElement.NO_SOURCE - ) - ) - }