Refactor scripting examples:
- split into script def and host part - remove bad dependencies - organize it in a way that should be typical for user scenarios
This commit is contained in:
+83
@@ -0,0 +1,83 @@
|
||||
/*
|
||||
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||
* that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package org.jetbrains.kotlin.script.examples.jvm.resolve.maven
|
||||
|
||||
import org.jetbrains.kotlin.script.util.DependsOn
|
||||
import org.jetbrains.kotlin.script.util.FilesAndMavenResolver
|
||||
import org.jetbrains.kotlin.script.util.Repository
|
||||
import org.jetbrains.kotlin.script.util.scriptCompilationClasspathFromContext
|
||||
import java.io.File
|
||||
import kotlin.reflect.KClass
|
||||
import kotlin.script.dependencies.ScriptContents
|
||||
import kotlin.script.dependencies.ScriptDependenciesResolver
|
||||
import kotlin.script.experimental.annotations.KotlinScript
|
||||
import kotlin.script.experimental.api.*
|
||||
import kotlin.script.experimental.basic.DefaultScriptSelector
|
||||
import kotlin.script.experimental.jvm.*
|
||||
import kotlin.script.experimental.jvm.runners.BasicJvmScriptRunner
|
||||
|
||||
@KotlinScript(
|
||||
DefaultScriptSelector::class,
|
||||
MyConfigurator::class,
|
||||
BasicJvmScriptRunner::class
|
||||
)
|
||||
abstract class MyScriptWithMavenDeps {
|
||||
// abstract fun body(vararg args: String): Int
|
||||
}
|
||||
|
||||
inline fun myJvmConfig(
|
||||
from: HeterogeneousMap = HeterogeneousMap(),
|
||||
crossinline body: JvmScriptCompileConfigurationParams.Builder.() -> Unit = {}
|
||||
) = jvmConfigWithJavaHome(from) {
|
||||
signature<MyScriptWithMavenDeps>()
|
||||
ScriptCompileConfigurationParams.importedPackages(listOf(DependsOn::class.qualifiedName!!, Repository::class.qualifiedName!!))
|
||||
dependencies(
|
||||
scriptCompilationClasspathFromContext(
|
||||
"script", // script library jar name
|
||||
"kotlin-script-util" // DependsOn annotation is taken from script-util
|
||||
)
|
||||
)
|
||||
ScriptCompileConfigurationParams.updateConfigurationOnAnnotations(listOf(DependsOn::class, Repository::class))
|
||||
body()
|
||||
}
|
||||
|
||||
class MyConfigurator(val baseClass: KClass<Any>? = null) : ScriptConfigurator {
|
||||
|
||||
private val resolver = FilesAndMavenResolver()
|
||||
|
||||
override suspend fun baseConfiguration(scriptSource: ScriptSource?): ResultWithDiagnostics<ScriptCompileConfiguration> =
|
||||
myJvmConfig { add(scriptSource.toConfigEntry()) }.asSuccess()
|
||||
|
||||
override suspend fun refineConfiguration(
|
||||
configuration: ScriptCompileConfiguration,
|
||||
processedScriptData: ProcessedScriptData
|
||||
): ResultWithDiagnostics<ScriptCompileConfiguration> {
|
||||
val annotations = processedScriptData.getOrNull(ProcessedScriptDataParams.annotations)?.toList()?.takeIf { it.isNotEmpty() }
|
||||
?: return configuration.asSuccess()
|
||||
val scriptContents = object : ScriptContents {
|
||||
override val annotations: Iterable<Annotation> = annotations
|
||||
override val file: File? = null
|
||||
override val text: CharSequence? = null
|
||||
}
|
||||
val diagnostics = arrayListOf<ScriptDiagnostic>()
|
||||
fun report(severity: ScriptDependenciesResolver.ReportSeverity, message: String, position: ScriptContents.Position?) {
|
||||
diagnostics.add(ScriptDiagnostic(message, mapLegacyDiagnosticSeverity(severity), mapLegacyScriptPosition(position)))
|
||||
}
|
||||
return try {
|
||||
val newDepsFromResolver = resolver.resolve(scriptContents, emptyMap(), ::report, null).get()
|
||||
?: return configuration.asSuccess(diagnostics)
|
||||
val resolvedClasspath = newDepsFromResolver.classpath.toList().takeIf { it.isNotEmpty() }
|
||||
?: return configuration.asSuccess(diagnostics)
|
||||
val newDependency = JvmDependency(resolvedClasspath)
|
||||
val updatedDeps =
|
||||
configuration.getOrNull(ScriptCompileConfigurationParams.dependencies)?.plus(newDependency) ?: listOf(newDependency)
|
||||
configuration.cloneWith(ScriptCompileConfigurationParams.dependencies to updatedDeps).asSuccess(diagnostics)
|
||||
} catch (e: Throwable) {
|
||||
ResultWithDiagnostics.Failure(*diagnostics.toTypedArray(), e.asDiagnostics())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user