diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ScriptDefinitionsManager.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ScriptDefinitionsManager.kt index 06bf114b989..654bd82540a 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ScriptDefinitionsManager.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ScriptDefinitionsManager.kt @@ -69,6 +69,8 @@ class ScriptDefinitionsManager(private val project: Project) : LazyScriptDefinit private var definitionsByContributor = mutableMapOf>() private var definitions: List? = null + private val failedContributorsHashes = HashSet() + private val scriptDefinitionsCacheLock = ReentrantReadWriteLock() private val scriptDefinitionsCache = SLRUMap(10, 10) @@ -195,13 +197,14 @@ class ScriptDefinitionsManager(private val project: Project) : LazyScriptDefinit } private fun ScriptDefinitionContributor.safeGetDefinitions(): List { - 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 { diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/core/script/GradleScriptTemplateProvider.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/core/script/GradleScriptTemplateProvider.kt index 6e373db9f26..d845fddd5a5 100644 --- a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/core/script/GradleScriptTemplateProvider.kt +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/core/script/GradleScriptTemplateProvider.kt @@ -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().firstOrNull() - ?: error("Project '${project.name}' isn't linked with Gradle") + ?: error("Project '${project.name}' isn't linked with Gradle") val gradleExeSettings = ExternalSystemApiUtil.getExecutionSettings( project,