testing
diff --git a/analysis/analysis-api-platform-interface/src/org/jetbrains/kotlin/analysis/api/platform/modification/KotlinModificationTopics.kt b/analysis/analysis-api-platform-interface/src/org/jetbrains/kotlin/analysis/api/platform/modification/KotlinModificationTopics.kt index b0902bc..055c5b5 100644 --- a/analysis/analysis-api-platform-interface/src/org/jetbrains/kotlin/analysis/api/platform/modification/KotlinModificationTopics.kt +++ b/analysis/analysis-api-platform-interface/src/org/jetbrains/kotlin/analysis/api/platform/modification/KotlinModificationTopics.kt
@@ -67,6 +67,9 @@ public val CODE_FRAGMENT_CONTEXT_MODIFICATION: Topic<KotlinCodeFragmentContextModificationListener> = Topic(KotlinCodeFragmentContextModificationListener::class.java, Topic.BroadcastDirection.TO_CHILDREN, true) + + public val SCRIPTS_STATE_MODIFICATION: Topic<KotlinScriptsStateModificationListener> = + Topic(KotlinScriptsStateModificationListener::class.java, Topic.BroadcastDirection.TO_CHILDREN, true) } /**
diff --git a/analysis/analysis-api-platform-interface/src/org/jetbrains/kotlin/analysis/api/platform/modification/KotlinScriptsStateModificationListener.kt b/analysis/analysis-api-platform-interface/src/org/jetbrains/kotlin/analysis/api/platform/modification/KotlinScriptsStateModificationListener.kt new file mode 100644 index 0000000..bfc081c --- /dev/null +++ b/analysis/analysis-api-platform-interface/src/org/jetbrains/kotlin/analysis/api/platform/modification/KotlinScriptsStateModificationListener.kt
@@ -0,0 +1,21 @@ +/* + * Copyright 2010-2023 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.analysis.api.platform.modification + +import org.jetbrains.kotlin.analysis.project.structure.KtModule + +public fun interface KotlinScriptsStateModificationListener { + /** + * [onModification] is invoked in a write action before or after global module state modification. + * + * The module structure, source code, and binary content of all [KtModule]s in the project should be considered modified when this event + * is received. This includes source files being moved or removed, binary content being added, removed, or changed, and modules possibly + * being removed. Thus, all caches related to module structure, source code, and binaries should be invalidated. + * + * @see KotlinModificationTopics + */ + public fun onModification() +}
diff --git a/analysis/low-level-api-fir/resources/META-INF/analysis-api/low-level-api-fir.xml b/analysis/low-level-api-fir/resources/META-INF/analysis-api/low-level-api-fir.xml index 0aaabc2..c4bb772 100644 --- a/analysis/low-level-api-fir/resources/META-INF/analysis-api/low-level-api-fir.xml +++ b/analysis/low-level-api-fir/resources/META-INF/analysis-api/low-level-api-fir.xml
@@ -67,5 +67,10 @@ class="org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.LLFirSessionInvalidationService$LLPsiModificationTrackerListener" topic="com.intellij.psi.util.PsiModificationTracker$Listener" /> + + <listener + class="org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.LLFirSessionInvalidationService$LLKotlinScriptsStateModificationListener" + topic="org.jetbrains.kotlin.analysis.api.platform.modification.KotlinScriptsStateModificationListener" + /> </projectListeners> </idea-plugin> \ No newline at end of file
diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirSessionInvalidationService.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirSessionInvalidationService.kt index 26949a3..eb989b5 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirSessionInvalidationService.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirSessionInvalidationService.kt
@@ -11,13 +11,7 @@ import org.jetbrains.kotlin.analysis.project.structure.* import org.jetbrains.kotlin.analysis.api.platform.projectStructure.KotlinAnchorModuleProvider import org.jetbrains.kotlin.analysis.api.platform.analysisMessageBus -import org.jetbrains.kotlin.analysis.api.platform.modification.KotlinCodeFragmentContextModificationListener -import org.jetbrains.kotlin.analysis.api.platform.modification.KotlinGlobalModuleStateModificationListener -import org.jetbrains.kotlin.analysis.api.platform.modification.KotlinGlobalSourceModuleStateModificationListener -import org.jetbrains.kotlin.analysis.api.platform.modification.KotlinGlobalSourceOutOfBlockModificationListener -import org.jetbrains.kotlin.analysis.api.platform.modification.KotlinModuleOutOfBlockModificationListener -import org.jetbrains.kotlin.analysis.api.platform.modification.KotlinModuleStateModificationKind -import org.jetbrains.kotlin.analysis.api.platform.modification.KotlinModuleStateModificationListener +import org.jetbrains.kotlin.analysis.api.platform.modification.* /** * [LLFirSessionInvalidationService] listens to [modification events][org.jetbrains.kotlin.analysis.api.platform.modification.KotlinModificationTopics] and invalidates [LLFirSession]s which depend on the @@ -69,6 +63,12 @@ } } + internal class LLKotlinScriptsStateModificationListener(val project: Project) : KotlinScriptsStateModificationListener { + override fun onModification() { + getInstance(project).invalidateScriptsSessions() + } + } + private val sessionCache: LLFirSessionCache by lazy { LLFirSessionCache.getInstance(project) } @@ -112,6 +112,8 @@ } } + private fun invalidateScriptsSessions() = sessionCache.removeAllScriptSessions() + private fun invalidateAll(includeLibraryModules: Boolean) { ApplicationManager.getApplication().assertWriteAccessAllowed()