Fixes after refactoring the API

This commit is contained in:
Ilya Chernikov
2018-03-26 19:38:16 +02:00
parent 1f0cac50d2
commit ae2af238fa
13 changed files with 63 additions and 54 deletions
@@ -40,6 +40,8 @@ import kotlin.concurrent.read
import kotlin.concurrent.write import kotlin.concurrent.write
import kotlin.script.dependencies.Environment import kotlin.script.dependencies.Environment
import kotlin.script.dependencies.ScriptContents import kotlin.script.dependencies.ScriptContents
import kotlin.script.experimental.api.ScriptingEnvironment
import kotlin.script.experimental.api.ScriptingEnvironmentParams
import kotlin.script.experimental.definitions.ScriptDefinitionFromAnnotatedBaseClass import kotlin.script.experimental.definitions.ScriptDefinitionFromAnnotatedBaseClass
import kotlin.script.experimental.dependencies.DependenciesResolver import kotlin.script.experimental.dependencies.DependenciesResolver
import kotlin.script.experimental.dependencies.ScriptDependencies import kotlin.script.experimental.dependencies.ScriptDependencies
@@ -162,7 +164,9 @@ fun loadDefinitionsFromTemplates(
) )
} }
template.annotations.firstIsInstanceOrNull<kotlin.script.experimental.annotations.KotlinScript>() != null -> { template.annotations.firstIsInstanceOrNull<kotlin.script.experimental.annotations.KotlinScript>() != null -> {
KotlinScriptDefinitionAdapterFromNewAPI(ScriptDefinitionFromAnnotatedBaseClass(template)) KotlinScriptDefinitionAdapterFromNewAPI(
ScriptDefinitionFromAnnotatedBaseClass(ScriptingEnvironment(ScriptingEnvironmentParams.baseClass to template))
)
} }
else -> { else -> {
LOG.error("[kts] cannot find a valid script definition annotation on the class $template") LOG.error("[kts] cannot find a valid script definition annotation on the class $template")
@@ -8,10 +8,7 @@ package org.jetbrains.kotlin.script.examples.jvm.resolve.maven.host
import org.jetbrains.kotlin.script.examples.jvm.resolve.maven.MyScriptWithMavenDeps import org.jetbrains.kotlin.script.examples.jvm.resolve.maven.MyScriptWithMavenDeps
import org.jetbrains.kotlin.script.examples.jvm.resolve.maven.myJvmConfig import org.jetbrains.kotlin.script.examples.jvm.resolve.maven.myJvmConfig
import java.io.File import java.io.File
import kotlin.script.experimental.api.EvaluationResult import kotlin.script.experimental.api.*
import kotlin.script.experimental.api.ResultWithDiagnostics
import kotlin.script.experimental.api.ScriptEvaluationEnvironment
import kotlin.script.experimental.api.toConfigEntry
import kotlin.script.experimental.definitions.ScriptDefinitionFromAnnotatedBaseClass import kotlin.script.experimental.definitions.ScriptDefinitionFromAnnotatedBaseClass
import kotlin.script.experimental.host.toScriptSource import kotlin.script.experimental.host.toScriptSource
import kotlin.script.experimental.jvm.DummyCompiledJvmScriptCache import kotlin.script.experimental.jvm.DummyCompiledJvmScriptCache
@@ -21,12 +18,14 @@ import kotlin.script.experimental.jvmhost.impl.KJVMCompilerImpl
fun evalFile(scriptFile: File): ResultWithDiagnostics<EvaluationResult> { fun evalFile(scriptFile: File): ResultWithDiagnostics<EvaluationResult> {
val scriptCompiler = JvmScriptCompiler(KJVMCompilerImpl(), DummyCompiledJvmScriptCache()) val scriptCompiler = JvmScriptCompiler(KJVMCompilerImpl(), DummyCompiledJvmScriptCache())
val scriptDefinition = ScriptDefinitionFromAnnotatedBaseClass(MyScriptWithMavenDeps::class) val scriptDefinition = ScriptDefinitionFromAnnotatedBaseClass(
ScriptingEnvironment(ScriptingEnvironmentParams.baseClass to MyScriptWithMavenDeps::class)
)
val host = JvmBasicScriptingHost( val host = JvmBasicScriptingHost(
scriptDefinition.configurator, scriptDefinition.compilationConfigurator,
scriptCompiler, scriptCompiler,
scriptDefinition.runner scriptDefinition.evaluator
) )
return host.eval(myJvmConfig { add(scriptFile.toScriptSource().toConfigEntry()) }, ScriptEvaluationEnvironment()) return host.eval(myJvmConfig { add(scriptFile.toScriptSource().toConfigEntry()) }, ScriptEvaluationEnvironment())
@@ -10,20 +10,18 @@ import org.jetbrains.kotlin.script.util.FilesAndMavenResolver
import org.jetbrains.kotlin.script.util.Repository import org.jetbrains.kotlin.script.util.Repository
import org.jetbrains.kotlin.script.util.scriptCompilationClasspathFromContext import org.jetbrains.kotlin.script.util.scriptCompilationClasspathFromContext
import java.io.File import java.io.File
import kotlin.reflect.KClass
import kotlin.script.dependencies.ScriptContents import kotlin.script.dependencies.ScriptContents
import kotlin.script.dependencies.ScriptDependenciesResolver import kotlin.script.dependencies.ScriptDependenciesResolver
import kotlin.script.experimental.annotations.KotlinScript import kotlin.script.experimental.annotations.KotlinScript
import kotlin.script.experimental.annotations.KotlinScriptCompilationConfigurator
import kotlin.script.experimental.annotations.KotlinScriptEvaluator
import kotlin.script.experimental.api.* import kotlin.script.experimental.api.*
import kotlin.script.experimental.basic.DefaultScriptSelector
import kotlin.script.experimental.jvm.* import kotlin.script.experimental.jvm.*
import kotlin.script.experimental.jvm.runners.BasicJvmScriptRunner import kotlin.script.experimental.jvm.runners.BasicJvmScriptEvaluator
@KotlinScript( @KotlinScript
DefaultScriptSelector::class, @KotlinScriptCompilationConfigurator(MyConfigurator::class)
MyConfigurator::class, @KotlinScriptEvaluator(BasicJvmScriptEvaluator::class)
BasicJvmScriptRunner::class
)
abstract class MyScriptWithMavenDeps { abstract class MyScriptWithMavenDeps {
// abstract fun body(vararg args: String): Int // abstract fun body(vararg args: String): Int
} }
@@ -44,12 +42,16 @@ inline fun myJvmConfig(
body() body()
} }
class MyConfigurator(val baseClass: KClass<Any>? = null) : ScriptConfigurator { class MyConfigurator(val environment: ScriptingEnvironment) : ScriptCompilationConfigurator {
private val resolver = FilesAndMavenResolver() private val resolver = FilesAndMavenResolver()
override suspend fun baseConfiguration(scriptSource: ScriptSource?): ResultWithDiagnostics<ScriptCompileConfiguration> = override val defaultConfiguration = myJvmConfig {
myJvmConfig { add(scriptSource.toConfigEntry()) }.asSuccess() add(ScriptCompileConfigurationParams.baseClass to environment[ScriptingEnvironmentParams.baseClass])
}
override suspend fun baseConfiguration(scriptSource: ScriptSource): ResultWithDiagnostics<ScriptCompileConfiguration> =
myJvmConfig(defaultConfiguration) { add(scriptSource.toConfigEntry()) }.asSuccess()
override suspend fun refineConfiguration( override suspend fun refineConfiguration(
configuration: ScriptCompileConfiguration, configuration: ScriptCompileConfiguration,
@@ -25,12 +25,14 @@ inline fun myJvmConfig(
fun evalFile(scriptFile: File): ResultWithDiagnostics<EvaluationResult> { fun evalFile(scriptFile: File): ResultWithDiagnostics<EvaluationResult> {
val scriptCompiler = JvmScriptCompiler(KJVMCompilerImpl(), DummyCompiledJvmScriptCache()) val scriptCompiler = JvmScriptCompiler(KJVMCompilerImpl(), DummyCompiledJvmScriptCache())
val scriptDefinition = ScriptDefinitionFromAnnotatedBaseClass(MyScript::class) val scriptDefinition = ScriptDefinitionFromAnnotatedBaseClass(
ScriptingEnvironment(ScriptingEnvironmentParams.baseClass to MyScript::class)
)
val host = JvmBasicScriptingHost( val host = JvmBasicScriptingHost(
scriptDefinition.configurator, scriptDefinition.compilationConfigurator,
scriptCompiler, scriptCompiler,
scriptDefinition.runner scriptDefinition.evaluator
) )
return host.eval(myJvmConfig { add(scriptFile.toScriptSource().toConfigEntry()) }, ScriptEvaluationEnvironment()) return host.eval(myJvmConfig { add(scriptFile.toScriptSource().toConfigEntry()) }, ScriptEvaluationEnvironment())
@@ -6,11 +6,11 @@
package org.jetbrains.kotlin.script.examples.jvm.simple package org.jetbrains.kotlin.script.examples.jvm.simple
import kotlin.script.experimental.annotations.KotlinScript import kotlin.script.experimental.annotations.KotlinScript
import kotlin.script.experimental.basic.DefaultScriptSelector import kotlin.script.experimental.annotations.KotlinScriptEvaluator
import kotlin.script.experimental.basic.PassThroughConfigurator import kotlin.script.experimental.jvm.runners.BasicJvmScriptEvaluator
import kotlin.script.experimental.jvm.runners.BasicJvmScriptRunner
@KotlinScript(DefaultScriptSelector::class, PassThroughConfigurator::class, BasicJvmScriptRunner::class) @KotlinScript
@KotlinScriptEvaluator(BasicJvmScriptEvaluator::class)
abstract class MyScript { abstract class MyScript {
// abstract fun body(vararg args: String): Int // abstract fun body(vararg args: String): Int
} }
@@ -70,7 +70,7 @@ class KJVMCompilerImpl : KJVMCompilerProxy {
override fun compile( override fun compile(
scriptCompilerConfiguration: ScriptCompileConfiguration, scriptCompilerConfiguration: ScriptCompileConfiguration,
configurator: ScriptConfigurator? configurator: ScriptCompilationConfigurator?
): ResultWithDiagnostics<CompiledScript<*>> { ): ResultWithDiagnostics<CompiledScript<*>> {
val messageCollector = ScriptDiagnosticsMessageCollector() val messageCollector = ScriptDiagnosticsMessageCollector()
@@ -238,7 +238,7 @@ class ScriptDiagnosticsMessageCollector : MessageCollector {
internal class BridgeScriptDefinition( internal class BridgeScriptDefinition(
scriptCompilerConfiguration: ScriptCompileConfiguration, scriptCompilerConfiguration: ScriptCompileConfiguration,
scriptConfigurator: ScriptConfigurator?, scriptConfigurator: ScriptCompilationConfigurator?,
updateClasspath: (List<File>) -> Unit updateClasspath: (List<File>) -> Unit
) : KotlinScriptDefinition(scriptCompilerConfiguration[ScriptCompileConfigurationParams.scriptSignature].scriptBase as KClass<out Any>) { ) : KotlinScriptDefinition(scriptCompilerConfiguration[ScriptCompileConfigurationParams.scriptSignature].scriptBase as KClass<out Any>) {
override val acceptedAnnotations = override val acceptedAnnotations =
@@ -21,7 +21,7 @@ import kotlin.script.experimental.jvm.mapToLegacyScriptReportPosition
import kotlin.script.experimental.jvm.mapToLegacyScriptReportSeverity import kotlin.script.experimental.jvm.mapToLegacyScriptReportSeverity
class BridgeDependenciesResolver( class BridgeDependenciesResolver(
val scriptConfigurator: ScriptConfigurator?, val scriptConfigurator: ScriptCompilationConfigurator?,
val baseScriptCompilerConfiguration: ScriptCompileConfiguration = scriptConfigurator.defaultConfiguration, val baseScriptCompilerConfiguration: ScriptCompileConfiguration = scriptConfigurator.defaultConfiguration,
val onClasspathUpdated: (List<File>) -> Unit = {} val onClasspathUpdated: (List<File>) -> Unit = {}
) : AsyncDependenciesResolver { ) : AsyncDependenciesResolver {
@@ -14,7 +14,7 @@ open class JvmScriptCompiler(
val cache: CompiledJvmScriptsCache val cache: CompiledJvmScriptsCache
) : ScriptCompiler { ) : ScriptCompiler {
override suspend fun compile(configuration: ScriptCompileConfiguration, configurator: ScriptConfigurator?): ResultWithDiagnostics<CompiledScript<*>> { override suspend fun compile(configuration: ScriptCompileConfiguration, configurator: ScriptCompilationConfigurator?): ResultWithDiagnostics<CompiledScript<*>> {
val refinedConfiguration = configurator?.refineConfiguration(configuration)?.let { val refinedConfiguration = configurator?.refineConfiguration(configuration)?.let {
when (it) { when (it) {
is ResultWithDiagnostics.Failure -> return it is ResultWithDiagnostics.Failure -> return it
@@ -42,7 +42,7 @@ interface CompiledJvmScriptsCache {
interface KJVMCompilerProxy { interface KJVMCompilerProxy {
fun compile( fun compile(
scriptCompilerConfiguration: ScriptCompileConfiguration, scriptCompilerConfiguration: ScriptCompileConfiguration,
configurator: ScriptConfigurator? configurator: ScriptCompilationConfigurator?
): ResultWithDiagnostics<CompiledScript<*>> ): ResultWithDiagnostics<CompiledScript<*>>
} }
@@ -19,5 +19,5 @@ inline fun jvmConfigWithJavaHome(
body() body()
} }
val ScriptConfigurator?.defaultConfiguration: ScriptCompileConfiguration val ScriptCompilationConfigurator?.defaultConfiguration: ScriptCompileConfiguration
get() = this?.let { runBlocking { baseConfiguration(null) } }?.resultOrNull() ?: ScriptCompileConfiguration() get() = this?.let { runBlocking { defaultConfiguration } } ?: ScriptCompileConfiguration()
@@ -11,10 +11,10 @@ import kotlin.script.experimental.api.*
import kotlin.script.experimental.host.BasicScriptingHost import kotlin.script.experimental.host.BasicScriptingHost
open class JvmBasicScriptingHost<ScriptBase : Any>( open class JvmBasicScriptingHost<ScriptBase : Any>(
configurationExtractor: ScriptConfigurator, configurationExtractor: ScriptCompilationConfigurator,
compiler: JvmScriptCompiler, compiler: JvmScriptCompiler,
runner: ScriptRunner<ScriptBase> evaluator: ScriptEvaluator<ScriptBase>
) : BasicScriptingHost<ScriptBase>(configurationExtractor, compiler, runner) ) : BasicScriptingHost<ScriptBase>(configurationExtractor, compiler, evaluator)
class JvmScriptEvaluationEnvironmentParams : ScriptEvaluationEnvironmentParams() { class JvmScriptEvaluationEnvironmentParams : ScriptEvaluationEnvironmentParams() {
companion object { companion object {
@@ -5,12 +5,11 @@
package kotlin.script.experimental.jvm.runners package kotlin.script.experimental.jvm.runners
import kotlin.reflect.KClass
import kotlin.script.experimental.api.* import kotlin.script.experimental.api.*
open class BasicJvmScriptRunner<ScriptBase : Any>(val baseClass: KClass<ScriptBase>? = null) : ScriptRunner<ScriptBase> { open class BasicJvmScriptEvaluator<ScriptBase : Any>(val environment: ScriptingEnvironment) : ScriptEvaluator<ScriptBase> {
override suspend fun run( override suspend fun eval(
compiledScript: CompiledScript<ScriptBase>, compiledScript: CompiledScript<ScriptBase>,
scriptEvaluationEnvironment: ScriptEvaluationEnvironment scriptEvaluationEnvironment: ScriptEvaluationEnvironment
): ResultWithDiagnostics<EvaluationResult> = ): ResultWithDiagnostics<EvaluationResult> =
@@ -6,7 +6,6 @@
package org.jetbrains.kotlin.scripting.compiler.plugin package org.jetbrains.kotlin.scripting.compiler.plugin
import com.intellij.openapi.fileTypes.LanguageFileType import com.intellij.openapi.fileTypes.LanguageFileType
import kotlinx.coroutines.experimental.runBlocking
import org.jetbrains.kotlin.idea.KotlinFileType import org.jetbrains.kotlin.idea.KotlinFileType
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.name.NameUtils import org.jetbrains.kotlin.name.NameUtils
@@ -16,13 +15,14 @@ import kotlin.reflect.KClass
import kotlin.reflect.KType import kotlin.reflect.KType
import kotlin.script.experimental.api.ScriptCompileConfigurationParams import kotlin.script.experimental.api.ScriptCompileConfigurationParams
import kotlin.script.experimental.api.ScriptDefinition import kotlin.script.experimental.api.ScriptDefinition
import kotlin.script.experimental.api.resultOrNull import kotlin.script.experimental.api.ScriptDefinitionProperties
import kotlin.script.experimental.dependencies.DependenciesResolver import kotlin.script.experimental.dependencies.DependenciesResolver
import kotlin.script.experimental.jvm.impl.BridgeDependenciesResolver import kotlin.script.experimental.jvm.impl.BridgeDependenciesResolver
class KotlinScriptDefinitionAdapterFromNewAPI(val scriptDefinition: ScriptDefinition) : KotlinScriptDefinition(scriptDefinition.baseClass) { class KotlinScriptDefinitionAdapterFromNewAPI(val scriptDefinition: ScriptDefinition) :
KotlinScriptDefinition(scriptDefinition.compilationConfigurator.defaultConfiguration[ScriptCompileConfigurationParams.baseClass]) {
override val name: String get() = scriptDefinition.selector.name override val name: String get() = scriptDefinition.properties[ScriptDefinitionProperties.name]
// TODO: consider creating separate type (subtype? for kotlin scripts) // TODO: consider creating separate type (subtype? for kotlin scripts)
override val fileType: LanguageFileType = KotlinFileType.INSTANCE override val fileType: LanguageFileType = KotlinFileType.INSTANCE
@@ -30,29 +30,28 @@ class KotlinScriptDefinitionAdapterFromNewAPI(val scriptDefinition: ScriptDefini
override val annotationsForSamWithReceivers: List<String> override val annotationsForSamWithReceivers: List<String>
get() = emptyList() get() = emptyList()
private val scriptFileExtensionWithDot =
"." + (scriptDefinition.properties.getOrNull(ScriptDefinitionProperties.fileExtension) ?: "kts")
override fun isScript(fileName: String): Boolean = override fun isScript(fileName: String): Boolean =
fileName.endsWith("." + scriptDefinition.selector.fileExtension) fileName.endsWith(scriptFileExtensionWithDot)
override fun getScriptName(script: KtScript): Name { override fun getScriptName(script: KtScript): Name {
val fileBasedName = NameUtils.getScriptNameForFile(script.containingKtFile.name) val fileBasedName = NameUtils.getScriptNameForFile(script.containingKtFile.name)
return Name.identifier(scriptDefinition.selector.makeScriptName(fileBasedName.identifier)) return Name.identifier(fileBasedName.identifier.removeSuffix(scriptFileExtensionWithDot))
} }
override val dependencyResolver: DependenciesResolver by lazy { override val dependencyResolver: DependenciesResolver by lazy {
BridgeDependenciesResolver(scriptDefinition.configurator) BridgeDependenciesResolver(scriptDefinition.compilationConfigurator)
} }
override val acceptedAnnotations: List<KClass<out Annotation>> by lazy { override val acceptedAnnotations: List<KClass<out Annotation>> by lazy {
runBlocking { scriptDefinition.compilationConfigurator.defaultConfiguration.getOrNull(ScriptCompileConfigurationParams.updateConfigurationOnAnnotations)?.toList()
scriptDefinition.configurator.baseConfiguration(null) ?: emptyList()
}.resultOrNull()?.getOrNull(ScriptCompileConfigurationParams.updateConfigurationOnAnnotations)?.toList()
?: emptyList()
} }
override val implicitReceivers: List<KType> by lazy { override val implicitReceivers: List<KType> by lazy {
runBlocking { scriptDefinition.compilationConfigurator.defaultConfiguration.getOrNull(ScriptCompileConfigurationParams.scriptSignature)?.providedDeclarations?.implicitReceivers
scriptDefinition.configurator.baseConfiguration(null)
}.resultOrNull()?.getOrNull(ScriptCompileConfigurationParams.scriptSignature)?.providedDeclarations?.implicitReceivers
?: emptyList() ?: emptyList()
} }
} }
@@ -20,6 +20,8 @@ import java.io.File
import java.io.IOException import java.io.IOException
import java.net.URLClassLoader import java.net.URLClassLoader
import java.util.jar.JarFile import java.util.jar.JarFile
import kotlin.script.experimental.api.ScriptingEnvironment
import kotlin.script.experimental.api.ScriptingEnvironmentParams
import kotlin.script.experimental.definitions.ScriptDefinitionFromAnnotatedBaseClass import kotlin.script.experimental.definitions.ScriptDefinitionFromAnnotatedBaseClass
class ScriptingCompilerConfigurationExtension(val project: MockProject) : CompilerConfigurationExtension { class ScriptingCompilerConfigurationExtension(val project: MockProject) : CompilerConfigurationExtension {
@@ -124,7 +126,9 @@ fun configureScriptDefinitions(
val cls = classloader.loadClass(template) val cls = classloader.loadClass(template)
val def = val def =
if (cls.annotations.firstIsInstanceOrNull<kotlin.script.experimental.annotations.KotlinScript>() != null) { if (cls.annotations.firstIsInstanceOrNull<kotlin.script.experimental.annotations.KotlinScript>() != null) {
KotlinScriptDefinitionAdapterFromNewAPI(ScriptDefinitionFromAnnotatedBaseClass(cls.kotlin)) KotlinScriptDefinitionAdapterFromNewAPI(
ScriptDefinitionFromAnnotatedBaseClass(ScriptingEnvironment(ScriptingEnvironmentParams.baseClass to cls.kotlin))
)
} else { } else {
KotlinScriptDefinitionFromAnnotatedTemplate(cls.kotlin, scriptResolverEnv) KotlinScriptDefinitionFromAnnotatedTemplate(cls.kotlin, scriptResolverEnv)
} }