Add Show Kotlin Gradle DSL Logs Action (KT-31440)
Provide a label for this action in some script diagnostics from gradle dsl resolver ^KT-31440 Fixed
This commit is contained in:
+21
@@ -0,0 +1,21 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2019 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("PackageDirectoryMismatch")
|
||||||
|
// TODO: move to scripting-idea module
|
||||||
|
package org.jetbrains.kotlin.idea.script
|
||||||
|
|
||||||
|
import com.intellij.codeInsight.intention.IntentionAction
|
||||||
|
import com.intellij.openapi.extensions.ExtensionPointName
|
||||||
|
import kotlin.script.experimental.api.ScriptDiagnostic
|
||||||
|
|
||||||
|
interface ScriptDiagnosticFixProvider {
|
||||||
|
|
||||||
|
fun provideFixes(annotation: ScriptDiagnostic): List<IntentionAction>
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
val EP_NAME = ExtensionPointName.create<ScriptDiagnosticFixProvider>("org.jetbrains.kotlin.scriptDiagnosticFixProvider")
|
||||||
|
}
|
||||||
|
}
|
||||||
+12
-5
@@ -37,6 +37,7 @@ import com.intellij.openapi.wm.ex.StatusBarEx
|
|||||||
import com.intellij.psi.PsiFile
|
import com.intellij.psi.PsiFile
|
||||||
import com.intellij.util.ui.UIUtil
|
import com.intellij.util.ui.UIUtil
|
||||||
import org.jetbrains.kotlin.idea.core.script.IdeScriptReportSink
|
import org.jetbrains.kotlin.idea.core.script.IdeScriptReportSink
|
||||||
|
import org.jetbrains.kotlin.idea.script.ScriptDiagnosticFixProvider
|
||||||
import org.jetbrains.kotlin.psi.KtFile
|
import org.jetbrains.kotlin.psi.KtFile
|
||||||
import kotlin.script.experimental.api.ScriptDiagnostic
|
import kotlin.script.experimental.api.ScriptDiagnostic
|
||||||
import kotlin.script.experimental.api.SourceCode
|
import kotlin.script.experimental.api.SourceCode
|
||||||
@@ -54,19 +55,25 @@ class ScriptExternalHighlightingPass(
|
|||||||
|
|
||||||
val reports = IdeScriptReportSink.getReports(file.virtualFile)
|
val reports = IdeScriptReportSink.getReports(file.virtualFile)
|
||||||
|
|
||||||
val annotations = reports.mapNotNull { (message, severity, _ , location) ->
|
val annotations = reports.mapNotNull { scriptDiagnostic ->
|
||||||
val (startOffset, endOffset) = location?.let { computeOffsets(document, it) } ?: 0 to 0
|
val (startOffset, endOffset) = scriptDiagnostic.location?.let { computeOffsets(document, it) } ?: 0 to 0
|
||||||
val annotation = Annotation(
|
val annotation = Annotation(
|
||||||
startOffset,
|
startOffset,
|
||||||
endOffset,
|
endOffset,
|
||||||
severity.convertSeverity() ?: return@mapNotNull null,
|
scriptDiagnostic.severity.convertSeverity() ?: return@mapNotNull null,
|
||||||
message,
|
scriptDiagnostic.message,
|
||||||
message
|
scriptDiagnostic.message
|
||||||
)
|
)
|
||||||
|
|
||||||
// if range is empty, show notification panel in editor
|
// if range is empty, show notification panel in editor
|
||||||
annotation.isFileLevelAnnotation = startOffset == endOffset
|
annotation.isFileLevelAnnotation = startOffset == endOffset
|
||||||
|
|
||||||
|
for (provider in ScriptDiagnosticFixProvider.EP_NAME.extensions) {
|
||||||
|
provider.provideFixes(scriptDiagnostic).forEach {
|
||||||
|
annotation.registerFix(it)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
annotation
|
annotation
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+12
-5
@@ -40,6 +40,7 @@ import org.jetbrains.kotlin.idea.core.script.IdeScriptReportSink
|
|||||||
import org.jetbrains.kotlin.idea.core.script.ScriptDefinitionsManager
|
import org.jetbrains.kotlin.idea.core.script.ScriptDefinitionsManager
|
||||||
import org.jetbrains.kotlin.idea.core.script.ScriptDependenciesManager
|
import org.jetbrains.kotlin.idea.core.script.ScriptDependenciesManager
|
||||||
import org.jetbrains.kotlin.idea.core.script.ScriptsCompilationConfigurationUpdater
|
import org.jetbrains.kotlin.idea.core.script.ScriptsCompilationConfigurationUpdater
|
||||||
|
import org.jetbrains.kotlin.idea.script.ScriptDiagnosticFixProvider
|
||||||
import org.jetbrains.kotlin.psi.KtFile
|
import org.jetbrains.kotlin.psi.KtFile
|
||||||
import kotlin.script.experimental.api.ScriptDiagnostic
|
import kotlin.script.experimental.api.ScriptDiagnostic
|
||||||
import kotlin.script.experimental.api.SourceCode
|
import kotlin.script.experimental.api.SourceCode
|
||||||
@@ -75,19 +76,25 @@ class ScriptExternalHighlightingPass(
|
|||||||
|
|
||||||
val reports = IdeScriptReportSink.getReports(file.virtualFile)
|
val reports = IdeScriptReportSink.getReports(file.virtualFile)
|
||||||
|
|
||||||
val annotations = reports.mapNotNull { (message, severity, _ , location) ->
|
val annotations = reports.mapNotNull { scriptDiagnostic ->
|
||||||
val (startOffset, endOffset) = location?.let { computeOffsets(document, it) } ?: 0 to 0
|
val (startOffset, endOffset) = scriptDiagnostic.location?.let { computeOffsets(document, it) } ?: 0 to 0
|
||||||
val annotation = Annotation(
|
val annotation = Annotation(
|
||||||
startOffset,
|
startOffset,
|
||||||
endOffset,
|
endOffset,
|
||||||
severity.convertSeverity() ?: return@mapNotNull null,
|
scriptDiagnostic.severity.convertSeverity() ?: return@mapNotNull null,
|
||||||
message,
|
scriptDiagnostic.message,
|
||||||
message
|
scriptDiagnostic.message
|
||||||
)
|
)
|
||||||
|
|
||||||
// if range is empty, show notification panel in editor
|
// if range is empty, show notification panel in editor
|
||||||
annotation.isFileLevelAnnotation = startOffset == endOffset
|
annotation.isFileLevelAnnotation = startOffset == endOffset
|
||||||
|
|
||||||
|
for (provider in ScriptDiagnosticFixProvider.EP_NAME.extensions) {
|
||||||
|
provider.provideFixes(scriptDiagnostic).forEach {
|
||||||
|
annotation.registerFix(it)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
annotation
|
annotation
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,83 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2019 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.actions
|
||||||
|
|
||||||
|
import com.intellij.codeInsight.intention.IntentionAction
|
||||||
|
import com.intellij.ide.actions.ShowFilePathAction
|
||||||
|
import com.intellij.openapi.actionSystem.AnAction
|
||||||
|
import com.intellij.openapi.actionSystem.AnActionEvent
|
||||||
|
import com.intellij.openapi.editor.Editor
|
||||||
|
import com.intellij.openapi.project.DumbAware
|
||||||
|
import com.intellij.openapi.project.Project
|
||||||
|
import com.intellij.openapi.ui.MessageType
|
||||||
|
import com.intellij.openapi.ui.popup.JBPopupFactory
|
||||||
|
import com.intellij.openapi.util.SystemInfo
|
||||||
|
import com.intellij.openapi.wm.WindowManager
|
||||||
|
import com.intellij.psi.PsiFile
|
||||||
|
import com.intellij.ui.BrowserHyperlinkListener
|
||||||
|
import java.io.File
|
||||||
|
|
||||||
|
class ShowKotlinGradleDslLogs : IntentionAction, AnAction(), DumbAware {
|
||||||
|
override fun invoke(project: Project, editor: Editor?, file: PsiFile?) {
|
||||||
|
openLogsDirIfPresent(project)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun actionPerformed(e: AnActionEvent) {
|
||||||
|
openLogsDirIfPresent(e.project)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun isAvailable(project: Project, editor: Editor?, file: PsiFile?) = ShowFilePathAction.isSupported()
|
||||||
|
|
||||||
|
override fun update(e: AnActionEvent) {
|
||||||
|
val presentation = e.presentation
|
||||||
|
presentation.isVisible = ShowFilePathAction.isSupported()
|
||||||
|
presentation.text = NAME
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun openLogsDirIfPresent(project: Project?) {
|
||||||
|
val logsDir = findLogsDir()
|
||||||
|
if (logsDir != null) {
|
||||||
|
ShowFilePathAction.openDirectory(logsDir)
|
||||||
|
} else {
|
||||||
|
val parent = WindowManager.getInstance().getStatusBar(project)?.component
|
||||||
|
?: WindowManager.getInstance().findVisibleFrame().rootPane
|
||||||
|
JBPopupFactory.getInstance()
|
||||||
|
.createHtmlTextBalloonBuilder(
|
||||||
|
"Gradle DSL Logs cannot be found automatically.<br/>See how to find logs <a href=\"$gradleTroubleshootingLink\">here</a>.",
|
||||||
|
MessageType.ERROR,
|
||||||
|
BrowserHyperlinkListener.INSTANCE
|
||||||
|
)
|
||||||
|
.setFadeoutTime(5000)
|
||||||
|
.createBalloon()
|
||||||
|
.showInCenterOf(parent)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** The way how to find Gradle logs is described here
|
||||||
|
* @see org.jetbrains.kotlin.idea.actions.ShowKotlinGradleDslLogs.gradleTroubleshootingLink
|
||||||
|
*/
|
||||||
|
private fun findLogsDir(): File? {
|
||||||
|
val userHome = System.getProperty("user.home")
|
||||||
|
return when {
|
||||||
|
SystemInfo.isMac -> File("$userHome/Library/Logs/gradle-kotlin-dsl")
|
||||||
|
SystemInfo.isLinux -> File("$userHome/.gradle-kotlin-dsl/logs")
|
||||||
|
SystemInfo.isWindows -> File("$userHome/AppData/Local/gradle-kotlin-dsl/log")
|
||||||
|
else -> null
|
||||||
|
}.takeIf { it?.exists() == true }
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun startInWriteAction() = false
|
||||||
|
|
||||||
|
override fun getText() = NAME
|
||||||
|
|
||||||
|
override fun getFamilyName() = NAME
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
private const val gradleTroubleshootingLink = "https://docs.gradle.org/current/userguide/kotlin_dsl.html#troubleshooting"
|
||||||
|
|
||||||
|
val NAME = "Show Kotlin Gradle DSL Logs in ${ShowFilePathAction.getFileManagerName()}"
|
||||||
|
}
|
||||||
|
}
|
||||||
+25
@@ -0,0 +1,25 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2019 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.script
|
||||||
|
|
||||||
|
import com.intellij.codeInsight.intention.IntentionAction
|
||||||
|
import org.jetbrains.kotlin.idea.actions.ShowKotlinGradleDslLogs
|
||||||
|
import kotlin.script.experimental.api.ScriptDiagnostic
|
||||||
|
|
||||||
|
class GradleScriptDiagnosticFixProvider : ScriptDiagnosticFixProvider {
|
||||||
|
override fun provideFixes(annotation: ScriptDiagnostic): List<IntentionAction> {
|
||||||
|
if (gradleMessagesForQuickFix.any { annotation.message.contains(it) }) {
|
||||||
|
return listOf(ShowKotlinGradleDslLogs())
|
||||||
|
}
|
||||||
|
return emptyList()
|
||||||
|
}
|
||||||
|
|
||||||
|
private val gradleMessagesForQuickFix = arrayListOf(
|
||||||
|
"This script caused build configuration to fail",
|
||||||
|
"see IDE logs for more information",
|
||||||
|
"Script dependencies resolution failed"
|
||||||
|
)
|
||||||
|
}
|
||||||
@@ -52,6 +52,9 @@
|
|||||||
|
|
||||||
<extensionPoint qualifiedName="org.jetbrains.kotlin.j2kConverterExtension"
|
<extensionPoint qualifiedName="org.jetbrains.kotlin.j2kConverterExtension"
|
||||||
interface="org.jetbrains.kotlin.j2k.J2kConverterExtension"/>
|
interface="org.jetbrains.kotlin.j2k.J2kConverterExtension"/>
|
||||||
|
|
||||||
|
<extensionPoint qualifiedName="org.jetbrains.kotlin.scriptDiagnosticFixProvider"
|
||||||
|
interface="org.jetbrains.kotlin.idea.script.ScriptDiagnosticFixProvider"/>
|
||||||
</extensionPoints>
|
</extensionPoints>
|
||||||
|
|
||||||
<extensions defaultExtensionNs="org.jetbrains.kotlin">
|
<extensions defaultExtensionNs="org.jetbrains.kotlin">
|
||||||
|
|||||||
@@ -60,6 +60,9 @@
|
|||||||
|
|
||||||
<extensionPoint qualifiedName="org.jetbrains.kotlin.j2kConverterExtension"
|
<extensionPoint qualifiedName="org.jetbrains.kotlin.j2kConverterExtension"
|
||||||
interface="org.jetbrains.kotlin.j2k.J2kConverterExtension"/>
|
interface="org.jetbrains.kotlin.j2k.J2kConverterExtension"/>
|
||||||
|
|
||||||
|
<extensionPoint qualifiedName="org.jetbrains.kotlin.scriptDiagnosticFixProvider"
|
||||||
|
interface="org.jetbrains.kotlin.idea.script.ScriptDiagnosticFixProvider"/>
|
||||||
</extensionPoints>
|
</extensionPoints>
|
||||||
|
|
||||||
<extensions defaultExtensionNs="org.jetbrains.kotlin">
|
<extensions defaultExtensionNs="org.jetbrains.kotlin">
|
||||||
|
|||||||
@@ -47,11 +47,14 @@
|
|||||||
interface="org.jetbrains.kotlin.synthetic.SyntheticScopeProviderExtension"
|
interface="org.jetbrains.kotlin.synthetic.SyntheticScopeProviderExtension"
|
||||||
area="IDEA_PROJECT"/>
|
area="IDEA_PROJECT"/>
|
||||||
|
|
||||||
|
<extensionPoint qualifiedName="org.jetbrains.kotlin.resolveScopeEnlarger"
|
||||||
|
interface="org.jetbrains.kotlin.idea.caches.resolve.util.KotlinResolveScopeEnlarger"/>
|
||||||
|
|
||||||
<extensionPoint qualifiedName="org.jetbrains.kotlin.j2kConverterExtension"
|
<extensionPoint qualifiedName="org.jetbrains.kotlin.j2kConverterExtension"
|
||||||
interface="org.jetbrains.kotlin.j2k.J2kConverterExtension"/>
|
interface="org.jetbrains.kotlin.j2k.J2kConverterExtension"/>
|
||||||
|
|
||||||
<extensionPoint qualifiedName="org.jetbrains.kotlin.resolveScopeEnlarger"
|
<extensionPoint qualifiedName="org.jetbrains.kotlin.scriptDiagnosticFixProvider"
|
||||||
interface="org.jetbrains.kotlin.idea.caches.resolve.util.KotlinResolveScopeEnlarger"/>
|
interface="org.jetbrains.kotlin.idea.script.ScriptDiagnosticFixProvider"/>
|
||||||
</extensionPoints>
|
</extensionPoints>
|
||||||
|
|
||||||
<extensions defaultExtensionNs="org.jetbrains.kotlin">
|
<extensions defaultExtensionNs="org.jetbrains.kotlin">
|
||||||
|
|||||||
@@ -47,11 +47,14 @@
|
|||||||
interface="org.jetbrains.kotlin.synthetic.SyntheticScopeProviderExtension"
|
interface="org.jetbrains.kotlin.synthetic.SyntheticScopeProviderExtension"
|
||||||
area="IDEA_PROJECT"/>
|
area="IDEA_PROJECT"/>
|
||||||
|
|
||||||
|
<extensionPoint qualifiedName="org.jetbrains.kotlin.resolveScopeEnlarger"
|
||||||
|
interface="org.jetbrains.kotlin.idea.caches.resolve.util.KotlinResolveScopeEnlarger"/>
|
||||||
|
|
||||||
<extensionPoint qualifiedName="org.jetbrains.kotlin.j2kConverterExtension"
|
<extensionPoint qualifiedName="org.jetbrains.kotlin.j2kConverterExtension"
|
||||||
interface="org.jetbrains.kotlin.j2k.J2kConverterExtension"/>
|
interface="org.jetbrains.kotlin.j2k.J2kConverterExtension"/>
|
||||||
|
|
||||||
<extensionPoint qualifiedName="org.jetbrains.kotlin.resolveScopeEnlarger"
|
<extensionPoint qualifiedName="org.jetbrains.kotlin.scriptDiagnosticFixProvider"
|
||||||
interface="org.jetbrains.kotlin.idea.caches.resolve.util.KotlinResolveScopeEnlarger"/>
|
interface="org.jetbrains.kotlin.idea.script.ScriptDiagnosticFixProvider"/>
|
||||||
</extensionPoints>
|
</extensionPoints>
|
||||||
|
|
||||||
<extensions defaultExtensionNs="org.jetbrains.kotlin">
|
<extensions defaultExtensionNs="org.jetbrains.kotlin">
|
||||||
|
|||||||
@@ -9,6 +9,7 @@
|
|||||||
|
|
||||||
<extensions defaultExtensionNs="org.jetbrains.kotlin">
|
<extensions defaultExtensionNs="org.jetbrains.kotlin">
|
||||||
<buildSystemTypeDetector implementation="org.jetbrains.kotlin.idea.configuration.GradleDetector"/>
|
<buildSystemTypeDetector implementation="org.jetbrains.kotlin.idea.configuration.GradleDetector"/>
|
||||||
|
<scriptDiagnosticFixProvider implementation="org.jetbrains.kotlin.idea.script.GradleScriptDiagnosticFixProvider"/>
|
||||||
</extensions>
|
</extensions>
|
||||||
|
|
||||||
<extensions defaultExtensionNs="org.jetbrains.plugins.gradle">
|
<extensions defaultExtensionNs="org.jetbrains.plugins.gradle">
|
||||||
@@ -22,4 +23,10 @@
|
|||||||
<externalProjectDataService implementation="org.jetbrains.kotlin.idea.configuration.KotlinSourceSetDataService"/>
|
<externalProjectDataService implementation="org.jetbrains.kotlin.idea.configuration.KotlinSourceSetDataService"/>
|
||||||
<externalProjectDataService implementation="org.jetbrains.kotlin.idea.configuration.KotlinGradleProjectSettingsDataService"/>
|
<externalProjectDataService implementation="org.jetbrains.kotlin.idea.configuration.KotlinGradleProjectSettingsDataService"/>
|
||||||
</extensions>
|
</extensions>
|
||||||
|
|
||||||
|
<actions>
|
||||||
|
<action id="Kotlin.Gradle.ShowDslLogs" class="org.jetbrains.kotlin.idea.actions.ShowKotlinGradleDslLogs"
|
||||||
|
text="Show Kotlin Gradle DSL Logs" description="Show Kotlin Gradle DSL logs">
|
||||||
|
</action>
|
||||||
|
</actions>
|
||||||
</idea-plugin>
|
</idea-plugin>
|
||||||
|
|||||||
@@ -9,6 +9,7 @@
|
|||||||
|
|
||||||
<extensions defaultExtensionNs="org.jetbrains.kotlin">
|
<extensions defaultExtensionNs="org.jetbrains.kotlin">
|
||||||
<buildSystemTypeDetector implementation="org.jetbrains.kotlin.idea.configuration.GradleDetector"/>
|
<buildSystemTypeDetector implementation="org.jetbrains.kotlin.idea.configuration.GradleDetector"/>
|
||||||
|
<scriptDiagnosticFixProvider implementation="org.jetbrains.kotlin.idea.script.GradleScriptDiagnosticFixProvider"/>
|
||||||
</extensions>
|
</extensions>
|
||||||
|
|
||||||
<extensions defaultExtensionNs="org.jetbrains.plugins.gradle">
|
<extensions defaultExtensionNs="org.jetbrains.plugins.gradle">
|
||||||
@@ -21,4 +22,10 @@
|
|||||||
<externalProjectDataService implementation="org.jetbrains.kotlin.idea.configuration.KotlinSourceSetDataService"/>
|
<externalProjectDataService implementation="org.jetbrains.kotlin.idea.configuration.KotlinSourceSetDataService"/>
|
||||||
<externalProjectDataService implementation="org.jetbrains.kotlin.idea.configuration.KotlinGradleProjectSettingsDataService"/>
|
<externalProjectDataService implementation="org.jetbrains.kotlin.idea.configuration.KotlinGradleProjectSettingsDataService"/>
|
||||||
</extensions>
|
</extensions>
|
||||||
|
|
||||||
|
<actions>
|
||||||
|
<action id="Kotlin.Gradle.ShowDslLogs" class="org.jetbrains.kotlin.idea.actions.ShowKotlinGradleDslLogs"
|
||||||
|
text="Show Kotlin Gradle DSL Logs" description="Show Kotlin Gradle DSL logs">
|
||||||
|
</action>
|
||||||
|
</actions>
|
||||||
</idea-plugin>
|
</idea-plugin>
|
||||||
|
|||||||
Reference in New Issue
Block a user