build.gradle.kts: report error to build tool window

Move errors found in KotlinDslScriptModels from Messages Toolwindow to Build Toolwindow
This commit is contained in:
Natalia Selezneva
2020-03-19 15:07:41 +03:00
parent 643e31b2e7
commit 73ca9d1b54
4 changed files with 100 additions and 71 deletions
@@ -40,6 +40,6 @@ text.see.manual.installation.instructions=See manual installation instructions <
text.the.associated.gradle.project.isn.t.imported=The associated Gradle Project isn't imported.
text.was.modified={0} was modified
title.configure.kotlin.gradle.plugin=Configure Kotlin-Gradle Plugin
title.kotlin.build.script=Kotlin Build Script
title.kotlin.build.script=Gradle Kotlin DSL Scripts errors
title.update.language.version=Update Language Version
tool.tip.text.the.external.gradle.project.needs.to.be.imported.to.get.this.script.analyzed=The external Gradle project needs to be imported to get this script analyzed. <br/>You can import the related Gradle project or click "{0}" to get code insight without importing.
@@ -5,19 +5,9 @@
package org.jetbrains.kotlin.idea.scripting.gradle.importing
import com.intellij.build.SyncViewManager
import com.intellij.openapi.components.service
import com.intellij.openapi.externalSystem.service.execution.ExternalSystemEventDispatcher
import com.intellij.openapi.externalSystem.service.notification.ExternalSystemNotificationManager
import com.intellij.openapi.externalSystem.service.notification.NotificationCategory
import com.intellij.openapi.externalSystem.service.notification.NotificationData
import com.intellij.openapi.externalSystem.service.notification.NotificationSource
import com.intellij.openapi.fileEditor.OpenFileDescriptor
import com.intellij.openapi.project.Project
import com.intellij.openapi.vfs.VfsUtil
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.pom.Navigatable
import org.jetbrains.kotlin.idea.KotlinIdeaGradleBundle
import org.jetbrains.kotlin.idea.core.script.ScriptConfigurationManager
import org.jetbrains.kotlin.idea.core.script.configuration.cache.CachedConfigurationInputs
import org.jetbrains.kotlin.idea.core.script.configuration.cache.ScriptConfigurationSnapshot
@@ -29,7 +19,6 @@ import org.jetbrains.kotlin.scripting.resolve.ScriptCompilationConfigurationWrap
import org.jetbrains.kotlin.scripting.resolve.VirtualFileScriptSource
import org.jetbrains.kotlin.scripting.resolve.adjustByDefinition
import org.jetbrains.plugins.gradle.service.project.ProjectResolverContext
import org.jetbrains.plugins.gradle.util.GradleConstants
import java.io.File
import kotlin.script.experimental.api.*
import kotlin.script.experimental.jvm.JvmDependency
@@ -46,19 +35,17 @@ fun saveScriptModels(
val scriptConfigurations = mutableListOf<Pair<VirtualFile, ScriptConfigurationSnapshot>>()
val syncViewManager = project.service<SyncViewManager>()
val buildEventDispatcher =
ExternalSystemEventDispatcher(task, syncViewManager)
val errorReporter = KotlinGradleDslErrorReporter(project, task)
val javaHome = settings.javaHome?.let { File(it) }
models.forEach { buildScript ->
val scriptFile = File(buildScript.file)
models.forEach { model ->
val scriptFile = File(model.file)
val virtualFile = VfsUtil.findFile(scriptFile.toPath(), true)!!
val inputs = getGradleScriptInputsStamp(
project,
virtualFile,
givenTimeStamp = buildScript.inputsTimeStamp
givenTimeStamp = model.inputsTimeStamp
)
val definition = virtualFile.findScriptDefinition(project) ?: return@forEach
@@ -68,13 +55,13 @@ fun saveScriptModels(
if (javaHome != null) {
jvm.jdkHome(javaHome)
}
defaultImports(buildScript.imports)
dependencies(JvmDependency(buildScript.classPath.map {
defaultImports(model.imports)
dependencies(JvmDependency(model.classPath.map {
File(
it
)
}))
ide.dependenciesSources(JvmDependency(buildScript.sourcePath.map {
ide.dependenciesSources(JvmDependency(model.sourcePath.map {
File(
it
)
@@ -96,9 +83,7 @@ fun saveScriptModels(
),
)
buildScript.messages.forEach {
addBuildScriptDiagnosticMessage(it, virtualFile, project)
}
errorReporter.reportError(scriptFile, model)
}
saveGradleProjectRootsAfterImport(
@@ -107,51 +92,4 @@ fun saveScriptModels(
project.service<ScriptConfigurationManager>().saveCompilationConfigurationAfterImport(scriptConfigurations)
project.service<GradleScriptInputsWatcher>().clearState()
}
private fun addBuildScriptDiagnosticMessage(
message: KotlinDslScriptModel.Message,
virtualFile: VirtualFile,
project: Project
) {
val notification = NotificationData(
KotlinIdeaGradleBundle.message("title.kotlin.build.script"),
message.text,
when (message.severity) {
KotlinDslScriptModel.Severity.WARNING -> NotificationCategory.WARNING
KotlinDslScriptModel.Severity.ERROR -> NotificationCategory.ERROR
},
NotificationSource.PROJECT_SYNC
)
notification.navigatable =
LazyNavigatable(
virtualFile,
project,
message.position
)
ExternalSystemNotificationManager.getInstance(project).showNotification(
GradleConstants.SYSTEM_ID,
notification
)
}
class LazyNavigatable internal constructor(
private val virtualFile: VirtualFile,
private val project: Project,
val position: KotlinDslScriptModel.Position?
) : Navigatable {
private val openFileDescriptor: Navigatable by lazy {
if (position != null) OpenFileDescriptor(project, virtualFile, position.line, position.column)
else OpenFileDescriptor(project, virtualFile, -1)
}
override fun navigate(requestFocus: Boolean) {
if (openFileDescriptor.canNavigate()) openFileDescriptor.navigate(requestFocus)
}
override fun canNavigate(): Boolean = virtualFile.exists()
override fun canNavigateToSource(): Boolean = canNavigate()
}
@@ -0,0 +1,66 @@
/*
* 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.FilePosition
import com.intellij.build.SyncViewManager
import com.intellij.build.events.MessageEvent
import com.intellij.build.events.impl.FileMessageEventImpl
import com.intellij.build.events.impl.MessageEventImpl
import com.intellij.openapi.components.service
import com.intellij.openapi.externalSystem.model.task.ExternalSystemTaskId
import com.intellij.openapi.externalSystem.service.execution.ExternalSystemEventDispatcher
import com.intellij.openapi.project.Project
import java.io.File
private const val gradle_build_script_errors_group = "Kotlin Build Script Errors"
@Suppress("UnstableApiUsage")
class KotlinGradleDslErrorReporter(
project: Project,
private val task: ExternalSystemTaskId
) {
private val syncViewManager = project.service<SyncViewManager>()
private val buildEventDispatcher = ExternalSystemEventDispatcher(task, syncViewManager)
fun reportError(
scriptFile: File,
model: KotlinDslScriptModel
) {
model.messages.forEach {
val severity = when (it.severity) {
KotlinDslScriptModel.Severity.WARNING -> MessageEvent.Kind.WARNING
KotlinDslScriptModel.Severity.ERROR -> MessageEvent.Kind.ERROR
}
val position = it.position
if (position == null) {
buildEventDispatcher.onEvent(
task,
MessageEventImpl(
task,
severity,
gradle_build_script_errors_group,
it.text,
it.details
)
)
} else {
buildEventDispatcher.onEvent(
task,
FileMessageEventImpl(
task,
severity,
gradle_build_script_errors_group,
it.text, it.details,
// 0-based line numbers
FilePosition(scriptFile, position.line - 1, position.column)
),
)
}
}
}
}
@@ -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.
*/
@file:Suppress("UNUSED_PARAMETER", "unused")
package org.jetbrains.kotlin.idea.scripting.gradle.importing
import com.intellij.openapi.externalSystem.model.task.ExternalSystemTaskId
import com.intellij.openapi.project.Project
import java.io.File
class KotlinGradleDslErrorReporter(
private val project: Project,
private val task: ExternalSystemTaskId
) {
fun reportError(
scriptFile: File,
model: KotlinDslScriptModel
) {
// KotlinDslModels aren't imported in 191
}
}