Catch and report exceptions from DependenciesResolver
This commit is contained in:
@@ -25,8 +25,10 @@ import org.jetbrains.kotlin.psi.KtAnnotationEntry
|
||||
import org.jetbrains.kotlin.psi.KtFile
|
||||
import java.io.File
|
||||
import kotlin.reflect.KClass
|
||||
import kotlin.script.dependencies.DependenciesResolver.ResolveResult.Failure
|
||||
import kotlin.script.dependencies.ScriptContents
|
||||
import kotlin.script.dependencies.ScriptDependencies
|
||||
import kotlin.script.dependencies.ScriptReport
|
||||
|
||||
class ScriptContentLoader(private val project: Project) {
|
||||
fun getScriptContents(scriptDefinition: KotlinScriptDefinition, file: VirtualFile)
|
||||
@@ -62,10 +64,16 @@ class ScriptContentLoader(private val project: Project) {
|
||||
file: VirtualFile
|
||||
): ScriptDependencies? {
|
||||
val scriptContents = getScriptContents(scriptDef, file)
|
||||
val result = scriptDef.dependencyResolver.resolve(
|
||||
scriptContents,
|
||||
getEnvironment(scriptDef)
|
||||
)
|
||||
val environment = getEnvironment(scriptDef)
|
||||
val result = try {
|
||||
scriptDef.dependencyResolver.resolve(
|
||||
scriptContents,
|
||||
environment
|
||||
)
|
||||
}
|
||||
catch (e: Throwable) {
|
||||
e.asResolveFailure(scriptDef)
|
||||
}
|
||||
ServiceManager.getService(project, ScriptReportSink::class.java)?.attachReports(file, result.reports)
|
||||
return result.dependencies?.adjustByDefinition(scriptDef)
|
||||
}
|
||||
@@ -82,3 +90,7 @@ fun ScriptDependencies.adjustByDefinition(
|
||||
return copy(classpath = additionalClasspath + classpath)
|
||||
}
|
||||
|
||||
fun Throwable.asResolveFailure(scriptDef: KotlinScriptDefinition): Failure {
|
||||
val prefix = "${scriptDef.dependencyResolver::class.simpleName} threw exception ${this::class.simpleName}:\n "
|
||||
return Failure(ScriptReport(prefix + (message ?: "<no message>")))
|
||||
}
|
||||
@@ -290,6 +290,14 @@ class ScriptTemplateTest {
|
||||
Assert.assertNotNull(aClass)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testThrowing() {
|
||||
val messageCollector = TestMessageCollector()
|
||||
compileScript("fib.kts", ScriptWithThrowingResolver::class, null, messageCollector = messageCollector)
|
||||
|
||||
messageCollector.assertHasMessage("Exception from resolver", desiredSeverity = CompilerMessageSeverity.ERROR)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testSmokeScriptException() {
|
||||
val aClass = compileScript("smoke_exception.kts", ScriptWithArrayParam::class)
|
||||
@@ -511,6 +519,12 @@ class SeveralConstructorsResolver(val c: Int): TestKotlinScriptDependenciesResol
|
||||
}
|
||||
class DefaultArgsConstructorResolver(val c: Int = 0): TestKotlinScriptDependenciesResolver()
|
||||
|
||||
class ThrowingResolver: DependenciesResolver {
|
||||
override fun resolve(scriptContents: ScriptContents, environment: Environment): ResolveResult {
|
||||
throw IllegalStateException("Exception from resolver")
|
||||
}
|
||||
}
|
||||
|
||||
@ScriptTemplateDefinition(
|
||||
scriptFilePattern =".*\\.kts",
|
||||
resolver = TestKotlinScriptDummyDependenciesResolver::class)
|
||||
@@ -583,6 +597,9 @@ abstract class ScriptWithSeveralConstructorsResolver(val num: Int)
|
||||
@ScriptTemplateDefinition(resolver = DefaultArgsConstructorResolver::class)
|
||||
abstract class ScriptWithDefaultArgsResolver(val num: Int)
|
||||
|
||||
@ScriptTemplateDefinition(resolver = ThrowingResolver::class)
|
||||
abstract class ScriptWithThrowingResolver(val num: Int)
|
||||
|
||||
@Target(AnnotationTarget.FILE)
|
||||
@Retention(AnnotationRetention.RUNTIME)
|
||||
annotation class DependsOn(val path: String)
|
||||
|
||||
Reference in New Issue
Block a user