From 40f1bc8480dc4ba5e960d4a8c726c2e114a789be Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Fri, 11 Nov 2022 02:17:10 +0900 Subject: [PATCH] [Analysis API] Allow disabling sealed class inheritor searcher in tests Index-less implementation of sealed class inheritor searcher affects Java caches, making laziness work quite differently, comparing to IDEs. --- .../AnalysisApiFirLibrarySourceTestConfigurator.kt | 1 + .../fir/test/StandaloneModeConfigurator.kt | 1 + .../based/AbstractCompilerBasedTestForFir.kt | 1 + ...ClassesInheritorsCaclulatorPreAnalysisHandler.kt | 13 +++++++++++++ .../AnalysisApiFirSourceTestConfigurator.kt | 1 + 5 files changed, 17 insertions(+) diff --git a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/test/configurators/library/AnalysisApiFirLibrarySourceTestConfigurator.kt b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/test/configurators/library/AnalysisApiFirLibrarySourceTestConfigurator.kt index be9a64f3a5a..617b2a221de 100644 --- a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/test/configurators/library/AnalysisApiFirLibrarySourceTestConfigurator.kt +++ b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/test/configurators/library/AnalysisApiFirLibrarySourceTestConfigurator.kt @@ -41,6 +41,7 @@ object AnalysisApiFirLibrarySourceTestConfigurator : AnalysisApiTestConfigurator ) { builder.apply { useAdditionalServices(ServiceRegistrationData(CompiledLibraryProvider::class, ::CompiledLibraryProvider)) + useDirectives(SealedClassesInheritorsCaclulatorPreAnalysisHandler.Directives) usePreAnalysisHandlers(::SealedClassesInheritorsCaclulatorPreAnalysisHandler) } } diff --git a/analysis/analysis-api-standalone/tests/org/jetbrains/kotlin/analysis/api/standalone/fir/test/StandaloneModeConfigurator.kt b/analysis/analysis-api-standalone/tests/org/jetbrains/kotlin/analysis/api/standalone/fir/test/StandaloneModeConfigurator.kt index f63691fcd78..637070e03f5 100644 --- a/analysis/analysis-api-standalone/tests/org/jetbrains/kotlin/analysis/api/standalone/fir/test/StandaloneModeConfigurator.kt +++ b/analysis/analysis-api-standalone/tests/org/jetbrains/kotlin/analysis/api/standalone/fir/test/StandaloneModeConfigurator.kt @@ -24,6 +24,7 @@ object StandaloneModeConfigurator : AnalysisApiTestConfigurator() { override fun configureTest(builder: TestConfigurationBuilder, disposable: Disposable) { with(builder) { + useDirectives(SealedClassesInheritorsCaclulatorPreAnalysisHandler.Directives) usePreAnalysisHandlers(::SealedClassesInheritorsCaclulatorPreAnalysisHandler) } } diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/compiler/based/AbstractCompilerBasedTestForFir.kt b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/compiler/based/AbstractCompilerBasedTestForFir.kt index 16dd1c16b30..e5ff7772cab 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/compiler/based/AbstractCompilerBasedTestForFir.kt +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/compiler/based/AbstractCompilerBasedTestForFir.kt @@ -45,6 +45,7 @@ abstract class AbstractCompilerBasedTestForFir : AbstractCompilerBasedTest() { configureTest() defaultConfiguration(this) registerAnalysisApiBaseTestServices(disposable, FirLowLevelCompilerBasedTestConfigurator) + useDirectives(SealedClassesInheritorsCaclulatorPreAnalysisHandler.Directives) usePreAnalysisHandlers(::SealedClassesInheritorsCaclulatorPreAnalysisHandler) firHandlersStep { diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/compiler/based/SealedClassesInheritorsCaclulatorPreAnalysisHandler.kt b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/compiler/based/SealedClassesInheritorsCaclulatorPreAnalysisHandler.kt index 86ca87a193c..f4864e0ecfa 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/compiler/based/SealedClassesInheritorsCaclulatorPreAnalysisHandler.kt +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/compiler/based/SealedClassesInheritorsCaclulatorPreAnalysisHandler.kt @@ -19,6 +19,8 @@ import org.jetbrains.kotlin.fir.resolve.transformers.FirSealedClassInheritorsPro import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.psi.KtFile +import org.jetbrains.kotlin.test.directives.model.DirectiveApplicability +import org.jetbrains.kotlin.test.directives.model.SimpleDirectivesContainer import org.jetbrains.kotlin.test.services.PreAnalysisHandler import org.jetbrains.kotlin.test.services.TestModuleStructure import org.jetbrains.kotlin.test.services.TestServices @@ -35,6 +37,10 @@ class SealedClassesInheritorsCaclulatorPreAnalysisHandler( // In the actual IDE, SealedClassInheritorsProviderIdeImpl works by finding inheritors from the index instead of do a // preprocessing of all files. Therefore, the IDE does not rely on such a pre-analysis pass of all files in the module. override fun prepareSealedClassInheritors(moduleStructure: TestModuleStructure) { + if (Directives.DISABLE_SEALED_INHERITOR_CALCULATOR in moduleStructure.allDirectives) { + return + } + val ktFilesByModule = moduleStructure.modules.associateWith { testModule -> testServices.ktModuleProvider.getModuleFiles(testModule).filterIsInstance() } @@ -64,4 +70,11 @@ class SealedClassesInheritorsCaclulatorPreAnalysisHandler( firFiles.forEach { it.accept(inheritorsCollector, sealedClassInheritorsMap) } return sealedClassInheritorsMap.mapKeys { (firClass, _) -> firClass.symbol.classId } } + + object Directives : SimpleDirectivesContainer() { + val DISABLE_SEALED_INHERITOR_CALCULATOR by directive( + description = "Disable mock sealed class inheritor calculation", + applicability = DirectiveApplicability.Global + ) + } } diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/test/configurators/AnalysisApiFirSourceTestConfigurator.kt b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/test/configurators/AnalysisApiFirSourceTestConfigurator.kt index 42f759c161d..d3119dc9552 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/test/configurators/AnalysisApiFirSourceTestConfigurator.kt +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/test/configurators/AnalysisApiFirSourceTestConfigurator.kt @@ -29,6 +29,7 @@ class AnalysisApiFirSourceTestConfigurator(override val analyseInDependentSessio override fun configureTest(builder: TestConfigurationBuilder, disposable: Disposable) { builder.apply { + useDirectives(SealedClassesInheritorsCaclulatorPreAnalysisHandler.Directives) usePreAnalysisHandlers(::SealedClassesInheritorsCaclulatorPreAnalysisHandler) configureOptionalTestCompilerPlugin() }