[LL FIR] support script tests

This commit is contained in:
Dmitrii Gridin
2023-10-24 20:18:16 +02:00
committed by Space Team
parent cba9f1c559
commit 8e623ee73a
4 changed files with 38 additions and 18 deletions
@@ -53,6 +53,7 @@ val TestServices.ktModuleProvider: AnalysisApiKtModuleProvider by TestServices.t
fun List<KtModuleWithFiles>.associateByName(): Map<String, KtModuleWithFiles> {
return associateBy { (ktModule, _) ->
when (ktModule) {
is KtModuleByCompilerConfiguration -> ktModule.moduleName
is KtSourceModule -> ktModule.moduleName
is KtLibraryModule -> ktModule.libraryName
is KtLibrarySourceModule -> ktModule.libraryName
@@ -110,6 +110,16 @@ class KtSourceModuleByCompilerConfiguration(
TopDownAnalyzerFacadeForJVM.newModuleSearchScope(project, psiFiles.filterIsInstance<KtFile>())
}
class KtScriptModuleByCompilerConfiguration(
project: Project,
testModule: TestModule,
override val file: KtFile,
testServices: TestServices,
) : KtModuleByCompilerConfiguration(project, testModule, listOf(file), testServices), KtScriptModule {
override val ktModule: KtModule get() = this
override val contentScope: GlobalSearchScope get() = GlobalSearchScope.fileScope(file)
}
class KtLibraryModuleByCompilerConfiguration(
project: Project,
testModule: TestModule,
@@ -11,9 +11,10 @@ import org.jetbrains.kotlin.analysis.low.level.api.fir.api.DiagnosticCheckerFilt
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFirFile
import org.jetbrains.kotlin.analysis.low.level.api.fir.diagnostic.compiler.based.facades.LLFirAnalyzerFacadeFactory
import org.jetbrains.kotlin.analysis.low.level.api.fir.test.base.FirLowLevelCompilerBasedTestConfigurator
import org.jetbrains.kotlin.analysis.project.structure.KtModule
import org.jetbrains.kotlin.analysis.test.framework.AbstractCompilerBasedTest
import org.jetbrains.kotlin.analysis.test.framework.base.registerAnalysisApiBaseTestServices
import org.jetbrains.kotlin.analysis.test.framework.project.structure.KtSourceModuleByCompilerConfiguration
import org.jetbrains.kotlin.analysis.test.framework.project.structure.KtModuleByCompilerConfiguration
import org.jetbrains.kotlin.analysis.test.framework.project.structure.ktModuleProvider
import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.platform.jvm.JvmPlatforms
@@ -84,17 +85,16 @@ abstract class AbstractCompilerBasedTestForFir : AbstractCompilerBasedTest() {
private fun analyzeDependsOnModule(module: TestModule): FirOutputPartForDependsOnModule {
val moduleInfoProvider = testServices.ktModuleProvider
val ktModule = moduleInfoProvider.getModule(module.name) as KtSourceModuleByCompilerConfiguration
val ktModule = moduleInfoProvider.getModule(module.name) as KtModuleByCompilerConfiguration
val project = ktModule.project
val firResolveSession = LLFirResolveSessionService.getInstance(project).getFirResolveSessionNoCaching(ktModule)
val firResolveSession = LLFirResolveSessionService.getInstance(project).getFirResolveSessionNoCaching(ktModule as KtModule)
val allFirFiles =
module.files.filter { it.isKtFile }.zip(
ktModule.psiFiles
.filterIsInstance<KtFile>()
.map { psiFile -> psiFile.getOrBuildFirFile(firResolveSession) }
)
val allFirFiles = module.files.filter { it.isKtFile }.zip(
ktModule.psiFiles
.filterIsInstance<KtFile>()
.map { psiFile -> psiFile.getOrBuildFirFile(firResolveSession) }
)
val diagnosticCheckerFilter = if (FirDiagnosticsDirectives.WITH_EXTENDED_CHECKERS in module.directives) {
DiagnosticCheckerFilter.EXTENDED_AND_COMMON_CHECKERS
@@ -7,20 +7,23 @@ package org.jetbrains.kotlin.analysis.low.level.api.fir.test.base
import com.intellij.openapi.Disposable
import com.intellij.openapi.project.Project
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfigurator
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestServiceRegistrar
import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder
import org.jetbrains.kotlin.test.services.TestModuleStructure
import org.jetbrains.kotlin.test.services.TestServices
import org.jetbrains.kotlin.analysis.api.impl.base.test.configurators.AnalysisApiBaseTestServiceRegistrar
import org.jetbrains.kotlin.analysis.api.impl.base.test.configurators.AnalysisApiDecompiledCodeTestServiceRegistrar
import org.jetbrains.kotlin.analysis.api.impl.base.test.configurators.AnalysisApiScriptTestServiceRegistrar
import org.jetbrains.kotlin.analysis.api.standalone.base.project.structure.KtModuleProjectStructure
import org.jetbrains.kotlin.analysis.api.standalone.base.project.structure.KtModuleWithFiles
import org.jetbrains.kotlin.analysis.project.structure.KtBinaryModule
import org.jetbrains.kotlin.analysis.project.structure.allDirectDependenciesOfType
import org.jetbrains.kotlin.analysis.test.framework.project.structure.KtScriptModuleByCompilerConfiguration
import org.jetbrains.kotlin.analysis.test.framework.project.structure.KtSourceModuleByCompilerConfiguration
import org.jetbrains.kotlin.analysis.test.framework.project.structure.TestModuleStructureFactory
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfigurator
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestServiceRegistrar
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.FrontendKind
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder
import org.jetbrains.kotlin.test.services.TestModuleStructure
import org.jetbrains.kotlin.test.services.TestServices
object FirLowLevelCompilerBasedTestConfigurator : AnalysisApiTestConfigurator() {
override val analyseInDependentSession: Boolean get() = false
@@ -35,6 +38,7 @@ object FirLowLevelCompilerBasedTestConfigurator : AnalysisApiTestConfigurator()
AnalysisApiBaseTestServiceRegistrar,
AnalysisApiDecompiledCodeTestServiceRegistrar,
AnalysisApiFirTestServiceRegistrar,
AnalysisApiScriptTestServiceRegistrar,
)
override fun createModules(
@@ -44,11 +48,16 @@ object FirLowLevelCompilerBasedTestConfigurator : AnalysisApiTestConfigurator()
): KtModuleProjectStructure {
val mainModules = moduleStructure.modules.map { testModule ->
val files = TestModuleStructureFactory.createSourcePsiFiles(testModule, testServices, project)
KtModuleWithFiles(
KtSourceModuleByCompilerConfiguration(project, testModule, files, testServices),
files
)
val scriptFile = files.singleOrNull() as? KtFile
val ktModule = if (scriptFile?.isScript() == true) {
KtScriptModuleByCompilerConfiguration(project, testModule, scriptFile, testServices)
} else {
KtSourceModuleByCompilerConfiguration(project, testModule, files, testServices)
}
KtModuleWithFiles(ktModule, files)
}
return KtModuleProjectStructure(
mainModules = mainModules,
binaryModules = mainModules.asSequence().flatMap { it.ktModule.allDirectDependenciesOfType<KtBinaryModule>() }.asIterable(),