Create standard script definition from standard template
Now each script without specified template has a StandardSriptTemplate class as a base one. This allows to generalize script codegen and resolve.
This commit is contained in:
@@ -26,7 +26,6 @@ import org.jetbrains.kotlin.name.FqName
|
|||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
import org.jetbrains.kotlin.parsing.KotlinParserDefinition
|
import org.jetbrains.kotlin.parsing.KotlinParserDefinition
|
||||||
import org.jetbrains.kotlin.psi.KtScript
|
import org.jetbrains.kotlin.psi.KtScript
|
||||||
import org.jetbrains.kotlin.resolve.descriptorUtil.builtIns
|
|
||||||
import org.jetbrains.kotlin.resolve.descriptorUtil.module
|
import org.jetbrains.kotlin.resolve.descriptorUtil.module
|
||||||
import org.jetbrains.kotlin.serialization.deserialization.NotFoundClasses
|
import org.jetbrains.kotlin.serialization.deserialization.NotFoundClasses
|
||||||
import org.jetbrains.kotlin.serialization.deserialization.findNonGenericClassAcrossDependencies
|
import org.jetbrains.kotlin.serialization.deserialization.findNonGenericClassAcrossDependencies
|
||||||
@@ -39,6 +38,7 @@ import kotlin.reflect.KClass
|
|||||||
import kotlin.reflect.KType
|
import kotlin.reflect.KType
|
||||||
import kotlin.reflect.KTypeProjection
|
import kotlin.reflect.KTypeProjection
|
||||||
import kotlin.reflect.KVariance
|
import kotlin.reflect.KVariance
|
||||||
|
import kotlin.script.StandardScriptTemplate
|
||||||
|
|
||||||
interface KotlinScriptDefinition {
|
interface KotlinScriptDefinition {
|
||||||
val name: String get() = "Kotlin Script"
|
val name: String get() = "Kotlin Script"
|
||||||
@@ -78,23 +78,7 @@ class KotlinScriptExternalDependenciesUnion(val dependencies: Iterable<KotlinScr
|
|||||||
|
|
||||||
data class ScriptParameter(val name: Name, val type: KotlinType)
|
data class ScriptParameter(val name: Name, val type: KotlinType)
|
||||||
|
|
||||||
object StandardScriptDefinition : KotlinScriptDefinition {
|
object StandardScriptDefinition : KotlinScriptDefinitionFromTemplate(StandardScriptTemplate::class)
|
||||||
private val ARGS_NAME = Name.identifier("args")
|
|
||||||
|
|
||||||
// NOTE: for now we treat .kts files as if they have 'args: Array<String>' parameter
|
|
||||||
// this is not supposed to be final design
|
|
||||||
override fun getScriptParameters(scriptDescriptor: ScriptDescriptor): List<ScriptParameter> =
|
|
||||||
makeStringListScriptParameters(scriptDescriptor, ARGS_NAME)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun makeStringListScriptParameters(scriptDescriptor: ScriptDescriptor, propertyName: Name): List<ScriptParameter> {
|
|
||||||
val builtIns = scriptDescriptor.builtIns
|
|
||||||
val arrayOfStrings = builtIns.getArrayType(Variance.INVARIANT, builtIns.stringType)
|
|
||||||
return listOf(ScriptParameter(propertyName, arrayOfStrings))
|
|
||||||
}
|
|
||||||
|
|
||||||
fun makeReflectedClassScriptParameter(scriptDescriptor: ScriptDescriptor, propertyName: Name, kClass: KClass<out Any>): ScriptParameter =
|
|
||||||
ScriptParameter(propertyName, getKotlinType(scriptDescriptor, kClass))
|
|
||||||
|
|
||||||
fun getKotlinType(scriptDescriptor: ScriptDescriptor, kClass: KClass<out Any>): KotlinType =
|
fun getKotlinType(scriptDescriptor: ScriptDescriptor, kClass: KClass<out Any>): KotlinType =
|
||||||
getKotlinTypeByFqName(scriptDescriptor,
|
getKotlinTypeByFqName(scriptDescriptor,
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ import kotlin.reflect.KClass
|
|||||||
import kotlin.reflect.memberFunctions
|
import kotlin.reflect.memberFunctions
|
||||||
import kotlin.reflect.primaryConstructor
|
import kotlin.reflect.primaryConstructor
|
||||||
|
|
||||||
data class KotlinScriptDefinitionFromTemplate(val template: KClass<out Any>,
|
open class KotlinScriptDefinitionFromTemplate(val template: KClass<out Any>,
|
||||||
val resolver: ScriptDependenciesResolver? = null,
|
val resolver: ScriptDependenciesResolver? = null,
|
||||||
val scriptFilePattern: String? = null,
|
val scriptFilePattern: String? = null,
|
||||||
val environment: Map<String, Any?>? = null
|
val environment: Map<String, Any?>? = null
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
package
|
package
|
||||||
|
|
||||||
public final class Script {
|
public final class Script : kotlin.script.StandardScriptTemplate {
|
||||||
public constructor Script(/*0*/ args: kotlin.Array<kotlin.String>)
|
public constructor Script(/*0*/ args: kotlin.Array<kotlin.String>)
|
||||||
public final val args: kotlin.Array<kotlin.String>
|
public final override /*1*/ /*fake_override*/ val args: kotlin.Array<kotlin.String>
|
||||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
|||||||
+2
-2
@@ -9,9 +9,9 @@ package test {
|
|||||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
}
|
}
|
||||||
|
|
||||||
public final class A {
|
public final class A : kotlin.script.StandardScriptTemplate {
|
||||||
public constructor A(/*0*/ args: kotlin.Array<kotlin.String>)
|
public constructor A(/*0*/ args: kotlin.Array<kotlin.String>)
|
||||||
public final val args: kotlin.Array<kotlin.String>
|
public final override /*1*/ /*fake_override*/ val args: kotlin.Array<kotlin.String>
|
||||||
public final val x: kotlin.Int = 1
|
public final val x: kotlin.Int = 1
|
||||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
|||||||
+2
-2
@@ -1,8 +1,8 @@
|
|||||||
package
|
package
|
||||||
|
|
||||||
public final class AccessForwardDeclarationInScript {
|
public final class AccessForwardDeclarationInScript : kotlin.script.StandardScriptTemplate {
|
||||||
public constructor AccessForwardDeclarationInScript(/*0*/ args: kotlin.Array<kotlin.String>)
|
public constructor AccessForwardDeclarationInScript(/*0*/ args: kotlin.Array<kotlin.String>)
|
||||||
public final val args: kotlin.Array<kotlin.String>
|
public final override /*1*/ /*fake_override*/ val args: kotlin.Array<kotlin.String>
|
||||||
public final val x: kotlin.Int = 2
|
public final val x: kotlin.Int = 2
|
||||||
public final val y: kotlin.Int = 2
|
public final val y: kotlin.Int = 2
|
||||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
package
|
package
|
||||||
|
|
||||||
public final class ComplexScript {
|
public final class ComplexScript : kotlin.script.StandardScriptTemplate {
|
||||||
public constructor ComplexScript(/*0*/ args: kotlin.Array<kotlin.String>)
|
public constructor ComplexScript(/*0*/ args: kotlin.Array<kotlin.String>)
|
||||||
public final val args: kotlin.Array<kotlin.String>
|
public final override /*1*/ /*fake_override*/ val args: kotlin.Array<kotlin.String>
|
||||||
public final val y: kotlin.Int = 2
|
public final val y: kotlin.Int = 2
|
||||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
public final fun foo(/*0*/ x: kotlin.Int): kotlin.Int
|
public final fun foo(/*0*/ x: kotlin.Int): kotlin.Int
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
package
|
package
|
||||||
|
|
||||||
public final class NestedInnerClass {
|
public final class NestedInnerClass : kotlin.script.StandardScriptTemplate {
|
||||||
public constructor NestedInnerClass(/*0*/ args: kotlin.Array<kotlin.String>)
|
public constructor NestedInnerClass(/*0*/ args: kotlin.Array<kotlin.String>)
|
||||||
public final val args: kotlin.Array<kotlin.String>
|
public final override /*1*/ /*fake_override*/ val args: kotlin.Array<kotlin.String>
|
||||||
public final val property: kotlin.String = ""
|
public final val property: kotlin.String = ""
|
||||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
public final fun function(): kotlin.Int
|
public final fun function(): kotlin.Int
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
package
|
package
|
||||||
|
|
||||||
public final class SimpleScript {
|
public final class SimpleScript : kotlin.script.StandardScriptTemplate {
|
||||||
public constructor SimpleScript(/*0*/ args: kotlin.Array<kotlin.String>)
|
public constructor SimpleScript(/*0*/ args: kotlin.Array<kotlin.String>)
|
||||||
public final val args: kotlin.Array<kotlin.String>
|
public final override /*1*/ /*fake_override*/ val args: kotlin.Array<kotlin.String>
|
||||||
public final val x: kotlin.Int = 1
|
public final val x: kotlin.Int = 1
|
||||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
|||||||
+2
-2
@@ -1,9 +1,9 @@
|
|||||||
package
|
package
|
||||||
|
|
||||||
public final class Imports {
|
public final class Imports : kotlin.script.StandardScriptTemplate {
|
||||||
public constructor Imports(/*0*/ args: kotlin.Array<kotlin.String>)
|
public constructor Imports(/*0*/ args: kotlin.Array<kotlin.String>)
|
||||||
public final val al: java.util.ArrayList<kotlin.String>? = null
|
public final val al: java.util.ArrayList<kotlin.String>? = null
|
||||||
public final val args: kotlin.Array<kotlin.String>
|
public final override /*1*/ /*fake_override*/ val args: kotlin.Array<kotlin.String>
|
||||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
package
|
package
|
||||||
|
|
||||||
public final class TopLevelVariable {
|
public final class TopLevelVariable : kotlin.script.StandardScriptTemplate {
|
||||||
public constructor TopLevelVariable(/*0*/ args: kotlin.Array<kotlin.String>)
|
public constructor TopLevelVariable(/*0*/ args: kotlin.Array<kotlin.String>)
|
||||||
public final val a: kotlin.Int
|
public final val a: kotlin.Int
|
||||||
public final val args: kotlin.Array<kotlin.String>
|
public final override /*1*/ /*fake_override*/ val args: kotlin.Array<kotlin.String>
|
||||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
public final fun foo(): kotlin.Unit
|
public final fun foo(): kotlin.Unit
|
||||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
package
|
package
|
||||||
|
|
||||||
public final class Script {
|
public final class Script : kotlin.script.StandardScriptTemplate {
|
||||||
public constructor Script(/*0*/ args: kotlin.Array<kotlin.String>)
|
public constructor Script(/*0*/ args: kotlin.Array<kotlin.String>)
|
||||||
public final val args: kotlin.Array<kotlin.String>
|
public final override /*1*/ /*fake_override*/ val args: kotlin.Array<kotlin.String>
|
||||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
public final fun main(): kotlin.Boolean
|
public final fun main(): kotlin.Boolean
|
||||||
|
|||||||
Vendored
+2
-2
@@ -1,8 +1,8 @@
|
|||||||
package
|
package
|
||||||
|
|
||||||
public final class Script {
|
public final class Script : kotlin.script.StandardScriptTemplate {
|
||||||
public constructor Script(/*0*/ args: kotlin.Array<kotlin.String>)
|
public constructor Script(/*0*/ args: kotlin.Array<kotlin.String>)
|
||||||
public final val args: kotlin.Array<kotlin.String>
|
public final override /*1*/ /*fake_override*/ val args: kotlin.Array<kotlin.String>
|
||||||
public final val prop: kotlin.Int
|
public final val prop: kotlin.Int
|
||||||
public final val prop2: kotlin.Int
|
public final val prop2: kotlin.Int
|
||||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
|||||||
@@ -37,6 +37,7 @@ import java.lang.Exception
|
|||||||
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
|
||||||
|
import kotlin.script.StandardScriptTemplate
|
||||||
|
|
||||||
// TODO: the contetnts of this file should go into ScriptTest.kt and replace appropriate xml-based functionality,
|
// TODO: the contetnts of this file should go into ScriptTest.kt and replace appropriate xml-based functionality,
|
||||||
// as soon as the the latter is removed from the codebase
|
// as soon as the the latter is removed from the codebase
|
||||||
@@ -126,6 +127,13 @@ class ScriptTest2 {
|
|||||||
aClass!!.getConstructor(Array<Array<in String>>::class.java).newInstance(arrayOf(arrayOf("one"), arrayOf("two")))
|
aClass!!.getConstructor(Array<Array<in String>>::class.java).newInstance(arrayOf(arrayOf("one"), arrayOf("two")))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testScriptWithStandardTemplate() {
|
||||||
|
val aClass = compileScript("fib_std.kts", StandardScriptTemplate::class, runIsolated = false)
|
||||||
|
Assert.assertNotNull(aClass)
|
||||||
|
aClass!!.getConstructor(Array<String>::class.java).newInstance(arrayOf("4", "other"))
|
||||||
|
}
|
||||||
|
|
||||||
private fun compileScript(
|
private fun compileScript(
|
||||||
scriptPath: String,
|
scriptPath: String,
|
||||||
scriptBase: KClass<out Any>,
|
scriptBase: KClass<out Any>,
|
||||||
|
|||||||
+8
@@ -23,11 +23,19 @@ import com.intellij.psi.search.GlobalSearchScope
|
|||||||
import org.jetbrains.kotlin.idea.core.script.KotlinScriptConfigurationManager
|
import org.jetbrains.kotlin.idea.core.script.KotlinScriptConfigurationManager
|
||||||
import org.jetbrains.kotlin.script.KotlinConfigurableScriptDefinition
|
import org.jetbrains.kotlin.script.KotlinConfigurableScriptDefinition
|
||||||
import org.jetbrains.kotlin.script.KotlinScriptDefinitionFromTemplate
|
import org.jetbrains.kotlin.script.KotlinScriptDefinitionFromTemplate
|
||||||
|
import org.jetbrains.kotlin.script.StandardScriptDefinition
|
||||||
import org.jetbrains.kotlin.script.getScriptDefinition
|
import org.jetbrains.kotlin.script.getScriptDefinition
|
||||||
|
import kotlin.script.StandardScriptTemplate
|
||||||
|
|
||||||
class KotlinScriptResolveScopeProvider : ResolveScopeProvider() {
|
class KotlinScriptResolveScopeProvider : ResolveScopeProvider() {
|
||||||
override fun getResolveScope(file: VirtualFile, project: Project): GlobalSearchScope? {
|
override fun getResolveScope(file: VirtualFile, project: Project): GlobalSearchScope? {
|
||||||
val scriptDefinition = getScriptDefinition(file, project) ?: return null
|
val scriptDefinition = getScriptDefinition(file, project) ?: return null
|
||||||
|
|
||||||
|
// This is a workaround for completion in scripts and REPL to provide module dependencies
|
||||||
|
if (scriptDefinition == StandardScriptDefinition || scriptDefinition.template == Any::class) {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
// TODO: this should get this particular scripts dependencies
|
// TODO: this should get this particular scripts dependencies
|
||||||
if (scriptDefinition is KotlinConfigurableScriptDefinition || scriptDefinition is KotlinScriptDefinitionFromTemplate) {
|
if (scriptDefinition is KotlinConfigurableScriptDefinition || scriptDefinition is KotlinScriptDefinitionFromTemplate) {
|
||||||
// TODO: should include the file itself
|
// TODO: should include the file itself
|
||||||
|
|||||||
Reference in New Issue
Block a user