Open build tool window on Gradle DSL errors

^EA-236697 Fixed
This commit is contained in:
Vladimir Dolzhenko
2020-10-01 10:41:57 +02:00
committed by Vladimir Dolzhenko
parent e018f2bd3e
commit 741df42c18
5 changed files with 29 additions and 16 deletions
@@ -11,6 +11,7 @@ import com.intellij.openapi.components.ComponentManager
import com.intellij.openapi.progress.impl.CancellationCheck import com.intellij.openapi.progress.impl.CancellationCheck
import com.intellij.openapi.project.DumbService import com.intellij.openapi.project.DumbService
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
import com.intellij.openapi.util.Condition
fun <T> runReadAction(action: () -> T): T { fun <T> runReadAction(action: () -> T): T {
return ApplicationManager.getApplication().runReadAction<T>(action) return ApplicationManager.getApplication().runReadAction<T>(action)
@@ -52,6 +53,9 @@ inline fun executeOnPooledThread(crossinline action: () -> Unit) =
inline fun invokeLater(crossinline action: () -> Unit) = inline fun invokeLater(crossinline action: () -> Unit) =
ApplicationManager.getApplication().invokeLater { action() } 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 isUnitTestMode(): Boolean = ApplicationManager.getApplication().isUnitTestMode
inline fun <reified T : Any> ComponentManager.getServiceSafe(): T = inline fun <reified T : Any> ComponentManager.getServiceSafe(): T =
@@ -11,6 +11,7 @@ import com.intellij.openapi.components.ComponentManager
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
import org.jetbrains.annotations.Nls import org.jetbrains.annotations.Nls
import com.intellij.openapi.project.DumbService import com.intellij.openapi.project.DumbService
import com.intellij.openapi.util.Condition
fun <T> runReadAction(action: () -> T): T { fun <T> runReadAction(action: () -> T): T {
return ApplicationManager.getApplication().runReadAction<T>(action) return ApplicationManager.getApplication().runReadAction<T>(action)
@@ -43,6 +44,9 @@ inline fun executeOnPooledThread(crossinline action: () -> Unit) =
inline fun invokeLater(crossinline action: () -> Unit) = inline fun invokeLater(crossinline action: () -> Unit) =
ApplicationManager.getApplication().invokeLater { action() } 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 isUnitTestMode(): Boolean = ApplicationManager.getApplication().isUnitTestMode
inline fun <reified T : Any> ComponentManager.getServiceSafe(): T = inline fun <reified T : Any> ComponentManager.getServiceSafe(): T =
@@ -25,6 +25,7 @@ import com.intellij.openapi.progress.ProgressIndicatorProvider
import com.intellij.openapi.progress.ProgressManager import com.intellij.openapi.progress.ProgressManager
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
import com.intellij.openapi.project.DumbService import com.intellij.openapi.project.DumbService
import com.intellij.openapi.util.Condition
fun <T> runReadAction(action: () -> T): T { fun <T> runReadAction(action: () -> T): T {
return ApplicationManager.getApplication().runReadAction<T>(action) return ApplicationManager.getApplication().runReadAction<T>(action)
@@ -57,6 +58,9 @@ inline fun executeOnPooledThread(crossinline action: () -> Unit) =
inline fun invokeLater(crossinline action: () -> Unit) = inline fun invokeLater(crossinline action: () -> Unit) =
ApplicationManager.getApplication().invokeLater { action() } 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 isUnitTestMode(): Boolean = ApplicationManager.getApplication().isUnitTestMode
inline fun <reified T : Any> ComponentManager.getServiceSafe(): T = inline fun <reified T : Any> ComponentManager.getServiceSafe(): T =
@@ -5,24 +5,23 @@
package org.jetbrains.kotlin.idea.scripting.gradle.importing package org.jetbrains.kotlin.idea.scripting.gradle.importing
import com.intellij.build.BuildContentManager
import com.intellij.openapi.externalSystem.model.task.ExternalSystemTaskId 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.project.Project
import com.intellij.openapi.projectRoots.JdkUtil
import com.intellij.openapi.util.io.FileUtil.toSystemIndependentName import com.intellij.openapi.util.io.FileUtil.toSystemIndependentName
import com.intellij.openapi.vfs.VfsUtil import com.intellij.openapi.vfs.VfsUtil
import org.gradle.tooling.model.kotlin.dsl.EditorReportSeverity import org.gradle.tooling.model.kotlin.dsl.EditorReportSeverity
import org.gradle.tooling.model.kotlin.dsl.KotlinDslScriptsModel import org.gradle.tooling.model.kotlin.dsl.KotlinDslScriptsModel
import org.jetbrains.kotlin.gradle.BrokenKotlinDslScriptsModel 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.getGradleScriptInputsStamp
import org.jetbrains.kotlin.idea.scripting.gradle.roots.GradleBuildRootsManager import org.jetbrains.kotlin.idea.scripting.gradle.roots.GradleBuildRootsManager
import org.jetbrains.kotlin.idea.util.application.invokeLater
import org.jetbrains.plugins.gradle.model.BuildScriptClasspathModel import org.jetbrains.plugins.gradle.model.BuildScriptClasspathModel
import org.jetbrains.plugins.gradle.service.project.DefaultProjectResolverContext import org.jetbrains.plugins.gradle.service.project.DefaultProjectResolverContext
import org.jetbrains.plugins.gradle.service.project.ProjectResolverContext import org.jetbrains.plugins.gradle.service.project.ProjectResolverContext
import org.jetbrains.plugins.gradle.settings.GradleSettings
import java.io.File import java.io.File
fun saveGradleBuildEnvironment(resolverCtx: ProjectResolverContext) { fun saveGradleBuildEnvironment(resolverCtx: ProjectResolverContext) {
val task = resolverCtx.externalSystemTaskId val task = resolverCtx.externalSystemTaskId
val tasks = KotlinDslSyncListener.instance.tasks val tasks = KotlinDslSyncListener.instance.tasks
@@ -49,14 +48,15 @@ fun processScriptModel(
resolverCtx: ProjectResolverContext, resolverCtx: ProjectResolverContext,
model: KotlinDslScriptsModel, model: KotlinDslScriptsModel,
projectName: String projectName: String
) { ): Boolean {
if (model is BrokenKotlinDslScriptsModel) { return if (model is BrokenKotlinDslScriptsModel) {
LOG.error( LOG.error(
"Couldn't get KotlinDslScriptsModel for $projectName:\n${model.message}\n${model.stackTrace}" "Couldn't get KotlinDslScriptsModel for $projectName:\n${model.message}\n${model.stackTrace}"
) )
false
} else { } else {
val task = resolverCtx.externalSystemTaskId val task = resolverCtx.externalSystemTaskId
val project = task.findProject() ?: return val project = task.findProject() ?: return false
val models = model.toListOfScriptModels(project) val models = model.toListOfScriptModels(project)
val tasks = KotlinDslSyncListener.instance.tasks val tasks = KotlinDslSyncListener.instance.tasks
@@ -69,17 +69,16 @@ fun processScriptModel(
val errors = models.collectErrors() val errors = models.collectErrors()
if (errors.isNotEmpty()) { if (errors.isNotEmpty()) {
if (sync != null) { sync?.let {
synchronized(sync) { synchronized(it) {
sync.failed = true it.failed = true
} }
} }
throw IllegalStateException( invokeLater(project.disposed) {
KotlinIdeaGradleBundle.message("title.kotlin.build.script") BuildContentManager.getInstance(project).orCreateToolWindow.activate(null, false, false)
+ ":\n" }
+ errors.joinToString("\n") { it.text + "\n" + it.details }
)
} }
errors.isEmpty()
} }
} }
@@ -42,7 +42,9 @@ class KotlinDslScriptModelContributor : ProjectModelContributor {
if (kotlinDslScriptsModelImportSupported(resolverCtx.projectGradleVersion)) { if (kotlinDslScriptsModelImportSupported(resolverCtx.projectGradleVersion)) {
val model = toolingModelsProvider.getProjectModel(it, KotlinDslScriptsModel::class.java) val model = toolingModelsProvider.getProjectModel(it, KotlinDslScriptsModel::class.java)
if (model != null) { if (model != null) {
processScriptModel(resolverCtx, model, projectIdentifier) if (!processScriptModel(resolverCtx, model, projectIdentifier)) {
return@forEach
}
} }
} }