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 { companion object {
private val SCRIPT_RESULT_FIELD_NAME = "\$\$result" private val SCRIPT_RESULT_FIELD_NAME = "\$\$result"
private val REPL_LINE_AS_SCRIPT_DEFINITION = object : KotlinScriptDefinition { private val REPL_LINE_AS_SCRIPT_DEFINITION = object : KotlinScriptDefinition {
override val name = "Kotlin REPL"
override fun getScriptParameters(scriptDescriptor: ScriptDescriptor): List<ScriptParameter> = emptyList() override fun getScriptParameters(scriptDescriptor: ScriptDescriptor): List<ScriptParameter> = emptyList()
override fun isScript(file: PsiFile): Boolean = StandardScriptDefinition.isScript(file) override fun isScript(file: PsiFile): Boolean = StandardScriptDefinition.isScript(file)
@@ -33,11 +33,13 @@ import org.jetbrains.kotlin.types.Variance
import kotlin.reflect.KClass import kotlin.reflect.KClass
interface KotlinScriptDefinition { interface KotlinScriptDefinition {
val name: String
fun getScriptParameters(scriptDescriptor: ScriptDescriptor): List<ScriptParameter> fun getScriptParameters(scriptDescriptor: ScriptDescriptor): List<ScriptParameter>
fun getScriptSupertypes(scriptDescriptor: ScriptDescriptor): List<KotlinType> = emptyList() fun getScriptSupertypes(scriptDescriptor: ScriptDescriptor): List<KotlinType> = emptyList()
fun getScriptParametersToPassToSuperclass(scriptDescriptor: ScriptDescriptor): List<Name> = emptyList() fun getScriptParametersToPassToSuperclass(scriptDescriptor: ScriptDescriptor): List<Name> = emptyList()
fun isScript(file: PsiFile): Boolean fun isScript(file: PsiFile): Boolean
fun getScriptName(script: KtScript): Name fun getScriptName(script: KtScript): Name
fun getScriptDependenciesClasspath(): List<String> = emptyList()
} }
class ScriptParameter(val name: Name, val type: KotlinType) class ScriptParameter(val name: Name, val type: KotlinType)
@@ -45,6 +47,8 @@ class ScriptParameter(val name: Name, val type: KotlinType)
object StandardScriptDefinition : KotlinScriptDefinition { object StandardScriptDefinition : KotlinScriptDefinition {
private val ARGS_NAME = Name.identifier("args") private val ARGS_NAME = Name.identifier("args")
override val name = "Kotlin Script"
override fun getScriptName(script: KtScript): Name { override fun getScriptName(script: KtScript): Name {
return ScriptNameUtil.fileNameWithExtensionStripped(script, KotlinParserDefinition.STD_SCRIPT_EXT) 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 = fun makeReflectedClassScriptParameter(scriptDescriptor: ScriptDescriptor, propertyName: Name, kClass: KClass<out Any>): ScriptParameter =
ScriptParameter(propertyName, getKotlinType(scriptDescriptor, kClass)) ScriptParameter(propertyName, getKotlinType(scriptDescriptor, kClass))
fun getKotlinType(scriptDescriptor: ScriptDescriptor, kClass: KClass<out Any>): KotlinType { fun getKotlinType(scriptDescriptor: ScriptDescriptor, kClass: KClass<out Any>): KotlinType =
val module = scriptDescriptor.module getKotlinTypeByFqName(scriptDescriptor,
val qualifiedName = kClass.qualifiedName ?: throw RuntimeException("Cannot get FQN from $kClass") 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 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 import kotlin.reflect.KClass
abstract class BaseScriptDefinition (val extension: String) : KotlinScriptDefinition { 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 isScript(file: PsiFile): Boolean = file.name.endsWith(extension)
override fun getScriptName(script: KtScript): Name = ScriptNameUtil.fileNameWithExtensionStripped(script, 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 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) = 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) { 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() var compilerHelper: ConsoleCompilerHelper by Delegates.notNull()
private val consoleScriptDefinition = object : KotlinScriptDefinition { private val consoleScriptDefinition = object : KotlinScriptDefinition {
override val name = "Kotlin REPL"
override fun isScript(file: PsiFile) = file.originalFile.virtualFile == consoleView.virtualFile override fun isScript(file: PsiFile) = file.originalFile.virtualFile == consoleView.virtualFile
override fun getScriptParameters(scriptDescriptor: ScriptDescriptor) = emptyList<ScriptParameter>() override fun getScriptParameters(scriptDescriptor: ScriptDescriptor) = emptyList<ScriptParameter>()
override fun getScriptName(script: KtScript) = Name.identifier("REPL") override fun getScriptName(script: KtScript) = Name.identifier("REPL")