Do not generate properties from script constructor
From now all script parameter properties are generated by template class
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2010-2015 JetBrains s.r.o.
|
* Copyright 2010-2016 JetBrains s.r.o.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -17,18 +17,13 @@
|
|||||||
package org.jetbrains.kotlin.codegen;
|
package org.jetbrains.kotlin.codegen;
|
||||||
|
|
||||||
import kotlin.Pair;
|
import kotlin.Pair;
|
||||||
import kotlin.collections.CollectionsKt;
|
|
||||||
import kotlin.Unit;
|
|
||||||
import kotlin.jvm.functions.Function0;
|
import kotlin.jvm.functions.Function0;
|
||||||
import kotlin.jvm.functions.Function1;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.kotlin.codegen.context.CodegenContext;
|
import org.jetbrains.kotlin.codegen.context.CodegenContext;
|
||||||
import org.jetbrains.kotlin.codegen.context.MethodContext;
|
import org.jetbrains.kotlin.codegen.context.MethodContext;
|
||||||
import org.jetbrains.kotlin.codegen.context.ScriptContext;
|
import org.jetbrains.kotlin.codegen.context.ScriptContext;
|
||||||
import org.jetbrains.kotlin.codegen.serialization.JvmSerializerExtension;
|
|
||||||
import org.jetbrains.kotlin.codegen.state.GenerationState;
|
import org.jetbrains.kotlin.codegen.state.GenerationState;
|
||||||
import org.jetbrains.kotlin.descriptors.*;
|
import org.jetbrains.kotlin.descriptors.*;
|
||||||
import org.jetbrains.kotlin.load.kotlin.header.KotlinClassHeader;
|
|
||||||
import org.jetbrains.kotlin.name.Name;
|
import org.jetbrains.kotlin.name.Name;
|
||||||
import org.jetbrains.kotlin.psi.*;
|
import org.jetbrains.kotlin.psi.*;
|
||||||
import org.jetbrains.kotlin.resolve.BindingContext;
|
import org.jetbrains.kotlin.resolve.BindingContext;
|
||||||
@@ -36,19 +31,14 @@ import org.jetbrains.kotlin.resolve.descriptorUtil.DescriptorUtilsKt;
|
|||||||
import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin;
|
import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin;
|
||||||
import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOriginKt;
|
import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOriginKt;
|
||||||
import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodSignature;
|
import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodSignature;
|
||||||
import org.jetbrains.kotlin.serialization.DescriptorSerializer;
|
|
||||||
import org.jetbrains.kotlin.serialization.ProtoBuf;
|
|
||||||
import org.jetbrains.kotlin.types.KotlinType;
|
import org.jetbrains.kotlin.types.KotlinType;
|
||||||
import org.jetbrains.org.objectweb.asm.AnnotationVisitor;
|
|
||||||
import org.jetbrains.org.objectweb.asm.MethodVisitor;
|
import org.jetbrains.org.objectweb.asm.MethodVisitor;
|
||||||
import org.jetbrains.org.objectweb.asm.Type;
|
import org.jetbrains.org.objectweb.asm.Type;
|
||||||
import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter;
|
import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import static org.jetbrains.kotlin.codegen.AsmUtil.writeAnnotationData;
|
|
||||||
import static org.jetbrains.kotlin.resolve.jvm.AsmTypes.OBJECT_TYPE;
|
import static org.jetbrains.kotlin.resolve.jvm.AsmTypes.OBJECT_TYPE;
|
||||||
import static org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin.NO_ORIGIN;
|
import static org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin.NO_ORIGIN;
|
||||||
import static org.jetbrains.org.objectweb.asm.Opcodes.*;
|
import static org.jetbrains.org.objectweb.asm.Opcodes.*;
|
||||||
@@ -110,7 +100,7 @@ public class ScriptCodegen extends MemberCodegen<KtScript> {
|
|||||||
@Override
|
@Override
|
||||||
protected void generateBody() {
|
protected void generateBody() {
|
||||||
genMembers();
|
genMembers();
|
||||||
genFieldsForParameters(scriptDescriptor, v);
|
genFieldsForParameters(v);
|
||||||
genConstructor(scriptDescriptor, v,
|
genConstructor(scriptDescriptor, v,
|
||||||
context.intoFunction(scriptDescriptor.getUnsubstitutedPrimaryConstructor()));
|
context.intoFunction(scriptDescriptor.getUnsubstitutedPrimaryConstructor()));
|
||||||
}
|
}
|
||||||
@@ -199,14 +189,6 @@ public class ScriptCodegen extends MemberCodegen<KtScript> {
|
|||||||
frameMap.enter(importedScript, OBJECT_TYPE);
|
frameMap.enter(importedScript, OBJECT_TYPE);
|
||||||
}
|
}
|
||||||
|
|
||||||
Type[] argTypes = jvmSignature.getAsmMethod().getArgumentTypes();
|
|
||||||
|
|
||||||
List<ValueParameterDescriptor> parametersForProperties = getScriptParametersToUseAsProperties(scriptDescriptor);
|
|
||||||
for (int i = 0; i < parametersForProperties.size(); i++) {
|
|
||||||
ValueParameterDescriptor parameter = parametersForProperties.get(i);
|
|
||||||
frameMap.enter(parameter, argTypes[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
int offset = 1;
|
int offset = 1;
|
||||||
|
|
||||||
for (ScriptDescriptor earlierScript : context.getEarlierScripts()) {
|
for (ScriptDescriptor earlierScript : context.getEarlierScripts()) {
|
||||||
@@ -217,14 +199,6 @@ public class ScriptCodegen extends MemberCodegen<KtScript> {
|
|||||||
iv.putfield(classType.getInternalName(), context.getScriptFieldName(earlierScript), earlierClassType.getDescriptor());
|
iv.putfield(classType.getInternalName(), context.getScriptFieldName(earlierScript), earlierClassType.getDescriptor());
|
||||||
}
|
}
|
||||||
|
|
||||||
for (ValueParameterDescriptor parameter : parametersForProperties) {
|
|
||||||
Type parameterType = typeMapper.mapType(parameter.getType());
|
|
||||||
iv.load(0, classType);
|
|
||||||
iv.load(offset, parameterType);
|
|
||||||
offset += parameterType.getSize();
|
|
||||||
iv.putfield(classType.getInternalName(), parameter.getName().getIdentifier(), parameterType.getDescriptor());
|
|
||||||
}
|
|
||||||
|
|
||||||
final ExpressionCodegen codegen = new ExpressionCodegen(mv, frameMap, Type.VOID_TYPE, methodContext, state, this);
|
final ExpressionCodegen codegen = new ExpressionCodegen(mv, frameMap, Type.VOID_TYPE, methodContext, state, this);
|
||||||
|
|
||||||
generateInitializers(new Function0<ExpressionCodegen>() {
|
generateInitializers(new Function0<ExpressionCodegen>() {
|
||||||
@@ -241,18 +215,12 @@ public class ScriptCodegen extends MemberCodegen<KtScript> {
|
|||||||
mv.visitEnd();
|
mv.visitEnd();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void genFieldsForParameters(@NotNull ScriptDescriptor script, @NotNull ClassBuilder classBuilder) {
|
private void genFieldsForParameters(@NotNull ClassBuilder classBuilder) {
|
||||||
for (ScriptDescriptor earlierScript : context.getEarlierScripts()) {
|
for (ScriptDescriptor earlierScript : context.getEarlierScripts()) {
|
||||||
Type earlierClassName = typeMapper.mapType(earlierScript);
|
Type earlierClassName = typeMapper.mapType(earlierScript);
|
||||||
int access = ACC_PUBLIC | ACC_FINAL;
|
int access = ACC_PUBLIC | ACC_FINAL;
|
||||||
classBuilder.newField(NO_ORIGIN, access, context.getScriptFieldName(earlierScript), earlierClassName.getDescriptor(), null, null);
|
classBuilder.newField(NO_ORIGIN, access, context.getScriptFieldName(earlierScript), earlierClassName.getDescriptor(), null, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void genMembers() {
|
private void genMembers() {
|
||||||
@@ -265,22 +233,4 @@ public class ScriptCodegen extends MemberCodegen<KtScript> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
|
||||||
private static List<ValueParameterDescriptor> getScriptParametersToUseAsProperties(@NotNull ScriptDescriptor scriptDescriptor) {
|
|
||||||
List<ValueParameterDescriptor> parameters = scriptDescriptor.getUnsubstitutedPrimaryConstructor().getValueParameters();
|
|
||||||
final List<Pair<Name, KotlinType>> superclassParamsMap = scriptDescriptor.getScriptParametersToPassToSuperclass();
|
|
||||||
|
|
||||||
return CollectionsKt.filter(parameters, new Function1<ValueParameterDescriptor, Boolean>() {
|
|
||||||
@Override
|
|
||||||
public Boolean invoke(ValueParameterDescriptor descriptor) {
|
|
||||||
for (Pair<Name, KotlinType> superclassParam : superclassParamsMap) {
|
|
||||||
if (descriptor.getName().equals(superclassParam.getFirst())) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
-51
@@ -19,16 +19,11 @@ package org.jetbrains.kotlin.resolve.lazy.descriptors
|
|||||||
import org.jetbrains.kotlin.descriptors.*
|
import org.jetbrains.kotlin.descriptors.*
|
||||||
import org.jetbrains.kotlin.descriptors.annotations.Annotations
|
import org.jetbrains.kotlin.descriptors.annotations.Annotations
|
||||||
import org.jetbrains.kotlin.descriptors.impl.ClassConstructorDescriptorImpl
|
import org.jetbrains.kotlin.descriptors.impl.ClassConstructorDescriptorImpl
|
||||||
import org.jetbrains.kotlin.descriptors.impl.PropertyDescriptorImpl
|
|
||||||
import org.jetbrains.kotlin.descriptors.impl.ValueParameterDescriptorImpl
|
import org.jetbrains.kotlin.descriptors.impl.ValueParameterDescriptorImpl
|
||||||
import org.jetbrains.kotlin.incremental.components.LookupLocation
|
|
||||||
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
|
|
||||||
import org.jetbrains.kotlin.incremental.record
|
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
import org.jetbrains.kotlin.resolve.BindingTrace
|
import org.jetbrains.kotlin.resolve.BindingTrace
|
||||||
import org.jetbrains.kotlin.resolve.lazy.ResolveSession
|
import org.jetbrains.kotlin.resolve.lazy.ResolveSession
|
||||||
import org.jetbrains.kotlin.resolve.lazy.declarations.ClassMemberDeclarationProvider
|
import org.jetbrains.kotlin.resolve.lazy.declarations.ClassMemberDeclarationProvider
|
||||||
import org.jetbrains.kotlin.utils.toReadOnlyList
|
|
||||||
|
|
||||||
class LazyScriptClassMemberScope(
|
class LazyScriptClassMemberScope(
|
||||||
resolveSession: ResolveSession,
|
resolveSession: ResolveSession,
|
||||||
@@ -65,52 +60,6 @@ class LazyScriptClassMemberScope(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun computeExtraDescriptors(location: LookupLocation): Collection<DeclarationDescriptor> {
|
|
||||||
return (super.computeExtraDescriptors(location)
|
|
||||||
+ getPropertiesForScriptParameters()).toReadOnlyList()
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun getPropertiesForScriptParameters() = getPrimaryConstructor()!!.valueParameters.flatMap {
|
|
||||||
getContributedVariables(it.name, NoLookupLocation.FOR_SCRIPT)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun createPropertiesFromPrimaryConstructorParameters(name: Name, result: MutableSet<PropertyDescriptor>) {
|
override fun createPropertiesFromPrimaryConstructorParameters(name: Name, result: MutableSet<PropertyDescriptor>) {
|
||||||
val primaryConstructor = getPrimaryConstructor()!!
|
|
||||||
val parametersToPassToSuperclass = scriptDescriptor.scriptParametersToPassToSuperclass.map { it.first }
|
|
||||||
for (valueParameterDescriptor in primaryConstructor.valueParameters) {
|
|
||||||
if (name == valueParameterDescriptor.name && name !in parametersToPassToSuperclass) {
|
|
||||||
result.add(createPropertyFromScriptParameter(scriptDescriptor, valueParameterDescriptor))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun createPropertyFromScriptParameter(
|
|
||||||
scriptDescriptor: ScriptDescriptor,
|
|
||||||
parameter: ValueParameterDescriptor
|
|
||||||
): PropertyDescriptor {
|
|
||||||
val propertyDescriptor = PropertyDescriptorImpl.create(
|
|
||||||
scriptDescriptor,
|
|
||||||
Annotations.EMPTY,
|
|
||||||
Modality.FINAL,
|
|
||||||
Visibilities.PUBLIC,
|
|
||||||
false,
|
|
||||||
parameter.name,
|
|
||||||
CallableMemberDescriptor.Kind.DECLARATION,
|
|
||||||
SourceElement.NO_SOURCE,
|
|
||||||
/* lateInit = */ false,
|
|
||||||
/* isConst = */ false
|
|
||||||
)
|
|
||||||
propertyDescriptor.setType(
|
|
||||||
parameter.type,
|
|
||||||
listOf(),
|
|
||||||
scriptDescriptor.thisAsReceiverParameter,
|
|
||||||
null as ReceiverParameterDescriptor?
|
|
||||||
)
|
|
||||||
propertyDescriptor.initialize(null, null)
|
|
||||||
return propertyDescriptor
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun recordLookup(name: Name, from: LookupLocation) {
|
|
||||||
c.lookupTracker.record(from, thisDescriptor, name)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+11
@@ -0,0 +1,11 @@
|
|||||||
|
@file:DependsOn("@{runtime}")
|
||||||
|
|
||||||
|
fun main() {
|
||||||
|
error("my error")
|
||||||
|
}
|
||||||
|
|
||||||
|
fun a() {
|
||||||
|
main()
|
||||||
|
}
|
||||||
|
|
||||||
|
a()
|
||||||
@@ -21,12 +21,9 @@ import org.jetbrains.kotlin.descriptors.ScriptDescriptor
|
|||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
import org.jetbrains.kotlin.psi.KtScript
|
import org.jetbrains.kotlin.psi.KtScript
|
||||||
import org.jetbrains.kotlin.script.*
|
import org.jetbrains.kotlin.script.*
|
||||||
import org.jetbrains.kotlin.types.KotlinType
|
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.net.URL
|
import java.net.URL
|
||||||
import java.net.URLClassLoader
|
import java.net.URLClassLoader
|
||||||
import java.util.concurrent.Future
|
|
||||||
import kotlin.reflect.KClass
|
|
||||||
|
|
||||||
abstract class BaseScriptDefinition (val extension: String, val cp: List<File>? = null) : KotlinScriptDefinition {
|
abstract class BaseScriptDefinition (val extension: String, val cp: List<File>? = null) : KotlinScriptDefinition {
|
||||||
override val name = "Test Kotlin Script"
|
override val name = "Test Kotlin Script"
|
||||||
@@ -38,7 +35,7 @@ abstract class BaseScriptDefinition (val extension: String, val cp: List<File>?
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
open class SimpleParamsWithClasspathTestScriptDefinition(extension: String, val parameters: List<ScriptParameter>, classpath: List<File>? = null, val extraDependencies: KotlinScriptExternalDependencies? = null)
|
open class SimpleParamsWithClasspathTestScriptDefinition(extension: String, val parameters: List<ScriptParameter>, classpath: List<File>? = null)
|
||||||
: BaseScriptDefinition(extension, classpath)
|
: BaseScriptDefinition(extension, classpath)
|
||||||
{
|
{
|
||||||
override fun getScriptParameters(scriptDescriptor: ScriptDescriptor) = parameters
|
override fun getScriptParameters(scriptDescriptor: ScriptDescriptor) = parameters
|
||||||
@@ -46,43 +43,6 @@ open class SimpleParamsWithClasspathTestScriptDefinition(extension: String, val
|
|||||||
|
|
||||||
open class SimpleParamsTestScriptDefinition(extension: String, parameters: List<ScriptParameter>) : SimpleParamsWithClasspathTestScriptDefinition(extension, parameters)
|
open class SimpleParamsTestScriptDefinition(extension: String, parameters: List<ScriptParameter>) : SimpleParamsWithClasspathTestScriptDefinition(extension, parameters)
|
||||||
|
|
||||||
class ReflectedParamClassTestScriptDefinition(extension: String, val paramName: String, val parameter: KClass<out Any>, classpath: List<File>? = null)
|
|
||||||
: BaseScriptDefinition(extension, classpath)
|
|
||||||
{
|
|
||||||
override fun getScriptParameters(scriptDescriptor: ScriptDescriptor) =
|
|
||||||
listOf(makeReflectedClassScriptParameter(scriptDescriptor, Name.identifier(paramName), parameter))
|
|
||||||
}
|
|
||||||
|
|
||||||
open class ReflectedSuperclassTestScriptDefinition(extension: String, parameters: List<ScriptParameter>, val superclass: KClass<out Any>, classpath: List<File>? = null)
|
|
||||||
: SimpleParamsWithClasspathTestScriptDefinition(extension, parameters, classpath)
|
|
||||||
{
|
|
||||||
override fun getScriptSupertypes(scriptDescriptor: ScriptDescriptor): List<KotlinType> =
|
|
||||||
listOf(getKotlinType(scriptDescriptor, superclass))
|
|
||||||
}
|
|
||||||
|
|
||||||
class ReflectedSuperclassWithParamsTestScriptDefinition(extension: String,
|
|
||||||
parameters: List<ScriptParameter>,
|
|
||||||
superclass: KClass<out Any>,
|
|
||||||
val superclassParameters: List<ScriptParameter>,
|
|
||||||
classpath: List<File>? = null)
|
|
||||||
: ReflectedSuperclassTestScriptDefinition(extension, parameters, superclass, classpath)
|
|
||||||
{
|
|
||||||
override fun getScriptParametersToPassToSuperclass(scriptDescriptor: ScriptDescriptor): List<Name> =
|
|
||||||
superclassParameters.map { it.name }
|
|
||||||
}
|
|
||||||
|
|
||||||
class StandardWithClasspathScriptDefinition(extension: String, classpath: List<File>? = null)
|
|
||||||
: BaseScriptDefinition(extension, classpath)
|
|
||||||
{
|
|
||||||
override fun getScriptParameters(scriptDescriptor: ScriptDescriptor) =
|
|
||||||
StandardScriptDefinition.getScriptParameters(scriptDescriptor)
|
|
||||||
}
|
|
||||||
|
|
||||||
class SimpleScriptExtraDependencies(
|
|
||||||
override val classpath: Iterable<File>,
|
|
||||||
override val imports: List<String> = emptyList()
|
|
||||||
) : KotlinScriptExternalDependencies
|
|
||||||
|
|
||||||
fun classpathFromProperty(): List<File> =
|
fun classpathFromProperty(): List<File> =
|
||||||
System.getProperty("java.class.path")?.let {
|
System.getProperty("java.class.path")?.let {
|
||||||
it.split(String.format("\\%s", File.pathSeparatorChar).toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()
|
it.split(String.format("\\%s", File.pathSeparatorChar).toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2010-2015 JetBrains s.r.o.
|
* Copyright 2010-2016 JetBrains s.r.o.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -17,8 +17,6 @@
|
|||||||
package org.jetbrains.kotlin.scripts
|
package org.jetbrains.kotlin.scripts
|
||||||
|
|
||||||
import com.intellij.openapi.util.Disposer
|
import com.intellij.openapi.util.Disposer
|
||||||
import junit.framework.TestCase
|
|
||||||
import org.jetbrains.kotlin.builtins.DefaultBuiltIns
|
|
||||||
import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys
|
import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys
|
||||||
import org.jetbrains.kotlin.cli.common.messages.*
|
import org.jetbrains.kotlin.cli.common.messages.*
|
||||||
import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles
|
import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles
|
||||||
@@ -27,9 +25,7 @@ import org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler
|
|||||||
import org.jetbrains.kotlin.codegen.CompilationException
|
import org.jetbrains.kotlin.codegen.CompilationException
|
||||||
import org.jetbrains.kotlin.config.JVMConfigurationKeys
|
import org.jetbrains.kotlin.config.JVMConfigurationKeys
|
||||||
import org.jetbrains.kotlin.config.addKotlinSourceRoot
|
import org.jetbrains.kotlin.config.addKotlinSourceRoot
|
||||||
import org.jetbrains.kotlin.name.Name
|
|
||||||
import org.jetbrains.kotlin.script.KotlinScriptDefinition
|
import org.jetbrains.kotlin.script.KotlinScriptDefinition
|
||||||
import org.jetbrains.kotlin.script.ScriptParameter
|
|
||||||
import org.jetbrains.kotlin.script.StandardScriptDefinition
|
import org.jetbrains.kotlin.script.StandardScriptDefinition
|
||||||
import org.jetbrains.kotlin.test.ConfigurationKind
|
import org.jetbrains.kotlin.test.ConfigurationKind
|
||||||
import org.jetbrains.kotlin.test.KotlinTestUtils
|
import org.jetbrains.kotlin.test.KotlinTestUtils
|
||||||
@@ -39,17 +35,9 @@ import org.jetbrains.kotlin.utils.PathUtil
|
|||||||
import org.junit.Assert
|
import org.junit.Assert
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.lang.reflect.InvocationTargetException
|
|
||||||
import java.net.URLClassLoader
|
import java.net.URLClassLoader
|
||||||
|
|
||||||
class ScriptTest : KtUsefulTestCase() {
|
class ScriptTest : KtUsefulTestCase() {
|
||||||
@Test
|
|
||||||
fun testScriptWithParam() {
|
|
||||||
val aClass = compileScript("fib.kts", SimpleParamsTestScriptDefinition(".kts", numIntParam()))
|
|
||||||
Assert.assertNotNull(aClass)
|
|
||||||
aClass!!.getConstructor(Integer.TYPE).newInstance(4)
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun testStandardScriptWithParams() {
|
fun testStandardScriptWithParams() {
|
||||||
val aClass = compileScript("fib_std.kts", StandardScriptDefinition)
|
val aClass = compileScript("fib_std.kts", StandardScriptDefinition)
|
||||||
@@ -74,108 +62,13 @@ class ScriptTest : KtUsefulTestCase() {
|
|||||||
Assert.assertNotNull(aClass)
|
Assert.assertNotNull(aClass)
|
||||||
val anObj = KotlinToJVMBytecodeCompiler.tryConstructClassPub(aClass!!, emptyList())
|
val anObj = KotlinToJVMBytecodeCompiler.tryConstructClassPub(aClass!!, emptyList())
|
||||||
Assert.assertNotNull(anObj)
|
Assert.assertNotNull(anObj)
|
||||||
val savedClassLoader = URLClassLoader(arrayOf(tmpdir.toURI().toURL()))
|
val savedClassLoader = URLClassLoader(arrayOf(tmpdir.toURI().toURL()), aClass.classLoader)
|
||||||
val aClassSaved = savedClassLoader.loadClass(aClass.name)
|
val aClassSaved = savedClassLoader.loadClass(aClass.name)
|
||||||
Assert.assertNotNull(aClassSaved)
|
Assert.assertNotNull(aClassSaved)
|
||||||
val anObjSaved = KotlinToJVMBytecodeCompiler.tryConstructClassPub(aClassSaved!!, emptyList())
|
val anObjSaved = KotlinToJVMBytecodeCompiler.tryConstructClassPub(aClassSaved!!, emptyList())
|
||||||
Assert.assertNotNull(anObjSaved)
|
Assert.assertNotNull(anObjSaved)
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
|
||||||
fun testScriptWithParamConversion() {
|
|
||||||
val aClass = compileScript("fib.kts", SimpleParamsTestScriptDefinition(".kts", numIntParam()))
|
|
||||||
Assert.assertNotNull(aClass)
|
|
||||||
val anObj = KotlinToJVMBytecodeCompiler.tryConstructClassPub(aClass!!, listOf("4"))
|
|
||||||
Assert.assertNotNull(anObj)
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun testScriptWithPackage() {
|
|
||||||
val aClass = compileScript("fib.pkg.kts", SimpleParamsTestScriptDefinition(".kts", numIntParam()))
|
|
||||||
Assert.assertNotNull(aClass)
|
|
||||||
aClass!!.getConstructor(Integer.TYPE).newInstance(4)
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun testScriptWithScriptDefinition() {
|
|
||||||
val aClass = compileScript("fib.kts", SimpleParamsTestScriptDefinition(".kts", numIntParam()))
|
|
||||||
Assert.assertNotNull(aClass)
|
|
||||||
aClass!!.getConstructor(Integer.TYPE).newInstance(4)
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun testScriptWithClassParameter() {
|
|
||||||
val aClass = compileScript("fib_cp.kts", ReflectedParamClassTestScriptDefinition(".kts", "param", TestParamClass::class), runIsolated = false)
|
|
||||||
Assert.assertNotNull(aClass)
|
|
||||||
aClass!!.getConstructor(TestParamClass::class.java).newInstance(TestParamClass(4))
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun testScriptWithBaseClass() {
|
|
||||||
val aClass = compileScript("fib_dsl.kts", ReflectedSuperclassTestScriptDefinition(".kts", numIntParam(), TestDSLClass::class), runIsolated = false)
|
|
||||||
Assert.assertNotNull(aClass)
|
|
||||||
aClass!!.getConstructor(Integer.TYPE).newInstance(4)
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun testScriptWithBaseClassWithParam() {
|
|
||||||
val aClass = compileScript("fib_dsl.kts", ReflectedSuperclassWithParamsTestScriptDefinition(".kts", numIntParam() + numIntParam("passthrough"), TestDSLClassWithParam::class, numIntParam("passthrough")), runIsolated = false)
|
|
||||||
Assert.assertNotNull(aClass)
|
|
||||||
aClass!!.getConstructor(Integer.TYPE, Integer.TYPE).newInstance(4, 1)
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun testScriptWithInterface() {
|
|
||||||
val aClass = compileScript("fib_dsl.kts", ReflectedSuperclassTestScriptDefinition(".kts", numIntParam(), TestDSLInterface::class), runIsolated = false)
|
|
||||||
Assert.assertNotNull(aClass)
|
|
||||||
aClass!!.getConstructor(Integer.TYPE).newInstance(4)
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun testScriptWithClasspath() {
|
|
||||||
val aClass1 = compileScript("fib_ext.kts", SimpleParamsWithClasspathTestScriptDefinition(".kts", numIntParam(), classpath = emptyList()), runIsolated = true, suppressOutput = true)
|
|
||||||
Assert.assertNull(aClass1)
|
|
||||||
|
|
||||||
val cp = classpathFromClassloader(ScriptTest::class.java.classLoader).filter { it.name.contains("kotlin-runtime") || it.name.contains("junit") }
|
|
||||||
Assert.assertFalse(cp.isEmpty())
|
|
||||||
|
|
||||||
val aClass2 = compileScript("fib_ext.kts", SimpleParamsWithClasspathTestScriptDefinition(".kts", numIntParam(), classpath = cp), runIsolated = true)
|
|
||||||
Assert.assertNotNull(aClass2)
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun testScriptWithExtraImports() {
|
|
||||||
val aClass1 = compileScript("fib_ext.kts", SimpleParamsWithClasspathTestScriptDefinition(".kts", numIntParam(), classpath = emptyList()), runIsolated = true, suppressOutput = true)
|
|
||||||
Assert.assertNull(aClass1)
|
|
||||||
|
|
||||||
val cp = classpathFromClassloader(ScriptTest::class.java.classLoader).filter { it.name.contains("kotlin-runtime") || it.name.contains("junit") }
|
|
||||||
Assert.assertFalse(cp.isEmpty())
|
|
||||||
|
|
||||||
val aClass2 = compileScript("fib_ext.kts", SimpleParamsWithClasspathTestScriptDefinition(".kts", numIntParam(), classpath = cp, extraDependencies = SimpleScriptExtraDependencies(cp)), runIsolated = true)
|
|
||||||
Assert.assertNotNull(aClass2)
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun testSmokeScriptException() {
|
|
||||||
val aClass = compileSmokeTestScript(
|
|
||||||
"scriptException/script.kts",
|
|
||||||
StandardWithClasspathScriptDefinition(
|
|
||||||
".kts",
|
|
||||||
listOf("dependencies/bootstrap-compiler/Kotlin/kotlinc/lib/kotlin-runtime.jar",
|
|
||||||
"dependencies/bootstrap-compiler/Kotlin/kotlinc/lib/kotlin-reflect.jar")
|
|
||||||
.map { File(it) }))
|
|
||||||
Assert.assertNotNull(aClass)
|
|
||||||
var exceptionThrown = false
|
|
||||||
try {
|
|
||||||
KotlinToJVMBytecodeCompiler.tryConstructClassPub(aClass!!, emptyList())
|
|
||||||
}
|
|
||||||
catch (e: InvocationTargetException) {
|
|
||||||
Assert.assertTrue(e.cause is IllegalStateException)
|
|
||||||
exceptionThrown = true
|
|
||||||
}
|
|
||||||
Assert.assertTrue(exceptionThrown)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun compileScript(
|
private fun compileScript(
|
||||||
scriptPath: String,
|
scriptPath: String,
|
||||||
scriptDefinition: KotlinScriptDefinition,
|
scriptDefinition: KotlinScriptDefinition,
|
||||||
@@ -184,14 +77,6 @@ class ScriptTest : KtUsefulTestCase() {
|
|||||||
saveClassesDir: File? = null): Class<*>? =
|
saveClassesDir: File? = null): Class<*>? =
|
||||||
compileScriptImpl("compiler/testData/script/" + scriptPath, scriptDefinition, runIsolated, suppressOutput, saveClassesDir)
|
compileScriptImpl("compiler/testData/script/" + scriptPath, scriptDefinition, runIsolated, suppressOutput, saveClassesDir)
|
||||||
|
|
||||||
private fun compileSmokeTestScript(
|
|
||||||
scriptPath: String,
|
|
||||||
scriptDefinition: KotlinScriptDefinition,
|
|
||||||
runIsolated: Boolean = true,
|
|
||||||
suppressOutput: Boolean = false,
|
|
||||||
saveClassesDir: File? = null): Class<*>? =
|
|
||||||
compileScriptImpl("compiler/testData/integration/smoke/" + scriptPath, scriptDefinition, runIsolated, suppressOutput, saveClassesDir)
|
|
||||||
|
|
||||||
private fun compileScriptImpl(
|
private fun compileScriptImpl(
|
||||||
scriptPath: String,
|
scriptPath: String,
|
||||||
scriptDefinition: KotlinScriptDefinition,
|
scriptDefinition: KotlinScriptDefinition,
|
||||||
@@ -235,10 +120,6 @@ class ScriptTest : KtUsefulTestCase() {
|
|||||||
Disposer.dispose(rootDisposable)
|
Disposer.dispose(rootDisposable)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun numIntParam(name: String = "num"): List<ScriptParameter> {
|
|
||||||
return listOf(ScriptParameter(Name.identifier(name), DefaultBuiltIns.Instance.intType))
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class TestParamClass(val memberNum: Int)
|
class TestParamClass(val memberNum: Int)
|
||||||
@@ -34,6 +34,7 @@ import org.junit.Assert
|
|||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.lang.Exception
|
import java.lang.Exception
|
||||||
|
import java.lang.reflect.InvocationTargetException
|
||||||
import java.net.URLClassLoader
|
import java.net.URLClassLoader
|
||||||
import java.util.concurrent.Future
|
import java.util.concurrent.Future
|
||||||
import kotlin.reflect.KClass
|
import kotlin.reflect.KClass
|
||||||
@@ -134,6 +135,43 @@ class ScriptTest2 {
|
|||||||
aClass!!.getConstructor(Array<String>::class.java).newInstance(arrayOf("4", "other"))
|
aClass!!.getConstructor(Array<String>::class.java).newInstance(arrayOf("4", "other"))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testScriptWithPackage() {
|
||||||
|
val aClass = compileScript("fib.pkg.kts", ScriptWithIntParam::class)
|
||||||
|
Assert.assertNotNull(aClass)
|
||||||
|
aClass!!.getConstructor(Integer.TYPE).newInstance(4)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testScriptWithScriptDefinition() {
|
||||||
|
val aClass = compileScript("fib.kts", ScriptWithIntParam::class)
|
||||||
|
Assert.assertNotNull(aClass)
|
||||||
|
aClass!!.getConstructor(Integer.TYPE).newInstance(4)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testScriptWithParamConversion() {
|
||||||
|
val aClass = compileScript("fib.kts", ScriptWithIntParam::class)
|
||||||
|
Assert.assertNotNull(aClass)
|
||||||
|
val anObj = KotlinToJVMBytecodeCompiler.tryConstructClassPub(aClass!!, listOf("4"))
|
||||||
|
Assert.assertNotNull(anObj)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testSmokeScriptException() {
|
||||||
|
val aClass = compileScript("smoke_exception.kts", ScriptWithArrayParam::class)
|
||||||
|
Assert.assertNotNull(aClass)
|
||||||
|
var exceptionThrown = false
|
||||||
|
try {
|
||||||
|
KotlinToJVMBytecodeCompiler.tryConstructClassPub(aClass!!, emptyList())
|
||||||
|
}
|
||||||
|
catch (e: InvocationTargetException) {
|
||||||
|
Assert.assertTrue(e.cause is IllegalStateException)
|
||||||
|
exceptionThrown = true
|
||||||
|
}
|
||||||
|
Assert.assertTrue(exceptionThrown)
|
||||||
|
}
|
||||||
|
|
||||||
private fun compileScript(
|
private fun compileScript(
|
||||||
scriptPath: String,
|
scriptPath: String,
|
||||||
scriptBase: KClass<out Any>,
|
scriptBase: KClass<out Any>,
|
||||||
|
|||||||
Reference in New Issue
Block a user