diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/LoadScriptConfigurationNotificationFactory.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/LoadScriptConfigurationNotificationFactory.kt index a396052edd3..1342d62b0ac 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/LoadScriptConfigurationNotificationFactory.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/LoadScriptConfigurationNotificationFactory.kt @@ -62,7 +62,7 @@ object LoadScriptConfigurationNotificationFactory { if (project.isDisposed) return@invokeLater val fileEditorManager = FileEditorManager.getInstance(project) - (fileEditorManager.getSelectedEditor(this))?.let { + fileEditorManager.getAllEditors(this).forEach { f(it, fileEditorManager) } } diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/configuration/DefaultScriptingSupport.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/configuration/DefaultScriptingSupport.kt index 18126a41b9d..3f5cadae0ea 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/configuration/DefaultScriptingSupport.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/configuration/DefaultScriptingSupport.kt @@ -337,6 +337,16 @@ class DefaultScriptingSupport(manager: CompositeScriptConfigurationManager) : De } } + fun ensureNotificationsRemoved(file: VirtualFile) { + if (cache.remove(file)) { + saveReports(file, listOf()) + file.removeScriptDependenciesNotificationPanel(project) + } + + // this notification can be shown before something will be in cache + LoadScriptConfigurationNotificationFactory.hideNotification(file, project) + } + companion object { fun getInstance(project: Project) = (ScriptConfigurationManager.getInstance(project) as CompositeScriptConfigurationManager).default diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/configuration/cache/ScriptConfigurationCache.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/configuration/cache/ScriptConfigurationCache.kt index 21497661754..120900f12c4 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/configuration/cache/ScriptConfigurationCache.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/configuration/cache/ScriptConfigurationCache.kt @@ -30,6 +30,7 @@ interface ScriptConfigurationCache { fun setApplied(file: VirtualFile, configurationSnapshot: ScriptConfigurationSnapshot) fun setLoaded(file: VirtualFile, configurationSnapshot: ScriptConfigurationSnapshot) + fun remove(file: VirtualFile): Boolean fun allApplied(): List> fun clear() diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/configuration/cache/ScriptConfigurationMemoryCache.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/configuration/cache/ScriptConfigurationMemoryCache.kt index b5a0469ac0f..025738c142f 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/configuration/cache/ScriptConfigurationMemoryCache.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/configuration/cache/ScriptConfigurationMemoryCache.kt @@ -33,6 +33,9 @@ open class ScriptConfigurationMemoryCache( memoryCache.put(file, old.copy(applied = configurationSnapshot)) } + override fun remove(file: VirtualFile) = + memoryCache.remove(file) + @Synchronized override fun setLoaded(file: VirtualFile, configurationSnapshot: ScriptConfigurationSnapshot) { val old = memoryCache[file] ?: ScriptConfigurationState() diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ucache/ScriptClassRootsUpdater.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ucache/ScriptClassRootsUpdater.kt index f8f830872f9..7aeaf48a7bb 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ucache/ScriptClassRootsUpdater.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ucache/ScriptClassRootsUpdater.kt @@ -23,12 +23,14 @@ import com.intellij.psi.PsiManager import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch import org.jetbrains.kotlin.idea.core.script.KotlinScriptDependenciesClassFinder +import org.jetbrains.kotlin.idea.core.script.ScriptConfigurationManager import org.jetbrains.kotlin.idea.core.script.ScriptDependenciesModificationTracker import org.jetbrains.kotlin.idea.core.script.configuration.CompositeScriptConfigurationManager import org.jetbrains.kotlin.idea.core.script.debug import org.jetbrains.kotlin.idea.core.util.EDT import org.jetbrains.kotlin.idea.util.application.runReadAction import org.jetbrains.kotlin.idea.util.application.runWriteAction +import org.jetbrains.kotlin.psi.KtFile import java.util.concurrent.atomic.AtomicInteger import java.util.concurrent.atomic.AtomicReference @@ -233,7 +235,7 @@ class ScriptClassRootsUpdater( private fun updateHighlighting(project: Project, filter: (VirtualFile) -> Boolean) { if (!project.isOpen) return - val openFiles = FileEditorManager.getInstance(project).openFiles + val openFiles = FileEditorManager.getInstance(project).allEditors.mapNotNull { it.file } val openedScripts = openFiles.filter { filter(it) } if (openedScripts.isEmpty()) return @@ -243,7 +245,12 @@ class ScriptClassRootsUpdater( openedScripts.forEach { PsiManager.getInstance(project).findFile(it)?.let { psiFile -> - DaemonCodeAnalyzer.getInstance(project).restart(psiFile) + if (psiFile is KtFile) { + // start loading for files that previously was cached by custom scripting support + ScriptConfigurationManager.getInstance(project).getConfiguration(psiFile) + + DaemonCodeAnalyzer.getInstance(project).restart(psiFile) + } } } } diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/MissingGradleScriptConfigurationNotificationProvider.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/MissingGradleScriptConfigurationNotificationProvider.kt index f7cb60b56eb..2231a93f45a 100644 --- a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/MissingGradleScriptConfigurationNotificationProvider.kt +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/MissingGradleScriptConfigurationNotificationProvider.kt @@ -39,7 +39,7 @@ class MissingGradleScriptConfigurationNotificationProvider(private val project: wasNotImportedAfterCreation -> EditorNotificationPanel().apply { text(KotlinIdeaGradleBundle.message("notification.wasNotImportedAfterCreation.text")) createActionLabel(getMissingConfigurationActionText()) { - linkProject(project) + runPartialGradleImport(project) } } notEvaluatedInLastImport -> EditorNotificationPanel().apply { diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/roots/GradleBuildRootsManager.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/roots/GradleBuildRootsManager.kt index 5f1a68c924f..a7efe624dd2 100644 --- a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/roots/GradleBuildRootsManager.kt +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/roots/GradleBuildRootsManager.kt @@ -19,6 +19,7 @@ import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch import org.jetbrains.kotlin.idea.core.script.ScriptConfigurationManager import org.jetbrains.kotlin.idea.core.script.configuration.CompositeScriptConfigurationManager +import org.jetbrains.kotlin.idea.core.script.configuration.DefaultScriptingSupport import org.jetbrains.kotlin.idea.core.script.configuration.ScriptingSupport import org.jetbrains.kotlin.idea.core.script.configuration.ScriptingSupport.Companion.EPN import org.jetbrains.kotlin.idea.core.script.ucache.ScriptClassRootsBuilder @@ -315,7 +316,7 @@ class GradleBuildRootsManager(val project: Project) : GradleBuildRootsLocator(), if (old is Imported && newRoot !is Imported) { removeData(old.pathPrefix) } - if (old is Imported || newRoot is Imported) { + if (old !is Legacy || newRoot !is Legacy) { updater.invalidateAndCommit() } @@ -366,6 +367,10 @@ class GradleBuildRootsManager(val project: Project) : GradleBuildRootsLocator(), if (project.isDisposed) return@launch openedScripts.forEach { + if (isApplicable(it)) { + DefaultScriptingSupport.getInstance(project).ensureNotificationsRemoved(it) + } + if (restartAnalyzer) { // this required only for "pause" state val ktFile = PsiManager.getInstance(project).findFile(it)