[AA] Add MODIFICATION_EVENT test directive
- This allows tests to specify which modification event they want to publish. - The modification event won't be published automatically. Tests need to invoke `publishModificationEventByDirective` at the right time. ^KT-56288
This commit is contained in:
committed by
Space Team
parent
7a5a1833e7
commit
040b7472a9
+80
@@ -0,0 +1,80 @@
|
|||||||
|
/*
|
||||||
|
* 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.test.framework.directives
|
||||||
|
|
||||||
|
import com.intellij.openapi.project.Project
|
||||||
|
import org.jetbrains.kotlin.analysis.project.structure.KtModule
|
||||||
|
import org.jetbrains.kotlin.analysis.providers.analysisMessageBus
|
||||||
|
import org.jetbrains.kotlin.analysis.providers.topics.KotlinModuleStateModificationKind
|
||||||
|
import org.jetbrains.kotlin.analysis.providers.topics.KotlinTopics
|
||||||
|
import org.jetbrains.kotlin.test.directives.model.SimpleDirectivesContainer
|
||||||
|
import org.jetbrains.kotlin.test.directives.model.singleValue
|
||||||
|
import org.jetbrains.kotlin.test.model.TestModule
|
||||||
|
import org.jetbrains.kotlin.test.testFramework.runWriteAction
|
||||||
|
|
||||||
|
object ModificationEventDirectives : SimpleDirectivesContainer() {
|
||||||
|
val MODIFICATION_EVENT by enumDirective<ModificationEventKind>(
|
||||||
|
description = "The modification event to be raised by the test.",
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
enum class ModificationEventKind {
|
||||||
|
MODULE_STATE_MODIFICATION,
|
||||||
|
MODULE_OUT_OF_BLOCK_MODIFICATION,
|
||||||
|
GLOBAL_MODULE_STATE_MODIFICATION,
|
||||||
|
GLOBAL_SOURCE_MODULE_STATE_MODIFICATION,
|
||||||
|
GLOBAL_SOURCE_OUT_OF_BLOCK_MODIFICATION,
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Publishes a modification event as defined in [KotlinTopics][org.jetbrains.kotlin.analysis.providers.topics.KotlinTopics] based on the
|
||||||
|
* [ModificationEventDirectives.MODIFICATION_EVENT] directive in a write action.
|
||||||
|
*
|
||||||
|
* The function expects exactly one `MODIFICATION_EVENT` directive to be present in the registered directives.
|
||||||
|
*
|
||||||
|
* @param module The module for which module-level modification events should be published, or `null` if only global modification events
|
||||||
|
* should be published. (Specifying a module-level modification event kind then raises an error.)
|
||||||
|
*/
|
||||||
|
fun TestModule.publishModificationEventByDirective(project: Project, module: KtModule?) {
|
||||||
|
val modificationEventKind = directives.singleValue(ModificationEventDirectives.MODIFICATION_EVENT)
|
||||||
|
|
||||||
|
publishModificationEventByKind(modificationEventKind, project, module)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun publishModificationEventByKind(modificationEventKind: ModificationEventKind, project: Project, module: KtModule?) {
|
||||||
|
runWriteAction {
|
||||||
|
when (modificationEventKind) {
|
||||||
|
ModificationEventKind.MODULE_STATE_MODIFICATION -> {
|
||||||
|
project.analysisMessageBus
|
||||||
|
.syncPublisher(KotlinTopics.MODULE_STATE_MODIFICATION)
|
||||||
|
.onModification(
|
||||||
|
module ?: errorModuleRequired(),
|
||||||
|
KotlinModuleStateModificationKind.UPDATE,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
ModificationEventKind.MODULE_OUT_OF_BLOCK_MODIFICATION -> {
|
||||||
|
project.analysisMessageBus
|
||||||
|
.syncPublisher(KotlinTopics.MODULE_OUT_OF_BLOCK_MODIFICATION)
|
||||||
|
.onModification(module ?: errorModuleRequired())
|
||||||
|
}
|
||||||
|
|
||||||
|
ModificationEventKind.GLOBAL_MODULE_STATE_MODIFICATION -> {
|
||||||
|
project.analysisMessageBus.syncPublisher(KotlinTopics.GLOBAL_MODULE_STATE_MODIFICATION).onModification()
|
||||||
|
}
|
||||||
|
|
||||||
|
ModificationEventKind.GLOBAL_SOURCE_MODULE_STATE_MODIFICATION -> {
|
||||||
|
project.analysisMessageBus.syncPublisher(KotlinTopics.GLOBAL_SOURCE_MODULE_STATE_MODIFICATION).onModification()
|
||||||
|
}
|
||||||
|
|
||||||
|
ModificationEventKind.GLOBAL_SOURCE_OUT_OF_BLOCK_MODIFICATION -> {
|
||||||
|
project.analysisMessageBus.syncPublisher(KotlinTopics.GLOBAL_SOURCE_OUT_OF_BLOCK_MODIFICATION).onModification()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun errorModuleRequired(): Nothing = error("Cannot publish a module-level modification event without a module.")
|
||||||
Reference in New Issue
Block a user