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.parsing.KotlinParserDefinition
|
||||
import org.jetbrains.kotlin.psi.KtScript
|
||||
import org.jetbrains.kotlin.resolve.descriptorUtil.builtIns
|
||||
import org.jetbrains.kotlin.resolve.descriptorUtil.module
|
||||
import org.jetbrains.kotlin.serialization.deserialization.NotFoundClasses
|
||||
import org.jetbrains.kotlin.serialization.deserialization.findNonGenericClassAcrossDependencies
|
||||
@@ -39,6 +38,7 @@ import kotlin.reflect.KClass
|
||||
import kotlin.reflect.KType
|
||||
import kotlin.reflect.KTypeProjection
|
||||
import kotlin.reflect.KVariance
|
||||
import kotlin.script.StandardScriptTemplate
|
||||
|
||||
interface KotlinScriptDefinition {
|
||||
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)
|
||||
|
||||
object StandardScriptDefinition : KotlinScriptDefinition {
|
||||
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))
|
||||
object StandardScriptDefinition : KotlinScriptDefinitionFromTemplate(StandardScriptTemplate::class)
|
||||
|
||||
fun getKotlinType(scriptDescriptor: ScriptDescriptor, kClass: KClass<out Any>): KotlinType =
|
||||
getKotlinTypeByFqName(scriptDescriptor,
|
||||
|
||||
@@ -35,7 +35,7 @@ import kotlin.reflect.KClass
|
||||
import kotlin.reflect.memberFunctions
|
||||
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 scriptFilePattern: String? = null,
|
||||
val environment: Map<String, Any?>? = null
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
package
|
||||
|
||||
public final class Script {
|
||||
public final class Script : kotlin.script.StandardScriptTemplate {
|
||||
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 hashCode(): kotlin.Int
|
||||
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 final class A {
|
||||
public final class A : kotlin.script.StandardScriptTemplate {
|
||||
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 open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
|
||||
+2
-2
@@ -1,8 +1,8 @@
|
||||
package
|
||||
|
||||
public final class AccessForwardDeclarationInScript {
|
||||
public final class AccessForwardDeclarationInScript : kotlin.script.StandardScriptTemplate {
|
||||
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 y: kotlin.Int = 2
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
package
|
||||
|
||||
public final class ComplexScript {
|
||||
public final class ComplexScript : kotlin.script.StandardScriptTemplate {
|
||||
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 open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public final fun foo(/*0*/ x: kotlin.Int): kotlin.Int
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
package
|
||||
|
||||
public final class NestedInnerClass {
|
||||
public final class NestedInnerClass : kotlin.script.StandardScriptTemplate {
|
||||
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 open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public final fun function(): kotlin.Int
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
package
|
||||
|
||||
public final class SimpleScript {
|
||||
public final class SimpleScript : kotlin.script.StandardScriptTemplate {
|
||||
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 open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
|
||||
+2
-2
@@ -1,9 +1,9 @@
|
||||
package
|
||||
|
||||
public final class Imports {
|
||||
public final class Imports : kotlin.script.StandardScriptTemplate {
|
||||
public constructor Imports(/*0*/ args: kotlin.Array<kotlin.String>)
|
||||
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 hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
package
|
||||
|
||||
public final class TopLevelVariable {
|
||||
public final class TopLevelVariable : kotlin.script.StandardScriptTemplate {
|
||||
public constructor TopLevelVariable(/*0*/ args: kotlin.Array<kotlin.String>)
|
||||
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 final fun foo(): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
package
|
||||
|
||||
public final class Script {
|
||||
public final class Script : kotlin.script.StandardScriptTemplate {
|
||||
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 hashCode(): kotlin.Int
|
||||
public final fun main(): kotlin.Boolean
|
||||
|
||||
Vendored
+2
-2
@@ -1,8 +1,8 @@
|
||||
package
|
||||
|
||||
public final class Script {
|
||||
public final class Script : kotlin.script.StandardScriptTemplate {
|
||||
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 prop2: kotlin.Int
|
||||
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.util.concurrent.Future
|
||||
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,
|
||||
// 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")))
|
||||
}
|
||||
|
||||
@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(
|
||||
scriptPath: String,
|
||||
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.script.KotlinConfigurableScriptDefinition
|
||||
import org.jetbrains.kotlin.script.KotlinScriptDefinitionFromTemplate
|
||||
import org.jetbrains.kotlin.script.StandardScriptDefinition
|
||||
import org.jetbrains.kotlin.script.getScriptDefinition
|
||||
import kotlin.script.StandardScriptTemplate
|
||||
|
||||
class KotlinScriptResolveScopeProvider : ResolveScopeProvider() {
|
||||
override fun getResolveScope(file: VirtualFile, project: Project): GlobalSearchScope? {
|
||||
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
|
||||
if (scriptDefinition is KotlinConfigurableScriptDefinition || scriptDefinition is KotlinScriptDefinitionFromTemplate) {
|
||||
// TODO: should include the file itself
|
||||
|
||||
Reference in New Issue
Block a user