diff --git a/idea/idea-gradle/res/messages/KotlinIdeaGradleBundle.properties b/idea/idea-gradle/res/messages/KotlinIdeaGradleBundle.properties
index 9199abea434..f4cefc85527 100644
--- a/idea/idea-gradle/res/messages/KotlinIdeaGradleBundle.properties
+++ b/idea/idea-gradle/res/messages/KotlinIdeaGradleBundle.properties
@@ -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.
You can import the related Gradle project or click "{0}" to get code insight without importing.
\ No newline at end of file
diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslScrtiptModelProcessor.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslScrtiptModelProcessor.kt
index a28e87af2bd..33b3054f5d2 100644
--- a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslScrtiptModelProcessor.kt
+++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslScrtiptModelProcessor.kt
@@ -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>()
- val syncViewManager = project.service()
- 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().saveCompilationConfigurationAfterImport(scriptConfigurations)
project.service().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()
}
\ No newline at end of file
diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinGradleDslErrorReporter.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinGradleDslErrorReporter.kt
new file mode 100644
index 00000000000..8771765cd7d
--- /dev/null
+++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinGradleDslErrorReporter.kt
@@ -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()
+ 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)
+ ),
+ )
+ }
+ }
+ }
+}
diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinGradleDslErrorReporter.kt.191 b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinGradleDslErrorReporter.kt.191
new file mode 100644
index 00000000000..01989e484e1
--- /dev/null
+++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinGradleDslErrorReporter.kt.191
@@ -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
+ }
+}