Refactor script definition loading error handling

reenable logging of failures
suppress loading from failed contributors
This commit is contained in:
Ilya Chernikov
2019-03-19 11:27:30 +01:00
parent dd3ac74bd2
commit f2bddce4fd
2 changed files with 15 additions and 6 deletions
@@ -69,6 +69,8 @@ class ScriptDefinitionsManager(private val project: Project) : LazyScriptDefinit
private var definitionsByContributor = mutableMapOf<ScriptDefinitionContributor, List<KotlinScriptDefinition>>()
private var definitions: List<KotlinScriptDefinition>? = null
private val failedContributorsHashes = HashSet<Int>()
private val scriptDefinitionsCacheLock = ReentrantReadWriteLock()
private val scriptDefinitionsCache = SLRUMap<String, KotlinScriptDefinition>(10, 10)
@@ -195,13 +197,14 @@ class ScriptDefinitionsManager(private val project: Project) : LazyScriptDefinit
}
private fun ScriptDefinitionContributor.safeGetDefinitions(): List<KotlinScriptDefinition> {
return try {
getDefinitions()
if (!failedContributorsHashes.contains(this@safeGetDefinitions.hashCode())) try {
return getDefinitions()
} catch (t: Throwable) {
// TODO: review exception handling
// possibly log, see KT-19276
emptyList()
// reporting failed loading only once
LOG.error("[kts] cannot load script definitions using $this", t)
failedContributorsHashes.add(this@safeGetDefinitions.hashCode())
}
return emptyList()
}
companion object {
@@ -17,6 +17,7 @@
package org.jetbrains.kotlin.idea.core.script
import com.intellij.execution.configurations.CommandLineTokenizer
import com.intellij.openapi.diagnostic.Logger
import com.intellij.openapi.externalSystem.model.task.ExternalSystemTaskId
import com.intellij.openapi.externalSystem.model.task.ExternalSystemTaskNotificationListenerAdapter
import com.intellij.openapi.externalSystem.model.task.ExternalSystemTaskType
@@ -37,6 +38,7 @@ import org.jetbrains.plugins.gradle.settings.GradleProjectSettings
import org.jetbrains.plugins.gradle.settings.GradleSettingsListener
import org.jetbrains.plugins.gradle.util.GradleConstants
import java.io.File
import java.lang.IllegalStateException
import java.util.*
import java.util.concurrent.atomic.AtomicBoolean
import kotlin.collections.LinkedHashSet
@@ -157,6 +159,10 @@ class GradleScriptDefinitionsContributor(private val project: Project) : ScriptD
} catch (t: Throwable) {
// TODO: review exception handling
failedToLoad.set(true)
if (t is IllegalStateException) {
Logger.getInstance(GradleScriptDefinitionsContributor::class.java)
.info("[kts] error loading gradle script templates: ${t.message}")
}
listOf(ErrorGradleScriptDefinition(t.message))
}
@@ -191,7 +197,7 @@ class GradleScriptDefinitionsContributor(private val project: Project) : ScriptD
if (gradleSettings.getLinkedProjectsSettings().isEmpty()) error("Project '${project.name}' isn't linked with Gradle")
val projectSettings = gradleSettings.getLinkedProjectsSettings().filterIsInstance<GradleProjectSettings>().firstOrNull()
?: error("Project '${project.name}' isn't linked with Gradle")
?: error("Project '${project.name}' isn't linked with Gradle")
val gradleExeSettings = ExternalSystemApiUtil.getExecutionSettings<GradleExecutionSettings>(
project,