Add name and classpath to KotlinScriptDefinition

This commit is contained in:
Ilya Chernikov
2016-05-31 18:08:16 +02:00
parent d63b53886c
commit d225385d19
4 changed files with 16 additions and 8 deletions
@@ -235,6 +235,8 @@ class ReplInterpreter(
companion object {
private val SCRIPT_RESULT_FIELD_NAME = "\$\$result"
private val REPL_LINE_AS_SCRIPT_DEFINITION = object : KotlinScriptDefinition {
override val name = "Kotlin REPL"
override fun getScriptParameters(scriptDescriptor: ScriptDescriptor): List<ScriptParameter> = emptyList()
override fun isScript(file: PsiFile): Boolean = StandardScriptDefinition.isScript(file)
@@ -33,11 +33,13 @@ import org.jetbrains.kotlin.types.Variance
import kotlin.reflect.KClass
interface KotlinScriptDefinition {
val name: String
fun getScriptParameters(scriptDescriptor: ScriptDescriptor): List<ScriptParameter>
fun getScriptSupertypes(scriptDescriptor: ScriptDescriptor): List<KotlinType> = emptyList()
fun getScriptParametersToPassToSuperclass(scriptDescriptor: ScriptDescriptor): List<Name> = emptyList()
fun isScript(file: PsiFile): Boolean
fun getScriptName(script: KtScript): Name
fun getScriptDependenciesClasspath(): List<String> = emptyList()
}
class ScriptParameter(val name: Name, val type: KotlinType)
@@ -45,6 +47,8 @@ class ScriptParameter(val name: Name, val type: KotlinType)
object StandardScriptDefinition : KotlinScriptDefinition {
private val ARGS_NAME = Name.identifier("args")
override val name = "Kotlin Script"
override fun getScriptName(script: KtScript): Name {
return ScriptNameUtil.fileNameWithExtensionStripped(script, KotlinParserDefinition.STD_SCRIPT_EXT)
}
@@ -70,10 +74,10 @@ fun makeStringListScriptParameters(scriptDescriptor: ScriptDescriptor, propertyN
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 {
val module = scriptDescriptor.module
val qualifiedName = kClass.qualifiedName ?: throw RuntimeException("Cannot get FQN from $kClass")
return module.findClassAcrossModuleDependencies(ClassId.topLevel(FqName(qualifiedName)))?.defaultType ?:
throw RuntimeException("Cannot find class $qualifiedName in the dependencies, may be it is missing in the classpath")
}
fun getKotlinType(scriptDescriptor: ScriptDescriptor, kClass: KClass<out Any>): KotlinType =
getKotlinTypeByFqName(scriptDescriptor,
kClass.qualifiedName ?: throw RuntimeException("Cannot get FQN from $kClass"))
fun getKotlinTypeByFqName(scriptDescriptor: ScriptDescriptor, fqName: String): KotlinType =
scriptDescriptor.module.findClassAcrossModuleDependencies(ClassId.topLevel(FqName(fqName)))?.defaultType ?:
throw RuntimeException("Cannot find class $fqName in the dependencies, may be it is missing in the classpath")
@@ -25,6 +25,7 @@ import org.jetbrains.kotlin.types.KotlinType
import kotlin.reflect.KClass
abstract class BaseScriptDefinition (val extension: String) : KotlinScriptDefinition {
override val name = "Test Kotlin Script"
override fun isScript(file: PsiFile): Boolean = file.name.endsWith(extension)
override fun getScriptName(script: KtScript): Name = ScriptNameUtil.fileNameWithExtensionStripped(script, extension)
}
@@ -33,9 +34,9 @@ open class SimpleParamsTestScriptDefinition(extension: String, val parameters: L
override fun getScriptParameters(scriptDescriptor: ScriptDescriptor) = parameters
}
class ReflectedParamClassTestScriptDefinition(extension: String, val name: String, val parameter: KClass<out Any>) : BaseScriptDefinition(extension) {
class ReflectedParamClassTestScriptDefinition(extension: String, val paramName: String, val parameter: KClass<out Any>) : BaseScriptDefinition(extension) {
override fun getScriptParameters(scriptDescriptor: ScriptDescriptor) =
listOf(makeReflectedClassScriptParameter(scriptDescriptor, Name.identifier(name), parameter))
listOf(makeReflectedClassScriptParameter(scriptDescriptor, Name.identifier(paramName), parameter))
}
open class ReflectedSuperclassTestScriptDefinition(extension: String, parameters: List<ScriptParameter>, val superclass: KClass<out Any>) : SimpleParamsTestScriptDefinition(extension, parameters) {
@@ -122,6 +122,7 @@ class KotlinConsoleRunner(
var compilerHelper: ConsoleCompilerHelper by Delegates.notNull()
private val consoleScriptDefinition = object : KotlinScriptDefinition {
override val name = "Kotlin REPL"
override fun isScript(file: PsiFile) = file.originalFile.virtualFile == consoleView.virtualFile
override fun getScriptParameters(scriptDescriptor: ScriptDescriptor) = emptyList<ScriptParameter>()
override fun getScriptName(script: KtScript) = Name.identifier("REPL")