Add import support to main-kts, with test
This commit is contained in:
@@ -8,11 +8,13 @@ package org.jetbrains.kotlin.mainKts
|
||||
import org.jetbrains.kotlin.mainKts.impl.FilesAndIvyResolver
|
||||
import org.jetbrains.kotlin.script.util.DependsOn
|
||||
import org.jetbrains.kotlin.script.util.Repository
|
||||
import org.jetbrains.kotlin.script.util.Import
|
||||
import java.io.File
|
||||
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.host.FileScriptSource
|
||||
import kotlin.script.experimental.jvm.JvmDependency
|
||||
import kotlin.script.experimental.jvm.compat.mapLegacyDiagnosticSeverity
|
||||
import kotlin.script.experimental.jvm.compat.mapLegacyScriptPosition
|
||||
@@ -25,12 +27,12 @@ abstract class MainKtsScript(val args: Array<String>)
|
||||
|
||||
object MainKtsScriptDefinition : ScriptCompilationConfiguration(
|
||||
{
|
||||
defaultImports(DependsOn::class, Repository::class)
|
||||
defaultImports(DependsOn::class, Repository::class, Import::class)
|
||||
jvm {
|
||||
dependenciesFromClassContext(MainKtsScriptDefinition::class, "kotlin-main-kts")
|
||||
}
|
||||
refineConfiguration {
|
||||
onAnnotations(DependsOn::class, Repository::class, handler = MainKtsConfigurator())
|
||||
onAnnotations(DependsOn::class, Repository::class, Import::class, handler = MainKtsConfigurator())
|
||||
}
|
||||
ide {
|
||||
acceptedLocations(ScriptAcceptedLocation.Everywhere)
|
||||
@@ -41,14 +43,8 @@ class MainKtsConfigurator : RefineScriptCompilationConfigurationHandler {
|
||||
private val resolver = FilesAndIvyResolver()
|
||||
|
||||
override operator fun invoke(context: ScriptConfigurationRefinementContext): ResultWithDiagnostics<ScriptCompilationConfiguration> {
|
||||
val annotations = context.collectedData?.get(ScriptCollectedData.foundAnnotations)?.takeIf { it.isNotEmpty() }
|
||||
?: return context.compilationConfiguration.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(
|
||||
@@ -59,18 +55,33 @@ class MainKtsConfigurator : RefineScriptCompilationConfigurationHandler {
|
||||
)
|
||||
)
|
||||
}
|
||||
return try {
|
||||
val newDepsFromResolver = resolver.resolve(scriptContents, emptyMap(), ::report, null).get()
|
||||
?: return context.compilationConfiguration.asSuccess(diagnostics) // TODO: failure
|
||||
val resolvedClasspath = newDepsFromResolver.classpath.toList().takeIf { it.isNotEmpty() }
|
||||
?: return context.compilationConfiguration.asSuccess(diagnostics) // TODO: failure
|
||||
|
||||
ScriptCompilationConfiguration(context.compilationConfiguration) {
|
||||
dependencies.append(JvmDependency(resolvedClasspath))
|
||||
}.asSuccess(diagnostics)
|
||||
} catch (e: Throwable) {
|
||||
ResultWithDiagnostics.Failure(*diagnostics.toTypedArray(), e.asDiagnostics(path = context.script.locationId))
|
||||
val annotations = context.collectedData?.get(ScriptCollectedData.foundAnnotations)?.takeIf { it.isNotEmpty() }
|
||||
?: return context.compilationConfiguration.asSuccess()
|
||||
|
||||
val scriptBaseDir = (context.script as? FileScriptSource)?.file?.parentFile
|
||||
val importedSources = annotations.flatMap {
|
||||
(it as? Import)?.paths?.map { sourceName ->
|
||||
FileScriptSource(scriptBaseDir?.resolve(sourceName) ?: File(sourceName))
|
||||
} ?: emptyList()
|
||||
}
|
||||
|
||||
val resolvedClassPath = try {
|
||||
val scriptContents = object : ScriptContents {
|
||||
override val annotations: Iterable<Annotation> = annotations.filter { it is DependsOn || it is Repository }
|
||||
override val file: File? = null
|
||||
override val text: CharSequence? = null
|
||||
}
|
||||
resolver.resolve(scriptContents, emptyMap(), ::report, null).get()?.classpath?.toList()
|
||||
// TODO: add diagnostics
|
||||
} catch (e: Throwable) {
|
||||
return ResultWithDiagnostics.Failure(*diagnostics.toTypedArray(), e.asDiagnostics(path = context.script.locationId))
|
||||
}
|
||||
|
||||
return ScriptCompilationConfiguration(context.compilationConfiguration) {
|
||||
if (resolvedClassPath?.isNotEmpty() == true) dependencies.append(JvmDependency(resolvedClassPath))
|
||||
if (importedSources.isNotEmpty()) importScripts.append(importedSources)
|
||||
}.asSuccess(diagnostics)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user