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 definitionsByContributor = mutableMapOf<ScriptDefinitionContributor, List<KotlinScriptDefinition>>()
private var definitions: List<KotlinScriptDefinition>? = null private var definitions: List<KotlinScriptDefinition>? = null
private val failedContributorsHashes = HashSet<Int>()
private val scriptDefinitionsCacheLock = ReentrantReadWriteLock() private val scriptDefinitionsCacheLock = ReentrantReadWriteLock()
private val scriptDefinitionsCache = SLRUMap<String, KotlinScriptDefinition>(10, 10) 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> { private fun ScriptDefinitionContributor.safeGetDefinitions(): List<KotlinScriptDefinition> {
return try { if (!failedContributorsHashes.contains(this@safeGetDefinitions.hashCode())) try {
getDefinitions() return getDefinitions()
} catch (t: Throwable) { } catch (t: Throwable) {
// TODO: review exception handling // reporting failed loading only once
// possibly log, see KT-19276 LOG.error("[kts] cannot load script definitions using $this", t)
emptyList() failedContributorsHashes.add(this@safeGetDefinitions.hashCode())
} }
return emptyList()
} }
companion object { companion object {
@@ -17,6 +17,7 @@
package org.jetbrains.kotlin.idea.core.script package org.jetbrains.kotlin.idea.core.script
import com.intellij.execution.configurations.CommandLineTokenizer 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.ExternalSystemTaskId
import com.intellij.openapi.externalSystem.model.task.ExternalSystemTaskNotificationListenerAdapter import com.intellij.openapi.externalSystem.model.task.ExternalSystemTaskNotificationListenerAdapter
import com.intellij.openapi.externalSystem.model.task.ExternalSystemTaskType 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.settings.GradleSettingsListener
import org.jetbrains.plugins.gradle.util.GradleConstants import org.jetbrains.plugins.gradle.util.GradleConstants
import java.io.File import java.io.File
import java.lang.IllegalStateException
import java.util.* import java.util.*
import java.util.concurrent.atomic.AtomicBoolean import java.util.concurrent.atomic.AtomicBoolean
import kotlin.collections.LinkedHashSet import kotlin.collections.LinkedHashSet
@@ -157,6 +159,10 @@ class GradleScriptDefinitionsContributor(private val project: Project) : ScriptD
} catch (t: Throwable) { } catch (t: Throwable) {
// TODO: review exception handling // TODO: review exception handling
failedToLoad.set(true) 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)) 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") if (gradleSettings.getLinkedProjectsSettings().isEmpty()) error("Project '${project.name}' isn't linked with Gradle")
val projectSettings = gradleSettings.getLinkedProjectsSettings().filterIsInstance<GradleProjectSettings>().firstOrNull() 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>( val gradleExeSettings = ExternalSystemApiUtil.getExecutionSettings<GradleExecutionSettings>(
project, project,