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:
Mikhail Zarechenskiy
2016-09-12 01:24:18 +03:00
parent d69e7c7aec
commit 0ba2d374bc
14 changed files with 39 additions and 39 deletions
@@ -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
@@ -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
@@ -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
View File
@@ -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
+2 -2
View File
@@ -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
@@ -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>,
@@ -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