Grand refactoring of the scripting DSL + many minor usability refactorings around it

This commit is contained in:
Ilya Chernikov
2018-07-30 17:55:13 +02:00
parent 45eaca1290
commit 74f8a541c0
41 changed files with 655 additions and 619 deletions
@@ -9,17 +9,13 @@ import org.jetbrains.kotlin.script.examples.jvm.resolve.maven.MyScriptWithMavenD
import java.io.File
import kotlin.script.experimental.api.EvaluationResult
import kotlin.script.experimental.api.ResultWithDiagnostics
import kotlin.script.experimental.api.ScriptCompileConfiguration
import kotlin.script.experimental.api.ScriptEvaluationEnvironment
import kotlin.script.experimental.host.toScriptSource
import kotlin.script.experimental.jvmhost.makeBasicHostFromAnnotatedScriptBaseClass
fun evalFile(scriptFile: File): ResultWithDiagnostics<EvaluationResult> {
val host = makeBasicHostFromAnnotatedScriptBaseClass<MyScriptWithMavenDeps>()
return host.eval(
scriptFile.toScriptSource(), ScriptCompileConfiguration(), ScriptEvaluationEnvironment()
)
return host.eval(scriptFile.toScriptSource(), null, null)
}
fun main(vararg args: String) {
@@ -5,7 +5,6 @@ plugins {
dependencies {
compile(project(":kotlin-scripting-jvm"))
compile(project(":kotlin-scripting-misc"))
compile(project(":kotlin-script-util"))
runtime("com.jcabi:jcabi-aether:0.10.1")
runtime("org.sonatype.aether:aether-api:1.13.1")
@@ -16,34 +16,35 @@ import kotlin.script.experimental.api.*
import kotlin.script.experimental.jvm.JvmDependency
import kotlin.script.experimental.jvm.compat.mapLegacyDiagnosticSeverity
import kotlin.script.experimental.jvm.compat.mapLegacyScriptPosition
import kotlin.script.experimental.jvm.jvmDependenciesFromCurrentContext
import kotlin.script.experimental.misc.invoke
import kotlin.script.experimental.jvm.dependenciesFromCurrentContext
import kotlin.script.experimental.jvm.jvm
import kotlin.script.experimental.util.getOrNull
@KotlinScript(
extension = "scriptwithdeps.kts",
properties = MyScriptProperties::class
definition = MyScriptDefinition::class
)
abstract class MyScriptWithMavenDeps {
// abstract fun body(vararg args: String): Int
}
class MyScriptProperties : ScriptingProperties() {
override fun setup() {
scriptDefinition {
defaultImports<DependsOn>()
defaultImports(Repository::class)
jvmDependenciesFromCurrentContext(
object MyScriptDefinition : ScriptDefinition {
override val properties = properties {
defaultImports<DependsOn>()
defaultImports(Repository::class)
jvm {
dependenciesFromCurrentContext(
"scripting-jvm-maven-deps", // script library jar name
"kotlin-script-util" // DependsOn annotation is taken from script-util
)
// variant: dependencies(collectDependenciesFromCurrentContext(...
refineConfiguration {
}
// variant: dependencies(collectDependenciesFromCurrentContext(...
refineConfiguration {
// variant ^: dynamicConfiguration
handler(MyConfigurator())
triggerOnAnnotations(DependsOn::class, Repository::class)
// variants: onAnnotations, refineOnAnnotations (esp. for dynamicConfiguration), updateOnAnnotations
// other triggers: beforeParsing, onSections
}
handler(MyConfigurator())
triggerOnAnnotations(DependsOn::class, Repository::class)
// variants: onAnnotations, refineOnAnnotations (esp. for dynamicConfiguration), updateOnAnnotations
// other triggers: beforeParsing, onSections
}
}
}
@@ -54,10 +55,11 @@ class MyConfigurator : RefineScriptCompilationConfigurationHandler {
override suspend operator fun invoke(
scriptSource: ScriptSource,
configuration: ScriptCompileConfiguration,
processedScriptData: ProcessedScriptData
): ResultWithDiagnostics<ScriptCompileConfiguration> {
val annotations = processedScriptData.getOrNull(ProcessedScriptDataProperties.foundAnnotations)?.takeIf { it.isNotEmpty() }
scriptDefinition: ScriptDefinition,
configuration: ScriptCompileConfiguration?,
processedScriptData: ProcessedScriptData?
): ResultWithDiagnostics<ScriptCompileConfiguration?> {
val annotations = processedScriptData?.getOrNull(ProcessedScriptData.foundAnnotations)?.takeIf { it.isNotEmpty() }
?: return configuration.asSuccess()
val scriptContents = object : ScriptContents {
override val annotations: Iterable<Annotation> = annotations
@@ -73,10 +75,9 @@ class MyConfigurator : RefineScriptCompilationConfigurationHandler {
?: return configuration.asSuccess(diagnostics)
val resolvedClasspath = newDepsFromResolver.classpath.toList().takeIf { it.isNotEmpty() }
?: return configuration.asSuccess(diagnostics)
val newDependency = JvmDependency(resolvedClasspath)
val updatedDeps =
configuration.getOrNull(ScriptDefinitionProperties.dependencies)?.plus(newDependency) ?: listOf(newDependency)
ScriptCompileConfiguration(configuration, ScriptDefinitionProperties.dependencies(updatedDeps)).asSuccess(diagnostics)
ScriptCompileConfiguration.create {
dependencies(JvmDependency(resolvedClasspath))
}.asSuccess(diagnostics)
} catch (e: Throwable) {
ResultWithDiagnostics.Failure(*diagnostics.toTypedArray(), e.asDiagnostics())
}
@@ -7,7 +7,6 @@ plugins {
dependencies {
compile(project(":examples:scripting-jvm-simple-script"))
compile(project(":kotlin-scripting-jvm-host"))
compile(project(":kotlin-scripting-misc"))
compile(project(":kotlin-script-util"))
runtime(projectRuntimeJar(":kotlin-compiler"))
testCompile(commonDep("junit"))
@@ -9,24 +9,25 @@ import org.jetbrains.kotlin.script.examples.jvm.simple.MyScript
import java.io.File
import kotlin.script.experimental.api.EvaluationResult
import kotlin.script.experimental.api.ResultWithDiagnostics
import kotlin.script.experimental.api.ScriptCompileConfiguration
import kotlin.script.experimental.api.ScriptEvaluationEnvironment
import kotlin.script.experimental.api.buildScriptingProperties
import kotlin.script.experimental.host.toScriptSource
import kotlin.script.experimental.jvm.jvmDependenciesFromCurrentContext
import kotlin.script.experimental.jvm.dependenciesFromCurrentContext
import kotlin.script.experimental.jvm.jvm
import kotlin.script.experimental.jvmhost.makeBasicHostFromAnnotatedScriptBaseClass
fun evalFile(scriptFile: File): ResultWithDiagnostics<EvaluationResult> {
val additionalCompilationProperties = buildScriptingProperties {
jvmDependenciesFromCurrentContext(
"scripting-jvm-simple-script" /* script library jar name */
)
val additionalCompilationProperties = ScriptCompileConfiguration.create {
jvm {
dependenciesFromCurrentContext(
"scripting-jvm-simple-script" /* script library jar name */
)
}
}
val host = makeBasicHostFromAnnotatedScriptBaseClass<MyScript>()
return host.eval(
scriptFile.toScriptSource(), additionalCompilationProperties, ScriptEvaluationEnvironment()
)
return host.eval(scriptFile.toScriptSource(), additionalCompilationProperties, null)
}
fun main(vararg args: String) {