diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ScriptCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ScriptCodegen.java index df5284523bc..f6a8d1e7660 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ScriptCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ScriptCodegen.java @@ -17,13 +17,18 @@ package org.jetbrains.kotlin.codegen; import kotlin.Pair; +import kotlin.collections.CollectionsKt; import kotlin.jvm.functions.Function0; +import kotlin.jvm.functions.Function1; import org.jetbrains.annotations.NotNull; import org.jetbrains.kotlin.codegen.context.CodegenContext; import org.jetbrains.kotlin.codegen.context.MethodContext; import org.jetbrains.kotlin.codegen.context.ScriptContext; import org.jetbrains.kotlin.codegen.state.GenerationState; -import org.jetbrains.kotlin.descriptors.*; +import org.jetbrains.kotlin.descriptors.ClassDescriptor; +import org.jetbrains.kotlin.descriptors.ConstructorDescriptor; +import org.jetbrains.kotlin.descriptors.ScriptDescriptor; +import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor; import org.jetbrains.kotlin.name.Name; import org.jetbrains.kotlin.psi.*; import org.jetbrains.kotlin.resolve.BindingContext; @@ -148,8 +153,6 @@ public class ScriptCodegen extends MemberCodegen { ClassDescriptor superclass = DescriptorUtilsKt.getSuperClassNotAny(scriptDescriptor); - List valueParameters = scriptDescriptor.getUnsubstitutedPrimaryConstructor().getValueParameters(); - if (superclass == null) { iv.load(0, classType); iv.invokespecial("java/lang/Object", "", "()V", false); @@ -161,6 +164,7 @@ public class ScriptCodegen extends MemberCodegen { iv.load(0, classType); + List valueParameters = scriptDescriptor.getUnsubstitutedPrimaryConstructor().getValueParameters(); for (Pair superclassParam: superclassParamsMap) { ValueParameterDescriptor valueParam = null; for (ValueParameterDescriptor vpd: valueParameters) { @@ -190,11 +194,11 @@ public class ScriptCodegen extends MemberCodegen { } Type[] argTypes = jvmSignature.getAsmMethod().getArgumentTypes(); - int add = 0; - for (int i = 0; i < valueParameters.size(); i++) { - ValueParameterDescriptor parameter = valueParameters.get(i); - frameMap.enter(parameter, argTypes[i + add]); + List parametersForProperties = getScriptParametersToUseAsProperties(scriptDescriptor); + for (int i = 0; i < parametersForProperties.size(); i++) { + ValueParameterDescriptor parameter = parametersForProperties.get(i); + frameMap.enter(parameter, argTypes[i]); } int offset = 1; @@ -207,7 +211,7 @@ public class ScriptCodegen extends MemberCodegen { iv.putfield(classType.getInternalName(), context.getScriptFieldName(earlierScript), earlierClassType.getDescriptor()); } - for (ValueParameterDescriptor parameter : valueParameters) { + for (ValueParameterDescriptor parameter : parametersForProperties) { Type parameterType = typeMapper.mapType(parameter.getType()); iv.load(0, classType); iv.load(offset, parameterType); @@ -238,7 +242,7 @@ public class ScriptCodegen extends MemberCodegen { classBuilder.newField(NO_ORIGIN, access, context.getScriptFieldName(earlierScript), earlierClassName.getDescriptor(), null, null); } - for (ValueParameterDescriptor parameter : script.getUnsubstitutedPrimaryConstructor().getValueParameters()) { + for (ValueParameterDescriptor parameter : getScriptParametersToUseAsProperties(script)) { Type parameterType = typeMapper.mapType(parameter); int access = ACC_PUBLIC | ACC_FINAL; classBuilder.newField(JvmDeclarationOriginKt.OtherOrigin(parameter), access, parameter.getName().getIdentifier(), parameterType.getDescriptor(), null, null); @@ -255,4 +259,22 @@ public class ScriptCodegen extends MemberCodegen { } } } + + @NotNull + private static List getScriptParametersToUseAsProperties(@NotNull ScriptDescriptor scriptDescriptor) { + List parameters = scriptDescriptor.getUnsubstitutedPrimaryConstructor().getValueParameters(); + final List> superclassParamsMap = scriptDescriptor.getScriptParametersToPassToSuperclass(); + + return CollectionsKt.filter(parameters, new Function1() { + @Override + public Boolean invoke(ValueParameterDescriptor descriptor) { + for (Pair superclassParam : superclassParamsMap) { + if (descriptor.getName().equals(superclassParam.getFirst())) { + return false; + } + } + return true; + } + }); + } } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyScriptClassMemberScope.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyScriptClassMemberScope.kt index 7bbea638fb0..63cfffddd9f 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyScriptClassMemberScope.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyScriptClassMemberScope.kt @@ -76,8 +76,9 @@ class LazyScriptClassMemberScope( override fun createPropertiesFromPrimaryConstructorParameters(name: Name, result: MutableSet) { val primaryConstructor = getPrimaryConstructor()!! + val parametersToPassToSuperclass = scriptDescriptor.scriptParametersToPassToSuperclass.map { it.first } for (valueParameterDescriptor in primaryConstructor.valueParameters) { - if (name == valueParameterDescriptor.name) { + if (name == valueParameterDescriptor.name && name !in parametersToPassToSuperclass) { result.add(createPropertyFromScriptParameter(scriptDescriptor, valueParameterDescriptor)) } } diff --git a/compiler/testData/script/overriden_parameter.kts b/compiler/testData/script/overriden_parameter.kts new file mode 100644 index 00000000000..fb2a041c2b8 --- /dev/null +++ b/compiler/testData/script/overriden_parameter.kts @@ -0,0 +1,4 @@ +// this script expected parameter num: Int + +val test = num + 10 +System.out.println(test) \ No newline at end of file diff --git a/compiler/testData/script/without_params.kts b/compiler/testData/script/without_params.kts new file mode 100644 index 00000000000..eb626eabbdb --- /dev/null +++ b/compiler/testData/script/without_params.kts @@ -0,0 +1,2 @@ +val num = 10 // check that we could declare property with the name as in the super class +System.out.println(num) \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/kotlin/scripts/ScriptTest2.kt b/compiler/tests/org/jetbrains/kotlin/scripts/ScriptTest2.kt index 1f22196a518..7631cef602e 100644 --- a/compiler/tests/org/jetbrains/kotlin/scripts/ScriptTest2.kt +++ b/compiler/tests/org/jetbrains/kotlin/scripts/ScriptTest2.kt @@ -76,6 +76,20 @@ class ScriptTest2 { aClass!!.getConstructor(Integer.TYPE).newInstance(4) } + @Test + fun testScriptWithoutParams() { + val aClass = compileScript("without_params.kts", ScriptWithoutParams::class, null) + Assert.assertNotNull(aClass) + aClass!!.getConstructor(Integer.TYPE).newInstance(4) + } + + @Test + fun testScriptWithOverridenParam() { + val aClass = compileScript("overriden_parameter.kts", ScriptBaseClassWithOverridenProperty::class, null) + Assert.assertNotNull(aClass) + aClass!!.getConstructor(Integer.TYPE).newInstance(4) + } + private fun compileScript( scriptPath: String, scriptBase: KClass, @@ -167,17 +181,27 @@ class TestKotlinScriptDependenciesResolver : ScriptDependenciesResolver { @ScriptTemplateDefinition( scriptFilePattern =".*\\.kts", resolver = TestKotlinScriptDependenciesResolver::class) -abstract class ScriptWithIntParam(num: Int) +abstract class ScriptWithIntParam(val num: Int) @ScriptTemplateDefinition( scriptFilePattern =".*\\.kts", resolver = TestKotlinScriptDependenciesResolver::class) -abstract class ScriptWithClassParam(param: TestParamClass) +abstract class ScriptWithClassParam(val param: TestParamClass) @ScriptTemplateDefinition( scriptFilePattern =".*\\.kts", resolver = TestKotlinScriptDependenciesResolver::class) -abstract class ScriptWithBaseClass(num: Int, passthrough: Int) : TestDSLClassWithParam(passthrough) +abstract class ScriptWithBaseClass(val num: Int, passthrough: Int) : TestDSLClassWithParam(passthrough) + +@ScriptTemplateDefinition( + scriptFilePattern =".*\\.kts", + resolver = TestKotlinScriptDependenciesResolver::class) +abstract class ScriptWithoutParams(num: Int) + +@ScriptTemplateDefinition( + scriptFilePattern =".*\\.kts", + resolver = TestKotlinScriptDependenciesResolver::class) +abstract class ScriptBaseClassWithOverridenProperty(override val num: Int) : TestClassWithOverridableProperty(num) @Target(AnnotationTarget.FILE) @Retention(AnnotationRetention.RUNTIME) diff --git a/compiler/tests/org/jetbrains/kotlin/scripts/TestScriptDsl.kt b/compiler/tests/org/jetbrains/kotlin/scripts/TestScriptDsl.kt index 129f4533844..e23b7ebb533 100644 --- a/compiler/tests/org/jetbrains/kotlin/scripts/TestScriptDsl.kt +++ b/compiler/tests/org/jetbrains/kotlin/scripts/TestScriptDsl.kt @@ -29,3 +29,5 @@ fun TestDSLInterface.fibCombine(f: (Int) -> Int, n: Int) = if (n < 2) 1 else f(n open class TestDSLClassWithParam(val offset: Int) fun TestDSLClassWithParam.fibCombine(f: (Int) -> Int, n: Int) = if (n < 2) offset else f(n - 1) + f(n - 2) + +open class TestClassWithOverridableProperty(open val num: Int) \ No newline at end of file