[AA] Enable test-specific configuration of write access permissions

- In general, Analysis API tests forbid write access because the
  Analysis API should not be used from write actions. However, in some
  cases we might want tests to e.g. modify PSI, which requires write
  access. This change allows `AnalysisApiTestConfigurator`s to enable
  write access for the specific test.
This commit is contained in:
Marco Pennekamp
2023-11-13 15:17:59 +01:00
committed by Space Team
parent 6189d68c3c
commit 03a7162f37
7 changed files with 108 additions and 32 deletions
@@ -26,7 +26,7 @@ fun TestConfigurationBuilder.registerAnalysisApiBaseTestServices(
) {
useAdditionalService<TestDisposableProvider>(::TestDisposableProviderImpl)
useAdditionalService<AnalysisApiKtModuleProvider>(::AnalysisApiKtModuleProviderImpl)
useAdditionalService<AnalysisApiEnvironmentManager>(::AnalysisApiEnvironmentManagerImpl.bind(testDisposable))
useAdditionalService<AnalysisApiEnvironmentManager>(::AnalysisApiEnvironmentManagerImpl.bind(testDisposable, configurator))
useAdditionalService<ApplicationDisposableProvider> { ExecutionListenerBasedDisposableProvider() }
useAdditionalService<KotlinStandardLibrariesPathProvider> { StandardLibrariesPathProviderForKotlinProject }
@@ -12,7 +12,9 @@ import org.jetbrains.kotlin.analysis.api.standalone.base.project.structure.KtSta
import org.jetbrains.kotlin.analysis.api.standalone.base.project.structure.StandaloneProjectFactory
import org.jetbrains.kotlin.analysis.project.structure.KtBuiltinsModule
import org.jetbrains.kotlin.analysis.test.framework.project.structure.ktModuleProvider
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfigurator
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreApplicationEnvironment
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreApplicationEnvironmentMode
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreProjectEnvironment
import org.jetbrains.kotlin.config.JVMConfigurationKeys
import org.jetbrains.kotlin.config.languageVersionSettings
@@ -38,12 +40,13 @@ abstract class AnalysisApiEnvironmentManager : TestService {
class AnalysisApiEnvironmentManagerImpl(
override val testServices: TestServices,
override val testRootDisposable: Disposable,
private val configurator: AnalysisApiTestConfigurator,
) : AnalysisApiEnvironmentManager() {
private val _projectEnvironment: KotlinCoreProjectEnvironment by lazy {
StandaloneProjectFactory.createProjectEnvironment(
testRootDisposable,
testServices.applicationDisposableProvider.getApplicationRootDisposable(),
unitTestMode = true
KotlinCoreApplicationEnvironmentMode.UnitTest(configurator.isWriteAccessAllowed),
)
}
@@ -36,6 +36,15 @@ abstract class AnalysisApiTestConfigurator {
abstract val serviceRegistrars: List<AnalysisApiTestServiceRegistrar>
/**
* Whether the associated [core application environment][org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreApplicationEnvironment] should
* permit write access.
*
* Write access is disabled by default because the Analysis API should not be used during write actions. Nevertheless, some tests may
* need write access, for example to modify PSI.
*/
open val isWriteAccessAllowed get() = false
open fun prepareFilesInModule(files: List<PsiFile>, module: TestModule, testServices: TestServices) {}
open fun doGlobalModuleStateModification(project: Project) {