From bd0f94722212e2e8a0656f8313e3515dccde0fd0 Mon Sep 17 00:00:00 2001 From: Natalia Selezneva Date: Fri, 28 Jun 2019 10:44:15 +0300 Subject: [PATCH] Refactor script reports: introduce getter, check that report are changed inside attach method --- .../idea/highlighter/KotlinHighlightingUtil.kt | 2 +- .../highlighter/ScriptExternalHighlightingPass.kt | 2 +- .../ScriptExternalHighlightingPass.kt.182 | 2 +- .../kotlin/idea/core/script/IdeScriptReportSink.kt | 13 +++++++++++-- .../script/dependencies/ScriptDependenciesLoader.kt | 4 +--- .../idea/script/AbstractScriptConfigurationTest.kt | 2 +- 6 files changed, 16 insertions(+), 9 deletions(-) diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/highlighter/KotlinHighlightingUtil.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/highlighter/KotlinHighlightingUtil.kt index 0ad1338e000..702befda2b0 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/highlighter/KotlinHighlightingUtil.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/highlighter/KotlinHighlightingUtil.kt @@ -71,7 +71,7 @@ object KotlinHighlightingUtil { private fun shouldHighlightScript(ktFile: KtFile): Boolean { if (isRunningInCidrIde) return false // There is no Java support in CIDR. So do not highlight errors in KTS if running in CIDR. if (!ScriptsCompilationConfigurationUpdater.areDependenciesCached(ktFile)) return false - if (ktFile.virtualFile.getUserData(IdeScriptReportSink.Reports)?.any { it.severity == ScriptReport.Severity.FATAL } == true) { + if (IdeScriptReportSink.getReports(ktFile.virtualFile).any { it.severity == ScriptReport.Severity.FATAL }) { return false } diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/highlighter/ScriptExternalHighlightingPass.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/highlighter/ScriptExternalHighlightingPass.kt index 9d451fe08e2..b8e0ca800bd 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/highlighter/ScriptExternalHighlightingPass.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/highlighter/ScriptExternalHighlightingPass.kt @@ -51,7 +51,7 @@ class ScriptExternalHighlightingPass( if (!file.isScript()) return - val reports = file.virtualFile.getUserData(IdeScriptReportSink.Reports) ?: return + val reports = IdeScriptReportSink.getReports(file.virtualFile) val annotations = reports.mapNotNull { (message, severity, position) -> val (startOffset, endOffset) = position?.let { computeOffsets(document, position) } ?: 0 to 0 diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/highlighter/ScriptExternalHighlightingPass.kt.182 b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/highlighter/ScriptExternalHighlightingPass.kt.182 index 3ae4c5b4186..32afded53f8 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/highlighter/ScriptExternalHighlightingPass.kt.182 +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/highlighter/ScriptExternalHighlightingPass.kt.182 @@ -72,7 +72,7 @@ class ScriptExternalHighlightingPass( } } - val reports = file.virtualFile.getUserData(IdeScriptReportSink.Reports) ?: return + val reports = IdeScriptReportSink.getReports(file.virtualFile) val annotations = reports.mapNotNull { (message, severity, position) -> val (startOffset, endOffset) = position?.let { computeOffsets(document, position) } ?: 0 to 0 diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/IdeScriptReportSink.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/IdeScriptReportSink.kt index 09f692b869a..61148bc351c 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/IdeScriptReportSink.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/IdeScriptReportSink.kt @@ -23,13 +23,16 @@ import com.intellij.openapi.util.Key import com.intellij.openapi.vfs.VirtualFile import com.intellij.psi.PsiManager import com.intellij.ui.EditorNotifications +import org.jetbrains.kotlin.psi.UserDataProperty import org.jetbrains.kotlin.scripting.resolve.ScriptReportSink import kotlin.script.experimental.dependencies.ScriptReport class IdeScriptReportSink(val project: Project) : ScriptReportSink { override fun attachReports(scriptFile: VirtualFile, reports: List) { + if (getReports(scriptFile) == reports) return + // TODO: persist errors between launches? - scriptFile.putUserData(Reports, reports) + scriptFile.scriptReports = reports ApplicationManager.getApplication().invokeLater { if (scriptFile.isValid && !project.isDisposed) { @@ -41,5 +44,11 @@ class IdeScriptReportSink(val project: Project) : ScriptReportSink { } } - object Reports : Key>("KOTLIN_SCRIPT_REPORTS") + companion object { + fun getReports(file: VirtualFile): List { + return file.scriptReports ?: emptyList() + } + + private var VirtualFile.scriptReports: List? by UserDataProperty(Key.create("KOTLIN_SCRIPT_REPORTS")) + } } \ No newline at end of file diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/dependencies/ScriptDependenciesLoader.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/dependencies/ScriptDependenciesLoader.kt index c3cafe6859e..69500989a23 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/dependencies/ScriptDependenciesLoader.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/dependencies/ScriptDependenciesLoader.kt @@ -77,9 +77,7 @@ abstract class ScriptDependenciesLoader(protected val project: Project) { } private fun attachReportsIfChanged(result: ResultWithDiagnostics<*>, file: VirtualFile) { - if (file.getUserData(IdeScriptReportSink.Reports) != result.reports.takeIf { it.isNotEmpty() }) { - reporter.attachReports(file, result.reports.mapToLegacyReports()) - } + reporter.attachReports(file, result.reports.mapToLegacyReports()) } private fun save(compilationConfigurationResult: ScriptCompilationConfigurationResult?, file: VirtualFile) { diff --git a/idea/tests/org/jetbrains/kotlin/idea/script/AbstractScriptConfigurationTest.kt b/idea/tests/org/jetbrains/kotlin/idea/script/AbstractScriptConfigurationTest.kt index d26f3282741..984c48e7435 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/script/AbstractScriptConfigurationTest.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/script/AbstractScriptConfigurationTest.kt @@ -351,7 +351,7 @@ abstract class AbstractScriptConfigurationTest : KotlinCompletionTestCase() { // This is needed because updateScriptDependencies invalidates psiFile that was stored in myFile field myFile = psiManager.findFile(script) - val isFatalErrorPresent = myFile.virtualFile.getUserData(IdeScriptReportSink.Reports)?.any { it.severity == ScriptReport.Severity.FATAL } == true + val isFatalErrorPresent = IdeScriptReportSink.getReports(script).any { it.severity == ScriptReport.Severity.FATAL } assert(isFatalErrorPresent || KotlinHighlightingUtil.shouldHighlight(myFile)) { "Highlighting is switched off for ${myFile.virtualFile.path}" }