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
parent 0e29f6f48b
commit 23d33f51a2
7 changed files with 70 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.project.DumbService
import com.intellij.openapi.project.Project
import com.intellij.openapi.util.Condition
fun <T> runReadAction(action: () -> T): T {
return ApplicationManager.getApplication().runReadAction<T>(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 <reified T : Any> ComponentManager.getServiceSafe(): T =
@@ -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 <T> runReadAction(action: () -> T): T {
return ApplicationManager.getApplication().runReadAction<T>(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 <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.project.Project
import com.intellij.openapi.project.DumbService
import com.intellij.openapi.util.Condition
fun <T> runReadAction(action: () -> T): T {
return ApplicationManager.getApplication().runReadAction<T>(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 <reified T : Any> ComponentManager.getServiceSafe(): T =
@@ -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()
}
}
@@ -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<KotlinDslScriptModel.Message>) {
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)
}
}
@@ -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<KotlinDslScriptModel.Message>) {
throw IllegalStateException(
KotlinIdeaGradleBundle.message("title.kotlin.build.script")
+ ":\n"
+ errors.joinToString("\n") { it.text + "\n" + it.details }
)
}
@@ -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
}
}
}