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 + } +}