diff --git a/idea/idea-frontend-independent/src/org/jetbrains/kotlin/idea/util/ApplicationUtils.kt b/idea/idea-frontend-independent/src/org/jetbrains/kotlin/idea/util/ApplicationUtils.kt index 77f9eb8dfc5..4d23a1b3a87 100644 --- a/idea/idea-frontend-independent/src/org/jetbrains/kotlin/idea/util/ApplicationUtils.kt +++ b/idea/idea-frontend-independent/src/org/jetbrains/kotlin/idea/util/ApplicationUtils.kt @@ -11,6 +11,7 @@ import com.intellij.openapi.components.ComponentManager import com.intellij.openapi.progress.impl.CancellationCheck import com.intellij.openapi.project.DumbService import com.intellij.openapi.project.Project +import com.intellij.openapi.util.Condition fun runReadAction(action: () -> T): T { return ApplicationManager.getApplication().runReadAction(action) @@ -52,6 +53,9 @@ inline fun executeOnPooledThread(crossinline action: () -> Unit) = inline fun invokeLater(crossinline action: () -> Unit) = ApplicationManager.getApplication().invokeLater { action() } +inline fun invokeLater(expired: Condition<*>, crossinline action: () -> Unit) = + ApplicationManager.getApplication().invokeLater({ action() }, expired) + inline fun isUnitTestMode(): Boolean = ApplicationManager.getApplication().isUnitTestMode inline fun ComponentManager.getServiceSafe(): T = diff --git a/idea/idea-frontend-independent/src/org/jetbrains/kotlin/idea/util/ApplicationUtils.kt.193 b/idea/idea-frontend-independent/src/org/jetbrains/kotlin/idea/util/ApplicationUtils.kt.193 index 39e98ebdfad..01f484152d8 100644 --- a/idea/idea-frontend-independent/src/org/jetbrains/kotlin/idea/util/ApplicationUtils.kt.193 +++ b/idea/idea-frontend-independent/src/org/jetbrains/kotlin/idea/util/ApplicationUtils.kt.193 @@ -11,6 +11,7 @@ import com.intellij.openapi.components.ComponentManager import com.intellij.openapi.project.Project import org.jetbrains.annotations.Nls import com.intellij.openapi.project.DumbService +import com.intellij.openapi.util.Condition fun runReadAction(action: () -> T): T { return ApplicationManager.getApplication().runReadAction(action) @@ -43,6 +44,9 @@ inline fun executeOnPooledThread(crossinline action: () -> Unit) = inline fun invokeLater(crossinline action: () -> Unit) = ApplicationManager.getApplication().invokeLater { action() } +inline fun invokeLater(expired: Condition<*>, crossinline action: () -> Unit) = + ApplicationManager.getApplication().invokeLater({ action() }, expired) + inline fun isUnitTestMode(): Boolean = ApplicationManager.getApplication().isUnitTestMode inline fun ComponentManager.getServiceSafe(): T = diff --git a/idea/idea-frontend-independent/src/org/jetbrains/kotlin/idea/util/ApplicationUtils.kt.as40 b/idea/idea-frontend-independent/src/org/jetbrains/kotlin/idea/util/ApplicationUtils.kt.as40 index aebd7211d12..af352d76fa1 100644 --- a/idea/idea-frontend-independent/src/org/jetbrains/kotlin/idea/util/ApplicationUtils.kt.as40 +++ b/idea/idea-frontend-independent/src/org/jetbrains/kotlin/idea/util/ApplicationUtils.kt.as40 @@ -25,6 +25,7 @@ import com.intellij.openapi.progress.ProgressIndicatorProvider import com.intellij.openapi.progress.ProgressManager import com.intellij.openapi.project.Project import com.intellij.openapi.project.DumbService +import com.intellij.openapi.util.Condition fun runReadAction(action: () -> T): T { return ApplicationManager.getApplication().runReadAction(action) @@ -57,6 +58,9 @@ inline fun executeOnPooledThread(crossinline action: () -> Unit) = inline fun invokeLater(crossinline action: () -> Unit) = ApplicationManager.getApplication().invokeLater { action() } +inline fun invokeLater(expired: Condition<*>, crossinline action: () -> Unit) = + ApplicationManager.getApplication().invokeLater({ action() }, expired) + inline fun isUnitTestMode(): Boolean = ApplicationManager.getApplication().isUnitTestMode inline fun ComponentManager.getServiceSafe(): T = diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslScriptModelProcessor.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslScriptModelProcessor.kt index 30017b9c4dd..66e80bbf0dd 100644 --- a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslScriptModelProcessor.kt +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslScriptModelProcessor.kt @@ -6,23 +6,20 @@ package org.jetbrains.kotlin.idea.scripting.gradle.importing import com.intellij.openapi.externalSystem.model.task.ExternalSystemTaskId -import com.intellij.openapi.externalSystem.service.execution.ExternalSystemJdkUtil import com.intellij.openapi.project.Project -import com.intellij.openapi.projectRoots.JdkUtil import com.intellij.openapi.util.io.FileUtil.toSystemIndependentName import com.intellij.openapi.vfs.VfsUtil import org.gradle.tooling.model.kotlin.dsl.EditorReportSeverity import org.gradle.tooling.model.kotlin.dsl.KotlinDslScriptsModel import org.jetbrains.kotlin.gradle.BrokenKotlinDslScriptsModel -import org.jetbrains.kotlin.idea.KotlinIdeaGradleBundle import org.jetbrains.kotlin.idea.scripting.gradle.getGradleScriptInputsStamp import org.jetbrains.kotlin.idea.scripting.gradle.roots.GradleBuildRootsManager import org.jetbrains.plugins.gradle.model.BuildScriptClasspathModel import org.jetbrains.plugins.gradle.service.project.DefaultProjectResolverContext import org.jetbrains.plugins.gradle.service.project.ProjectResolverContext -import org.jetbrains.plugins.gradle.settings.GradleSettings import java.io.File + fun saveGradleBuildEnvironment(resolverCtx: ProjectResolverContext) { val task = resolverCtx.externalSystemTaskId val tasks = KotlinDslSyncListener.instance.tasks @@ -49,14 +46,15 @@ fun processScriptModel( resolverCtx: ProjectResolverContext, model: KotlinDslScriptsModel, projectName: String -) { - if (model is BrokenKotlinDslScriptsModel) { +): Boolean { + return if (model is BrokenKotlinDslScriptsModel) { LOG.error( "Couldn't get KotlinDslScriptsModel for $projectName:\n${model.message}\n${model.stackTrace}" ) + false } else { val task = resolverCtx.externalSystemTaskId - val project = task.findProject() ?: return + val project = task.findProject() ?: return false val models = model.toListOfScriptModels(project) val tasks = KotlinDslSyncListener.instance.tasks @@ -69,17 +67,14 @@ fun processScriptModel( val errors = models.collectErrors() if (errors.isNotEmpty()) { - if (sync != null) { - synchronized(sync) { - sync.failed = true + sync?.let { + synchronized(it) { + it.failed = true } } - throw IllegalStateException( - KotlinIdeaGradleBundle.message("title.kotlin.build.script") - + ":\n" - + errors.joinToString("\n") { it.text + "\n" + it.details } - ) + handleError(project, errors) } + errors.isEmpty() } } diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslScriptModelProcessorCompat.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslScriptModelProcessorCompat.kt new file mode 100644 index 00000000000..c67b594abe7 --- /dev/null +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslScriptModelProcessorCompat.kt @@ -0,0 +1,25 @@ +/* + * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.idea.scripting.gradle.importing + +import com.intellij.build.BuildContentManager +import com.intellij.openapi.project.Project +import org.jetbrains.kotlin.idea.KotlinIdeaGradleBundle +import org.jetbrains.kotlin.idea.util.application.invokeLater +import org.jetbrains.kotlin.idea.util.application.isUnitTestMode + +internal fun handleError(project: Project, errors: List) { + if (isUnitTestMode()) { + throw IllegalStateException( + KotlinIdeaGradleBundle.message("title.kotlin.build.script") + + ":\n" + + errors.joinToString("\n") { it.text + "\n" + it.details } + ) + } + invokeLater(project.disposed) { + BuildContentManager.getInstance(project).orCreateToolWindow.activate(null, false, false) + } +} diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslScriptModelProcessorCompat.kt.193 b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslScriptModelProcessorCompat.kt.193 new file mode 100644 index 00000000000..732dbf3a34e --- /dev/null +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslScriptModelProcessorCompat.kt.193 @@ -0,0 +1,20 @@ +/* + * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.idea.scripting.gradle.importing + +import com.intellij.build.BuildContentManager +import com.intellij.openapi.project.Project +import org.jetbrains.kotlin.idea.util.application.invokeLater +import org.jetbrains.kotlin.idea.KotlinIdeaGradleBundle + +// FIX ME WHEN BUNCH 193 REMOVED +internal fun handleError(project: Project, errors: List) { + throw IllegalStateException( + KotlinIdeaGradleBundle.message("title.kotlin.build.script") + + ":\n" + + errors.joinToString("\n") { it.text + "\n" + it.details } + ) +} diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslScriptModelResolver.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslScriptModelResolver.kt index 1dad8d7effa..9d421f365b4 100644 --- a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslScriptModelResolver.kt +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslScriptModelResolver.kt @@ -42,7 +42,9 @@ class KotlinDslScriptModelContributor : ProjectModelContributor { if (kotlinDslScriptsModelImportSupported(resolverCtx.projectGradleVersion)) { val model = toolingModelsProvider.getProjectModel(it, KotlinDslScriptsModel::class.java) if (model != null) { - processScriptModel(resolverCtx, model, projectIdentifier) + if (!processScriptModel(resolverCtx, model, projectIdentifier)) { + return@forEach + } } }