[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> { fun List<KtModuleWithFiles>.associateByName(): Map<String, KtModuleWithFiles> {
return associateBy { (ktModule, _) -> return associateBy { (ktModule, _) ->
when (ktModule) { when (ktModule) {
is KtModuleByCompilerConfiguration -> ktModule.moduleName
is KtSourceModule -> ktModule.moduleName is KtSourceModule -> ktModule.moduleName
is KtLibraryModule -> ktModule.libraryName is KtLibraryModule -> ktModule.libraryName
is KtLibrarySourceModule -> ktModule.libraryName is KtLibrarySourceModule -> ktModule.libraryName
@@ -110,6 +110,16 @@ class KtSourceModuleByCompilerConfiguration(
TopDownAnalyzerFacadeForJVM.newModuleSearchScope(project, psiFiles.filterIsInstance<KtFile>()) 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( class KtLibraryModuleByCompilerConfiguration(
project: Project, project: Project,
testModule: TestModule, 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.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.diagnostic.compiler.based.facades.LLFirAnalyzerFacadeFactory
import org.jetbrains.kotlin.analysis.low.level.api.fir.test.base.FirLowLevelCompilerBasedTestConfigurator 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.AbstractCompilerBasedTest
import org.jetbrains.kotlin.analysis.test.framework.base.registerAnalysisApiBaseTestServices 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.analysis.test.framework.project.structure.ktModuleProvider
import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.platform.jvm.JvmPlatforms import org.jetbrains.kotlin.platform.jvm.JvmPlatforms
@@ -84,17 +85,16 @@ abstract class AbstractCompilerBasedTestForFir : AbstractCompilerBasedTest() {
private fun analyzeDependsOnModule(module: TestModule): FirOutputPartForDependsOnModule { private fun analyzeDependsOnModule(module: TestModule): FirOutputPartForDependsOnModule {
val moduleInfoProvider = testServices.ktModuleProvider 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 project = ktModule.project
val firResolveSession = LLFirResolveSessionService.getInstance(project).getFirResolveSessionNoCaching(ktModule) val firResolveSession = LLFirResolveSessionService.getInstance(project).getFirResolveSessionNoCaching(ktModule as KtModule)
val allFirFiles = val allFirFiles = module.files.filter { it.isKtFile }.zip(
module.files.filter { it.isKtFile }.zip( ktModule.psiFiles
ktModule.psiFiles .filterIsInstance<KtFile>()
.filterIsInstance<KtFile>() .map { psiFile -> psiFile.getOrBuildFirFile(firResolveSession) }
.map { psiFile -> psiFile.getOrBuildFirFile(firResolveSession) } )
)
val diagnosticCheckerFilter = if (FirDiagnosticsDirectives.WITH_EXTENDED_CHECKERS in module.directives) { val diagnosticCheckerFilter = if (FirDiagnosticsDirectives.WITH_EXTENDED_CHECKERS in module.directives) {
DiagnosticCheckerFilter.EXTENDED_AND_COMMON_CHECKERS 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.Disposable
import com.intellij.openapi.project.Project 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.AnalysisApiBaseTestServiceRegistrar
import org.jetbrains.kotlin.analysis.api.impl.base.test.configurators.AnalysisApiDecompiledCodeTestServiceRegistrar 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.KtModuleProjectStructure
import org.jetbrains.kotlin.analysis.api.standalone.base.project.structure.KtModuleWithFiles 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.KtBinaryModule
import org.jetbrains.kotlin.analysis.project.structure.allDirectDependenciesOfType 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.KtSourceModuleByCompilerConfiguration
import org.jetbrains.kotlin.analysis.test.framework.project.structure.TestModuleStructureFactory 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.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() { object FirLowLevelCompilerBasedTestConfigurator : AnalysisApiTestConfigurator() {
override val analyseInDependentSession: Boolean get() = false override val analyseInDependentSession: Boolean get() = false
@@ -35,6 +38,7 @@ object FirLowLevelCompilerBasedTestConfigurator : AnalysisApiTestConfigurator()
AnalysisApiBaseTestServiceRegistrar, AnalysisApiBaseTestServiceRegistrar,
AnalysisApiDecompiledCodeTestServiceRegistrar, AnalysisApiDecompiledCodeTestServiceRegistrar,
AnalysisApiFirTestServiceRegistrar, AnalysisApiFirTestServiceRegistrar,
AnalysisApiScriptTestServiceRegistrar,
) )
override fun createModules( override fun createModules(
@@ -44,11 +48,16 @@ object FirLowLevelCompilerBasedTestConfigurator : AnalysisApiTestConfigurator()
): KtModuleProjectStructure { ): KtModuleProjectStructure {
val mainModules = moduleStructure.modules.map { testModule -> val mainModules = moduleStructure.modules.map { testModule ->
val files = TestModuleStructureFactory.createSourcePsiFiles(testModule, testServices, project) val files = TestModuleStructureFactory.createSourcePsiFiles(testModule, testServices, project)
KtModuleWithFiles( val scriptFile = files.singleOrNull() as? KtFile
KtSourceModuleByCompilerConfiguration(project, testModule, files, testServices), val ktModule = if (scriptFile?.isScript() == true) {
files KtScriptModuleByCompilerConfiguration(project, testModule, scriptFile, testServices)
) } else {
KtSourceModuleByCompilerConfiguration(project, testModule, files, testServices)
}
KtModuleWithFiles(ktModule, files)
} }
return KtModuleProjectStructure( return KtModuleProjectStructure(
mainModules = mainModules, mainModules = mainModules,
binaryModules = mainModules.asSequence().flatMap { it.ktModule.allDirectDependenciesOfType<KtBinaryModule>() }.asIterable(), binaryModules = mainModules.asSequence().flatMap { it.ktModule.allDirectDependenciesOfType<KtBinaryModule>() }.asIterable(),