Add diagnostics for plugin classpath problems

This commit is contained in:
Ilya Chernikov
2019-03-03 13:27:02 +01:00
parent 8a8de052a3
commit f688bc5140
@@ -10,6 +10,8 @@ import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys
import org.jetbrains.kotlin.cli.common.extensions.ReplFactoryExtension import org.jetbrains.kotlin.cli.common.extensions.ReplFactoryExtension
import org.jetbrains.kotlin.cli.common.extensions.ScriptEvaluationExtension import org.jetbrains.kotlin.cli.common.extensions.ScriptEvaluationExtension
import org.jetbrains.kotlin.cli.common.extensions.ShellExtension import org.jetbrains.kotlin.cli.common.extensions.ShellExtension
import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity
import org.jetbrains.kotlin.cli.common.messages.MessageCollector
import org.jetbrains.kotlin.compiler.plugin.ComponentRegistrar import org.jetbrains.kotlin.compiler.plugin.ComponentRegistrar
import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.config.CompilerConfiguration
import org.jetbrains.kotlin.extensions.CollectAdditionalSourcesExtension import org.jetbrains.kotlin.extensions.CollectAdditionalSourcesExtension
@@ -24,6 +26,7 @@ import org.jetbrains.kotlin.scripting.definitions.ScriptDefinitionProvider
import org.jetbrains.kotlin.scripting.definitions.ScriptDependenciesProvider import org.jetbrains.kotlin.scripting.definitions.ScriptDependenciesProvider
import org.jetbrains.kotlin.scripting.extensions.* import org.jetbrains.kotlin.scripting.extensions.*
import org.jetbrains.kotlin.scripting.resolve.ScriptReportSink import org.jetbrains.kotlin.scripting.resolve.ScriptReportSink
import java.net.URLClassLoader
private fun <T> ProjectExtensionDescriptor<T>.registerExtensionIfRequired(project: MockProject, extension: T) { private fun <T> ProjectExtensionDescriptor<T>.registerExtensionIfRequired(project: MockProject, extension: T) {
try { try {
@@ -35,6 +38,8 @@ private fun <T> ProjectExtensionDescriptor<T>.registerExtensionIfRequired(projec
class ScriptingCompilerConfigurationComponentRegistrar : ComponentRegistrar { class ScriptingCompilerConfigurationComponentRegistrar : ComponentRegistrar {
override fun registerProjectComponents(project: MockProject, configuration: CompilerConfiguration) { override fun registerProjectComponents(project: MockProject, configuration: CompilerConfiguration) {
val messageCollector = configuration.get(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY)
withClassloadingProblemsReporting(messageCollector) {
CompilerConfigurationExtension.registerExtension(project, ScriptingCompilerConfigurationExtension(project)) CompilerConfigurationExtension.registerExtension(project, ScriptingCompilerConfigurationExtension(project))
CollectAdditionalSourcesExtension.registerExtension(project, ScriptingCollectAdditionalSourcesExtension(project)) CollectAdditionalSourcesExtension.registerExtension(project, ScriptingCollectAdditionalSourcesExtension(project))
ScriptEvaluationExtension.registerExtensionIfRequired(project, JvmCliScriptEvaluationExtension()) ScriptEvaluationExtension.registerExtensionIfRequired(project, JvmCliScriptEvaluationExtension())
@@ -48,11 +53,8 @@ class ScriptingCompilerConfigurationComponentRegistrar : ComponentRegistrar {
CliScriptDependenciesProvider(project) CliScriptDependenciesProvider(project)
) )
SyntheticResolveExtension.registerExtension(project, ScriptingResolveExtension()) SyntheticResolveExtension.registerExtension(project, ScriptingResolveExtension())
ExtraImportsProviderExtension.registerExtension(project, ExtraImportsProviderExtension.registerExtension(project, ScriptExtraImportsProviderExtension())
ScriptExtraImportsProviderExtension()
)
val messageCollector = configuration.get(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY)
if (messageCollector != null) { if (messageCollector != null) {
project.registerService( project.registerService(
ScriptReportSink::class.java, ScriptReportSink::class.java,
@@ -60,4 +62,24 @@ class ScriptingCompilerConfigurationComponentRegistrar : ComponentRegistrar {
) )
} }
} }
}
}
private inline fun withClassloadingProblemsReporting(messageCollector: MessageCollector?, body: () -> Unit) {
try {
body()
null
} catch (e: ClassNotFoundException) {
e
} catch (e: NoClassDefFoundError) {
e
}?.also { e ->
val classpath = (ScriptingCompilerConfigurationComponentRegistrar::class.java.classLoader as? URLClassLoader)?.urLs?.map { it.path }
val msg = "Error registering scripting services: $e\n current classpath:\n ${classpath?.joinToString("\n ")}"
if (messageCollector != null) {
messageCollector.report(CompilerMessageSeverity.STRONG_WARNING, msg)
} else {
System.err.println(msg)
}
}
} }