Show notification that script dependencies are not ready yet

This commit is contained in:
Natalia Selezneva
2019-02-18 12:20:48 +03:00
parent 1d56f44093
commit 47a4500eaa
3 changed files with 44 additions and 14 deletions
@@ -21,7 +21,7 @@ import org.jetbrains.kotlin.idea.caches.project.NotUnderContentRootModuleInfo
import org.jetbrains.kotlin.idea.caches.project.getModuleInfo import org.jetbrains.kotlin.idea.caches.project.getModuleInfo
import org.jetbrains.kotlin.idea.core.script.IdeScriptReportSink 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.scriptDependencies import org.jetbrains.kotlin.idea.core.script.ScriptDependenciesUpdater
import org.jetbrains.kotlin.idea.util.ProjectRootsUtil import org.jetbrains.kotlin.idea.util.ProjectRootsUtil
import org.jetbrains.kotlin.idea.util.isRunningInCidrIde import org.jetbrains.kotlin.idea.util.isRunningInCidrIde
import org.jetbrains.kotlin.psi.KtCodeFragment import org.jetbrains.kotlin.psi.KtCodeFragment
@@ -67,7 +67,7 @@ object KotlinHighlightingUtil {
@Suppress("DEPRECATION") @Suppress("DEPRECATION")
private fun shouldHighlightScript(ktFile: KtFile): Boolean { 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 (isRunningInCidrIde) return false // There is no Java support in CIDR. So do not highlight errors in KTS if running in CIDR.
if (ktFile.virtualFile.scriptDependencies == null) return false if (!ScriptDependenciesUpdater.areDependenciesCached(ktFile)) return false
if (ktFile.virtualFile.getUserData(IdeScriptReportSink.Reports)?.any { it.severity == ScriptReport.Severity.FATAL } == true) { if (ktFile.virtualFile.getUserData(IdeScriptReportSink.Reports)?.any { it.severity == ScriptReport.Severity.FATAL } == true) {
return false return false
} }
@@ -38,6 +38,7 @@ 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.core.script.ScriptDefinitionsManager import org.jetbrains.kotlin.idea.core.script.ScriptDefinitionsManager
import org.jetbrains.kotlin.idea.core.script.ScriptDependenciesUpdater
import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtFile
import kotlin.script.experimental.dependencies.ScriptReport import kotlin.script.experimental.dependencies.ScriptReport
@@ -53,18 +54,17 @@ class ScriptExternalHighlightingPass(
if (!file.isScript()) return if (!file.isScript()) return
if (!ScriptDefinitionsManager.getInstance(file.project).isReady()) { if (!ScriptDefinitionsManager.getInstance(file.project).isReady()) {
UIUtil.invokeLaterIfNeeded { showNotification(
val ideFrame = WindowManager.getInstance().getIdeFrame(file.project) file,
if (ideFrame != null) { "Highlighting in scripts is not available until all Script Definitions are loaded"
val statusBar = ideFrame.statusBar as StatusBarEx )
statusBar.notifyProgressByBalloon( }
MessageType.WARNING,
"Highlighting in scripts is not available until all Script Definitions are loaded", if (!ScriptDependenciesUpdater.areDependenciesCached(file)) {
null, showNotification(
null file,
) "Highlighting in scripts is not available until all Script Dependencies are loaded"
} )
}
} }
val reports = file.virtualFile.getUserData(IdeScriptReportSink.Reports) ?: return val reports = file.virtualFile.getUserData(IdeScriptReportSink.Reports) ?: return
@@ -118,6 +118,21 @@ class ScriptExternalHighlightingPass(
} }
} }
private fun showNotification(file: KtFile, message: String) {
UIUtil.invokeLaterIfNeeded {
val ideFrame = WindowManager.getInstance().getIdeFrame(file.project)
if (ideFrame != null) {
val statusBar = ideFrame.statusBar as StatusBarEx
statusBar.notifyProgressByBalloon(
MessageType.WARNING,
message,
null,
null
)
}
}
}
class Factory(registrar: TextEditorHighlightingPassRegistrar) : ProjectComponent, class Factory(registrar: TextEditorHighlightingPassRegistrar) : ProjectComponent,
TextEditorHighlightingPassFactory { TextEditorHighlightingPassFactory {
init { init {
@@ -18,6 +18,7 @@ package org.jetbrains.kotlin.idea.core.script
import com.intellij.openapi.application.Application import com.intellij.openapi.application.Application
import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.application.ApplicationManager
import com.intellij.openapi.components.ServiceManager
import com.intellij.openapi.editor.EditorFactory import com.intellij.openapi.editor.EditorFactory
import com.intellij.openapi.editor.event.DocumentEvent import com.intellij.openapi.editor.event.DocumentEvent
import com.intellij.openapi.editor.event.DocumentListener import com.intellij.openapi.editor.event.DocumentListener
@@ -148,6 +149,20 @@ class ScriptDependenciesUpdater(
} }
}, project.messageBus.connect()) }, project.messageBus.connect())
} }
private fun areDependenciesCached(file: VirtualFile): Boolean {
return cache[file] != null
}
companion object {
@JvmStatic
fun getInstance(project: Project): ScriptDependenciesUpdater =
ServiceManager.getService(project, ScriptDependenciesUpdater::class.java)
fun areDependenciesCached(file: KtFile): Boolean {
return getInstance(file.project).areDependenciesCached(file.virtualFile)
}
}
} }
@set: TestOnly @set: TestOnly