Propagate reports from script dependency resolver

Compiler: show as compiler messages
IDE: annotate code in a separate highlighting pass
This commit is contained in:
Pavel V. Talanov
2017-06-19 19:58:51 +03:00
parent 96c2a589c0
commit 10e14103b6
16 changed files with 393 additions and 20 deletions
@@ -25,6 +25,8 @@ import org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler
import org.jetbrains.kotlin.codegen.CompilationException
import org.jetbrains.kotlin.config.JVMConfigurationKeys
import org.jetbrains.kotlin.config.addKotlinSourceRoot
import org.jetbrains.kotlin.daemon.TestMessageCollector
import org.jetbrains.kotlin.daemon.assertHasMessage
import org.jetbrains.kotlin.daemon.toFile
import org.jetbrains.kotlin.script.InvalidScriptResolverAnnotation
import org.jetbrains.kotlin.script.KotlinScriptDefinition
@@ -236,6 +238,17 @@ class ScriptTemplateTest {
}
}
@Test
fun testScriptErrorReporting() {
val messageCollector = TestMessageCollector()
compileScript("fib.kts", ScriptReportingErrors::class, messageCollector = messageCollector)
messageCollector.assertHasMessage("error", desiredSeverity = CompilerMessageSeverity.ERROR)
messageCollector.assertHasMessage("warning", desiredSeverity = CompilerMessageSeverity.WARNING)
messageCollector.assertHasMessage("info", desiredSeverity = CompilerMessageSeverity.INFO)
messageCollector.assertHasMessage("debug", desiredSeverity = CompilerMessageSeverity.LOGGING)
}
@Test
fun testSmokeScriptException() {
val aClass = compileScript("smoke_exception.kts", ScriptWithArrayParam::class)
@@ -270,24 +283,20 @@ class ScriptTemplateTest {
scriptTemplate: KClass<out Any>,
environment: Map<String, Any?>? = null,
runIsolated: Boolean = true,
suppressOutput: Boolean = false,
messageCollector: MessageCollector = PrintingMessageCollector(System.err, MessageRenderer.PLAIN_FULL_PATHS, false),
includeKotlinRuntime: Boolean = true
): Class<*>? =
compileScriptImpl("compiler/testData/script/" + scriptPath, KotlinScriptDefinitionFromAnnotatedTemplate(
scriptTemplate, null, null, environment
), runIsolated, suppressOutput, includeKotlinRuntime)
), runIsolated, messageCollector, includeKotlinRuntime)
private fun compileScriptImpl(
scriptPath: String,
scriptDefinition: KotlinScriptDefinition,
runIsolated: Boolean,
suppressOutput: Boolean,
messageCollector: MessageCollector,
includeKotlinRuntime: Boolean
): Class<*>? {
val messageCollector =
if (suppressOutput) MessageCollector.NONE
else PrintingMessageCollector(System.err, MessageRenderer.PLAIN_FULL_PATHS, false)
val rootDisposable = Disposer.newDisposable()
try {
val configuration = KotlinTestUtils.newConfiguration(if (includeKotlinRuntime) ConfigurationKind.ALL else ConfigurationKind.JDK_ONLY, TestJdkKind.FULL_JDK)
@@ -337,7 +346,7 @@ open class TestKotlinScriptDummyDependenciesResolver : DependenciesResolver {
?: emptyList()
}
class TestKotlinScriptDependenciesResolver : TestKotlinScriptDummyDependenciesResolver() {
open class TestKotlinScriptDependenciesResolver : TestKotlinScriptDummyDependenciesResolver() {
private val kotlinPaths by lazy { PathUtil.getKotlinPathsForCompiler() }
@@ -369,6 +378,24 @@ class TestKotlinScriptDependenciesResolver : TestKotlinScriptDummyDependenciesRe
class TestParamClass(@Suppress("unused") val memberNum: Int)
class ErrorReportingResolver : TestKotlinScriptDependenciesResolver() {
override fun resolve(
scriptContents: ScriptContents,
environment: Environment
): ResolveResult {
return ResolveResult.Success(
super.resolve(scriptContents, environment).dependencies!!,
listOf(
ScriptReport("error", ScriptReport.Severity.ERROR, null),
ScriptReport("warning", ScriptReport.Severity.WARNING, ScriptReport.Position(1, 0)),
ScriptReport("info", ScriptReport.Severity.INFO, ScriptReport.Position(2, 0)),
ScriptReport("debug", ScriptReport.Severity.DEBUG, ScriptReport.Position(3, 0))
)
)
}
}
@ScriptTemplateDefinition(
scriptFilePattern =".*\\.kts",
resolver = TestKotlinScriptDummyDependenciesResolver::class)
@@ -420,6 +447,9 @@ abstract class ScriptWithNullableProjection(val param: Array<String?>)
@ScriptTemplateDefinition(resolver = TestKotlinScriptDependenciesResolver::class)
abstract class ScriptWithArray2DParam(val param: Array<Array<in String>>)
@ScriptTemplateDefinition(resolver = ErrorReportingResolver::class)
abstract class ScriptReportingErrors(val num: Int)
@Target(AnnotationTarget.FILE)
@Retention(AnnotationRetention.RUNTIME)
annotation class DependsOn(val path: String)